Nghiên cứu phương pháp xác định mức độ tương tự giữa các mã nguồn dựa vào cây cú pháp TT

26 3 0
Nghiên cứu phương pháp xác định mức độ tương tự giữa các mã nguồn dựa vào cây cú pháp TT

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

1 HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG - Luận văn hồn thành tại: HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG Người hướng dẫn khoa học: TS NGUYỄNNAM DUY PHƯƠNG NGUYỄN THÀNH (Ghi rõ học hàm, học vị) NGHIÊN CỨU PHƯƠNG PHÁP XÁC ĐỊNH MỨC ĐỘ TƯƠNG TỰ GIỮA CÁC MÃ NGUỒN DỰA VÀO CÂY CÚ PHÁP Phản biện 1: PGS.TS Nguyễn Hữu Quỳnh Chuyên ngành: HỆ THỐNG THÔNG TIN số: Quốc 8.48.01.04 Phản biện 2: Mã TS Ngơ Dũng TĨM TẮT LUẬN VĂN THẠC SĨ Luận văn bảo vệ trước Hội đồng chấm luận văn thạc sĩ Học viện Cơng nghệ Bưu Viễn thơng HÀ NỘI - NĂM 2022 Vào lúc: … … ngày … tháng … năm 2022 MỞ ĐẦU Lý chọn đề tài Có thể tìm hiểu luận văn tại: - Thư viện Học viện Công nghệ Bưu Viễn thơng Theo thời gian, lượng tài liệu tạo ra, lưu trữ chia sẻ Internet ngày nhiều Tuy có nhiều thuận lợi cho việc tiếp cận kho tri thức mở, rõ ràng nảy sinh nhiều vấn đề: ý tưởng, đoạn văn chí tồn văn chép cách tràn lan mà khơng có thích nguồn hay tác giả Điều khơng ảnh hưởng đến quyền sở hữu trí tuệ, quyền tác giả mà ảnh hưởng đến việc đánh giá chất lượng tài liệu báo cáo, tiểu luận, luận văn trình độ người tạo chúng, đặc biệt mơi trường giáo dục nói chung đại học nói riêng Ngồi lĩnh vực giáo dục đào tạo, việc chép mã nguồn có ảnh hưởng định tới chất lượng đào tạo nhân lực Công nghệ thông tin Vấn đề phổ biến nhiều trường đại học giới, trường đại học Việt Nam ngoại lệ Các sinh viên chép mã nguồn sinh viên khác sau sửa chữa vài điểm để chuyển thành sản phẩm So với việc chép luận, đề tài, nghiên cứu khoa học mà hình thức biểu dạng ngôn ngữ văn thông thường, việc chép mã nguồn lập trình có nhiều điểm khác biệt đặc thù Để giải thực trạng này, giới có nhiều phần mềm phát triển để đánh giá tương tự mã nguồn Việc nghiên cứu phương pháp để tối ưu việc phát việc chép mã nguồn toán thực thú vị có nhiều ý nghĩa ứng dụng thực tiễn Như thấy, thực trạng chép mã nguồn xuất ngành công nghiệp phát triển phần mềm công tác đào tạo sinh viên ngành công nghệ thông tin Phạm vi nghiên cứu đề tài tập trung sâu vào vấn đề chép mã nguồn công tác đào tạo sinh viên ngành công nghệ thông tin giảng đường CHƯƠNG 1: TỔNG QUAN VỀ BÀI TOÁN ĐÁNH GIÁ MỨC ĐỘ TƯƠNG TỰ GIỮA CÁC MÃ NGUỒN 1.1 Tổng quan chép sử dụng lại mã nguồn 1.1.1 Vấn đề chép sử dụng lại mã nguồn Lập trình viên thời đại ngày tiếp cận với lượng tài nguyên khổng lồ gần không giới hạn Nếu trước kia, tài liệu ngôn ngữ lập trình hay hỗ trợ từ cộng đồng hạn chế, ngày nay, cộng đồng lập trình tồn giới (stackoverflow, github…) cho phép lập trình viên nhanh chóng học hỏi tận dụng lại tri thức từ người trước Đôi toán trước cần nhiều thời gian suy nghĩ, ngày lập trình viên trước chia sẻ công khai, cần chép đưa vào dự án Giờ việc tiếp cận ngơn ngữ lập trình mới, thư viện/framework có độ trưởng thành cao cộng đồng chia sẻ, giúp cho sinh viên dù chưa có nhiều kinh nghiệm dễ dàng xây dựng nên phần mềm tương đối hoàn chỉnh Việc rút ngắn thời gian tạo sản phẩm, nhiên điều làm giảm khả sáng tạo, đào sâu tìm tịi giải pháp sinh viên Trong yếu tố quan trọng giai đoạn sinh viên công nghệ thông tin đào tạo trường 1.1.2 Những tác động chép sử dụng lại mã nguồn Việc chép, sử dụng lại mã nguồn có nhược điểm định cần quan tâm Đối với cơng tác đào tạo: • Giảm khả sáng tạo sinh viên: từ giảm chất lượng cơng tác đào tạo • Kết đào tạo khơng khách quan: từ giáo viên khó đánh giá chất lượng kết đào tạo để đưa phương hướng, điều chỉnh cho nội dung giảng dạy Đối với quy trình phát triển phần mềm: • Tăng khả lỗi tiềm ẩn đoạn mã nguồn giống nhau, từ gây khó khăn cho cơng tác bảo trì, phát triển mở rộng • Gây khó khăn cho cơng tác tối ưu mã nguồn, đoạn mã nguồn tương tự lặp lặp lại ứng dụng 1.1.3 Ý nghĩa việc đánh giá mức độ tương tự mã nguồn Đối với cơng tác đào tạo: • Phát chép • Phân tích đánh giá Đối với quy trình phát triển phần mềm: • Phân tích cải tiến hiệu đoạn mã nguồn tương tự • Tìm đoạn mã nguồn khơng tốt • Phát chép mã nguồn mà không phép 1.1.4 Giới thiệu kiểu chép mã nguồn phổ biến Dưới danh sách số kiểu chép mã nguồn phổ biến, liệt kê theo thứ tự từ đơn giản đến phức tạp: Thay đổi định dạng thêm/sửa “comment code” (ghi chú) Thay đổi tên hàm biến Thay đổi thứ tự toán hạng biểu thức Thay đổi kiểu liệu biến Thay biểu thức biểu thức tương đương Thêm đoạn code dư thừa (deadcode) Thay đổi thứ tự đoạn mã nguồn độc lập Thay đổi vòng lặp vòng lặp khác Thay đổi cấu trúc câu lệnh lựa chọn 10 Thay việc gọi hàm nội dung hàm 11 Kết hợp mã nguồn chép với mã nguồn thân 1.2 Đề xuất tiêu chí đánh giá mức độ tương tự mã nguồn 1.2.1 Khái niệm ma trận nhầm lẫn (Confusion Matrix) Confusion Matrix hay gọi Ma trận nhầm lẫn, ma trận lỗi (Kohavi Procot, 1998) bố cục bảng cụ thể cho phép hình dung hiệu suất hệ thống phân loại Hãy xem xét ví dụ thực tế đây: Vào ngày đó, Bệnh viện A có 100 bệnh nhân đến khám bệnh, giả sử thực tế 100 bệnh nhân có 60 người mắc bệnh, 40 người khơng có bệnh Sau thăm khám, bệnh viện đưa kết quả: • Trong 60 người có bệnh thật gồm: o 50 người chẩn đốn có bệnh o 10 người chẩn đốn khơng mắc bệnh • Trong 40 người khơng có bệnh gồm: o 25 người chẩn đốn khơng mắc bệnh o 15 người chẩn đoán mắc bệnh Bảng 1.1: Kết ma trận nhầm lẫn sau chẩn đốn Dương tính (P) Âm tính (N) Dương tính TP (50) FP (15) Âm tính FN (10) TN (25) Từ ma trận này, ta có số thuật ngữ sau: • Condition positive (P): Tổng số ca dương tính thực tế • Condition Negative (N: Tổng số ca âm tính thực tế • True positive (TP): Số ca dự đốn dương tính hay dương tính thật • True negative (TN): Số ca dự đốn âm tính hay âm tính thật • False positive (FP): Số ca dự đốn dương tính sai hay dương tính giả • False negative (FN):: Số ca dự đốn âm tính sai hay âm tính giả Để đánh giá kết khám bệnh của bệnh viện trên, có số đánh giá quan trọng sau: • Độ xác ACC (Accuracy) • Độ nhạy TPR (True Positive Rate - Tỷ lệ dương tính thực) • FPR (False Positive Rate - Tỷ lệ dương tính giả) • Độ đặc hiệu (Độ đặc trưng) 1.2.2 Biểu diễn đường cong ROC Khi biểu diễn số TPR FPR đồ thị với trục tung TPR trục hồnh FPR, có khái niệm không gian ROC Bảng 1.2: So sánh kết phép đánh giá chẩn đoán A B C D TP 63 77 24 76 FP 28 77 88 12 FN 37 23 76 24 TN 72 23 12 88 TPR 0,63 0,77 0,24 0,76 FPR 0,28 0,77 0,88 0,12 ACC 0,68 0,50 0,18 0,82 Theo kết thu sau: Hình 1.1: Khơng gian ROC Những phép dự đốn cho kết nằm phía đường chéo đánh giá có kết tốt so với phép dự đoán cho kết nằm đường chéo, phép đo có kết gần với đỉnh bên trái (0,1) tiệm cận tới phép đo “hồn hảo” Hình 1.2: Đường cong ROC 1.3 Đề xuất phương pháp đánh giá mức độ tương tự mã nguồn 1.3.1 Tổng quan công nghệ so sánh mã nguồn phổ biến Dựa phân tích văn túy (string-based): Mã nguồn chuyển thành chuỗi liên tiếp ký tự Hai mã nguồn coi tương tự chúng bao gồm chuỗi ký tự giống Thuật tốn sử dụng cơng nghệ thuật tốn tìm chuỗi dài (LCS) Dựa phân tích chuỗi ký tự đại diện (token-based): Công nghệ cải tiến từ việc phân tích mã nguồn dựa văn túy trình bày phía Mã nguồn chương trình lúc tách từ thành chuỗi token, sau thực quét kiểm tra chuỗi token trùng để xác định khả xảy lặp, chép mã nguồn Tuy nhiên công cụ có nhược điểm khơng thể phát mã nguồn có thay đổi thay đổi tên hàm, biến, thứ tự đoạn code độc lập, hay chèn thêm đoạn code vô nghĩa Dựa cấu trúc (tree-based): Đây công nghệ đề cập phát triển nhanh năm gần Việc so sánh mã nguồn dựa cấu trúc hướng hợp lý, mà cách hay cách khác để loại bỏ ảnh hưởng thao tác như: đổi tên hàm, tên biến, thứ tự code… Do ưu điểm phương pháp tiếp cận này, nên thuật toán luận văn tập trung vào việc phân tích mã nguồn dựa cấu trúc Dựa biểu đồ phụ thuộc (Program Dependence Graph - PDG): Một số nghiên cứu thủ thuật chép mã nguồn không làm thay đổi nhiều biểu đồ phụ thuộc mã nguồn gốc 1.3.2 Khái niệm cú pháp trừu tượng (AST, abstract syntax tree) Trong ngành khoa học máy tính, cú pháp trừu tượng (AST, abstract syntax tree), cấu trúc liệu sử dụng rộng rãi trình biên dịch, AST thường kết giai đoạn phân tích cú pháp trình biên dịch Hãy xem xét ví dụ đoạn mã nguồn sau (ngơn ngữ C++): void fun1(){ int a = 2; int b = 5; fun2(a, b); } Về đoạn mã nguồn có AST sau: Hình 1.3: Cây cú pháp trừu tượng mã nguồn hàm func 1.3.3 Các phần mềm sinh cú pháp AST Mỗi ngơn ngữ lập trình có cơng cụ complier khác (ví dụ Java có Java Complier Complier – JavaCC JJTree, Javascript có JIT, C++ có GCC Clang Tương ứng với cơng cụ này, có công cụ xây dựng cú pháp AST khác Trong phạm vi luận văn này, tập trung vào ngơn ngữ C++ nên chọn lựa trình biên dịch Clang khung biên dịch LLVM để phục vụ cho việc xây dựng AST từ mã nguồn viết ngôn ngữ C++ Dưới số thông tin tổng quan LLVM Clang 1.3.4 Tổng quan LLVM (Low-Level Virtual Machine) LLVM khung biên dịch (compiler framework) sử dụng để tối ưu hóa mã cho nhiều ngơn ngữ lập trình khác Nó cung cấp cơng cụ mạnh mẽ để xây dựng phần front-end (parser, lexer) phần backend (phần chuyển phần code trung gian LLVM sang mã máy), cho ngơn ngữ lập trình 1.3.5 Tổng quan Clang Clang trình biên dịch (compiler front-end) sử dụng sở hạ tầng trình biên dịch LLVM cho ngơn ngữ lập trình C, C ++, Objective-C Objective-C ++ Đặc điểm mục tiêu Clang: • Đối với Người dùng cuối: o Biên dịch nhanh sử dụng nhớ o Chẩn đốn nhanh (ví dụ) o GCC tương thích • Đối với Tiện ích Ứng dụng: o Kiến trúc mơ đun hóa o Hỗ trợ đa dạng “client” (tái cấu trúc, phân tích tĩnh, tạo mã, v.v.) o Cho phép tích hợp chặt chẽ với IDE o Sử dụng Giấy phép LLVM Apache • Thiết kế nội Triển khai: o Trình biên dịch chất lượng áp dụng áp dụng vào thực tiễn o Một sở mã nguồn đơn giản dễ hiểu, dễ tùy biến o Một trình phân tích cú pháp hợp cho ngôn ngữ C, Objective C, C ++ Objective C ++ o Tuân thủ C / C ++ / ObjC biến thể chúng Hình 1.4: Các pha trình biên dịch CLang Các cách sử dụng Clang • Cài đặt sử dụng trực tiếp Clang thông qua thư viện mà Clang công khai trang chủ địa chỉ: https://clang.llvm.org/get_started.html Lưu ý việc triển khai phụ thuộc môi trường cài đặt máy tính • Cài đặt sử dụng gián tiếp thơng qua API thư viện tích hợp LibClang ngơn ngữ lập trình phổ biến (Python) Đây cách triển khai nội dung luận văn 1.3.6 Sử dụng Clang với Python Python ngơn ngữ lập trình phổ biến cộng đồng hỗ trợ nhiều năm gần Thông qua API thư viện LibClang Python, sử dụng cách dễ dàng đảm bảo tương đối đầy đủ thao tác AST Hãy xem xét AST tạo tương ứng với đoạn mã nguồn phần 1.3.2 LibClang, thể dạng sau: Hình 1.5: Hiển thị AST sinh mã nguồn 1.4 So sánh AST áp dụng thủ thuật chép khác Mã nguồn gốc để sử dụng cho mục tập xây dựng hàm tính chuỗi Fibonacci: #include #include int Fibonacci(int n){ if (n == || n == 2) return 1; return Fibonacci(n - 1) + Fibonacci(n - 2); } 1.4.1 Thay đổi định dạng thêm/sửa “comment code” Do đặc tính cú pháp trừu tượng AST, khoảng trắng ghi (comment code) bị loại bỏ trình biên dịch xây dựng AST, việc thay đổi định dạng ghi không làm ảnh hưởng tới cấu trúc AST 1.4.2 Đổi tên định danh (hàm, tham số biến) Với thủ thuật chép này, so sánh cấu trúc AST, cần bỏ qua giá trị node, sử dụng loại node cấu trúc AST để so sánh Khi cấu trúc AST mã nguồn gốc mã nguồn sửa đổi tương đương 1.4.3 Thay đổi thứ tự toán hạng biểu thức Một thủ thuật khác tương đối dễ thực đảm bảo không làm thay đổi tính đắn chương trình thay đổi thứ tự toán hạng biểu thức Ví dụ thay đổi biểu thức mã nguồn sau: chuyển thành void fun1(int n){ return n * + 3; } void fun1(int n){ return + * n; } Chúng ta thu AST tương ứng sau: 10  Hình 1.6: Cây AST sinh sau thay đổi thứ tự toán hạng Có thể thấy hai AST bắt nguồn từ node BINARY_OPERATOR (+) đổi vị trí cho (node trái  node phải, node phải  node trái) Tương tự với node BINARY_OPERATOR (*) 1.4.4 Thay đổi kiểu liệu (data types) Một thủ thuật khác thường áp dụng thay đổi kiểu liệu nhóm Việc thay đổi hồn tồn khơng làm thay đổi cấu trúc type node AST 1.4.5 Thay biểu thức tương đương Trong cú pháp AST, loại toán tử biểu diễn tương ứng loại node AST, toán tử logic, toán tử quy chiếu,… quy chung loại BINARY_OPERATOR 1.4.6 Bổ sung đoạn mã nguồn khơng có giá trị (dead-code) chuyển thành void func3(n){ if ( n == ) { return; } } boolean debug = false ; void func4(n){ if ( n == ) { if(debug){ cout

Ngày đăng: 11/08/2022, 20:15

Tài liệu cùng người dùng

Tài liệu liên quan