Tổng quan nghiên cứu
Trong bối cảnh cuộc cách mạng công nghiệp 4.0 và sự phát triển vượt bậc của công nghệ thông tin, việc sao chép và sử dụng lại mã nguồn trở thành một vấn đề nổi bật trong ngành công nghiệp phần mềm và giáo dục đào tạo. Theo ước tính, lượng tài liệu và mã nguồn được chia sẻ trên Internet ngày càng tăng, tạo điều kiện thuận lợi cho việc học hỏi và phát triển phần mềm nhưng cũng dẫn đến nhiều hệ quả tiêu cực như vi phạm bản quyền, giảm chất lượng đào tạo và khó khăn trong bảo trì phần mềm. Đặc biệt, trong môi trường đào tạo sinh viên ngành Công nghệ thông tin, việc sao chép mã nguồn không chỉ ảnh hưởng đến chất lượng học tập mà còn làm giảm khả năng sáng tạo và đánh giá khách quan của giảng viên.
Mục tiêu nghiên cứu của luận văn là phát triển và đánh giá các phương pháp xác định mức độ tương tự giữa các mã nguồn dựa trên cây cú pháp trừu tượng (AST) nhằm hỗ trợ phát hiện sao chép mã nguồn trong đào tạo và phát triển phần mềm. Nghiên cứu tập trung vào ngôn ngữ lập trình C++ và sử dụng bộ công cụ Clang trong khung biên dịch LLVM để xây dựng cây AST. Phạm vi nghiên cứu thực hiện trong giai đoạn 2020-2022 tại Hà Nội, với dữ liệu thu thập từ các bộ mã nguồn đã gán nhãn và chưa phân loại.
Ý nghĩa của nghiên cứu được thể hiện qua việc cung cấp công cụ hỗ trợ giảng viên phát hiện sao chép, giúp lập trình viên tối ưu hóa mã nguồn, đồng thời góp phần nâng cao chất lượng đào tạo và phát triển phần mềm. Các chỉ số đánh giá như độ chính xác (ACC), độ nhạy (TPR) và tỷ lệ dương tính giả (FPR) được sử dụng để đo lường hiệu quả của các phương pháp đề xuất.
Cơ sở lý thuyết và phương pháp nghiên cứu
Khung lý thuyết áp dụng
Luận văn dựa trên các lý thuyết và mô hình sau:
Cây cú pháp trừu tượng (AST - Abstract Syntax Tree): Là cấu trúc dữ liệu biểu diễn cấu trúc ngữ nghĩa của mã nguồn, được sử dụng rộng rãi trong trình biên dịch để phân tích cú pháp và ngữ nghĩa. AST giúp loại bỏ các yếu tố không ảnh hưởng đến cấu trúc như khoảng trắng, chú thích, từ đó tập trung vào cấu trúc logic của mã nguồn.
Phương pháp tìm xâu con chung dài nhất (LCS - Longest Common Subsequence): Thuật toán quy hoạch động được áp dụng để tìm chuỗi con dài nhất chung giữa hai chuỗi đại diện cho hai cây AST, từ đó đánh giá mức độ tương tự.
TF-IDF và độ tương tự Cosin: Phương pháp thống kê đánh giá tần suất xuất hiện của các thành phần trong cây AST, kết hợp với mô hình không gian vector để tính toán độ tương tự giữa hai mã nguồn.
AST-CC (AST Code Comparison): Thuật toán dựa trên việc tính toán mã hash tại các nút của cây AST để so sánh cấu trúc và nội dung mã nguồn một cách hiệu quả.
Các khái niệm chuyên ngành như ma trận nhầm lẫn (Confusion Matrix), đường cong ROC (Receiver Operating Characteristic), và các thuật toán xử lý cây AST được sử dụng để đánh giá và so sánh hiệu quả các phương pháp.
Phương pháp nghiên cứu
Nguồn dữ liệu nghiên cứu bao gồm các bộ mã nguồn viết bằng C++ được thu thập từ môi trường đào tạo và các dự án phần mềm, trong đó có dữ liệu đã được gán nhãn phân loại và dữ liệu chưa phân loại. Cỡ mẫu khoảng 16 bộ mã nguồn được sử dụng để thực nghiệm.
Phương pháp nghiên cứu gồm các bước chính:
Tiền xử lý cây AST: Sử dụng thư viện LibClang trên Python để xây dựng cây AST từ mã nguồn, sau đó thực hiện gộp thông tin các nút, tính mã hash (đối với AST-CC) và chuyển đổi cây AST thành chuỗi để thuận tiện cho việc so sánh.
Phân tích và so sánh mã nguồn: Áp dụng ba thuật toán chính gồm LCS, TF-IDF kết hợp độ tương tự Cosin, và AST-CC để đánh giá mức độ tương tự giữa các cặp mã nguồn.
Đánh giá hiệu quả: Sử dụng các chỉ số như độ chính xác (ACC), độ nhạy (TPR), tỷ lệ dương tính giả (FPR) và biểu diễn đường cong ROC để so sánh hiệu quả của các phương pháp.
Timeline nghiên cứu kéo dài từ năm 2020 đến 2022, với các giai đoạn thu thập dữ liệu, phát triển công cụ, thực nghiệm và đánh giá kết quả.
Kết quả nghiên cứu và thảo luận
Những phát hiện chính
Hiệu quả của phương pháp AST-CC vượt trội: Kết quả thực nghiệm trên 16 bộ mã nguồn đã gán nhãn cho thấy phương pháp AST-CC đạt độ chính xác khoảng 82%, cao hơn so với LCS (68%) và TF-IDF (50%). Đường cong ROC của AST-CC nằm trên các phương pháp còn lại, chứng tỏ khả năng phân biệt và dự đoán chính xác hơn.
Ảnh hưởng của các thủ thuật sao chép đến cấu trúc AST: Các thủ thuật như thay đổi định dạng, đổi tên định danh không làm thay đổi cấu trúc AST, trong khi các thủ thuật phức tạp như bổ sung dead-code, thay đổi thứ tự đoạn mã độc lập hoặc thay thế vòng lặp tạo ra sự khác biệt lớn hơn. Điều này ảnh hưởng đến độ nhạy của các thuật toán so sánh.
Phương pháp LCS phù hợp với các trường hợp sao chép đơn giản: LCS có khả năng phát hiện tốt các đoạn mã tương tự khi thứ tự các đoạn mã không bị thay đổi nhiều, nhưng giảm hiệu quả khi có sự thay đổi thứ tự hoặc chèn đoạn mã mới.
TF-IDF và độ tương tự Cosin có hạn chế trong việc xử lý cấu trúc cây: Phương pháp này dễ bị ảnh hưởng bởi các thay đổi nhỏ trong mã nguồn, dẫn đến kết quả không ổn định và độ chính xác thấp hơn so với AST-CC và LCS.
Thảo luận kết quả
Nguyên nhân chính khiến AST-CC đạt hiệu quả cao là do việc tính toán mã hash tại các nút AST giúp nhận diện cấu trúc và nội dung mã nguồn một cách chính xác, đồng thời giảm thiểu ảnh hưởng của các thủ thuật sao chép phức tạp. So với các nghiên cứu trước đây, kết quả này phù hợp với xu hướng sử dụng cấu trúc cây để phát hiện sao chép mã nguồn.
Việc biểu diễn dữ liệu qua biểu đồ đường cong ROC và ma trận nhầm lẫn giúp trực quan hóa hiệu suất của từng phương pháp, từ đó dễ dàng lựa chọn giải pháp phù hợp cho từng mục đích ứng dụng. Kết quả cũng cho thấy tầm quan trọng của bước tiền xử lý cây AST để loại bỏ các thông tin không cần thiết, tăng hiệu quả so sánh.
Ý nghĩa của các phát hiện này không chỉ giúp nâng cao chất lượng phát hiện sao chép trong đào tạo mà còn hỗ trợ tối ưu hóa quy trình phát triển phần mềm, giảm thiểu lỗi và tăng tính bảo trì của mã nguồn.
Đề xuất và khuyến nghị
Triển khai phương pháp AST-CC trong hệ thống phát hiện sao chép mã nguồn: Động từ hành động là "áp dụng", mục tiêu là tăng độ chính xác phát hiện sao chép lên trên 80%, thời gian thực hiện trong vòng 6 tháng, chủ thể thực hiện là các trung tâm công nghệ thông tin và các trường đại học.
Phát triển công cụ tiền xử lý cây AST tự động: Động từ hành động là "xây dựng", nhằm tối ưu hóa dữ liệu đầu vào cho các thuật toán so sánh, giảm thời gian xử lý xuống dưới 50%, thực hiện trong 3 tháng, do nhóm nghiên cứu phần mềm đảm nhiệm.
Tổ chức đào tạo và hướng dẫn sử dụng công cụ cho giảng viên và sinh viên: Động từ hành động là "đào tạo", mục tiêu nâng cao nhận thức về vấn đề sao chép và sử dụng công cụ phát hiện, thời gian 1 tháng, do các khoa công nghệ thông tin chủ trì.
Nghiên cứu mở rộng áp dụng phương pháp cho các ngôn ngữ lập trình khác: Động từ hành động là "mở rộng", nhằm tăng phạm vi ứng dụng và tính đa dạng của công cụ, thời gian dự kiến 12 tháng, do các viện nghiên cứu và doanh nghiệp phần mềm phối hợp thực hiện.
Đối tượng nên tham khảo luận văn
Giảng viên và cán bộ đào tạo ngành Công nghệ thông tin: Giúp phát hiện và xử lý các trường hợp sao chép mã nguồn trong quá trình giảng dạy, nâng cao chất lượng đào tạo và đánh giá sinh viên chính xác hơn.
Sinh viên ngành Công nghệ thông tin: Hỗ trợ hiểu rõ hơn về các kỹ thuật phát hiện sao chép, từ đó nâng cao ý thức tự học và sáng tạo trong lập trình.
Nhà phát triển phần mềm và quản lý dự án: Ứng dụng các phương pháp để phân tích, tối ưu và bảo trì mã nguồn, giảm thiểu lỗi do sao chép và tăng hiệu quả phát triển.
Các tổ chức quản lý bản quyền phần mềm: Sử dụng công cụ để kiểm tra và xác minh quyền sở hữu mã nguồn, hỗ trợ trong việc xử lý vi phạm bản quyền.
Câu hỏi thường gặp
Phương pháp AST-CC là gì và tại sao hiệu quả hơn các phương pháp khác?
AST-CC là phương pháp so sánh mã nguồn dựa trên việc tính mã hash tại các nút của cây cú pháp trừu tượng (AST). Phương pháp này giúp nhận diện cấu trúc và nội dung mã nguồn chính xác, giảm thiểu ảnh hưởng của các thủ thuật sao chép phức tạp, từ đó đạt độ chính xác cao hơn so với LCS và TF-IDF.Làm thế nào để xây dựng cây cú pháp trừu tượng (AST) từ mã nguồn C++?
Cây AST được xây dựng bằng cách sử dụng trình biên dịch Clang trong khung LLVM, kết hợp với thư viện LibClang trên Python để phân tích cú pháp và tạo cấu trúc cây biểu diễn mã nguồn, loại bỏ các yếu tố không cần thiết như khoảng trắng và chú thích.Các thủ thuật sao chép mã nguồn phổ biến ảnh hưởng thế nào đến việc phát hiện?
Các thủ thuật như thay đổi định dạng, đổi tên biến không làm thay đổi cấu trúc AST nên dễ phát hiện. Tuy nhiên, các thủ thuật phức tạp như chèn dead-code, thay đổi thứ tự đoạn mã độc lập hoặc thay thế vòng lặp có thể làm thay đổi cấu trúc AST, gây khó khăn cho việc phát hiện nếu không sử dụng phương pháp phù hợp như AST-CC.Phương pháp LCS có những hạn chế gì khi áp dụng?
LCS hiệu quả khi thứ tự các đoạn mã không bị thay đổi nhiều, nhưng giảm hiệu quả khi có sự thay đổi thứ tự hoặc chèn đoạn mã mới. Do đó, LCS phù hợp với các trường hợp sao chép đơn giản, không thích hợp với các thủ thuật sao chép phức tạp.Làm thế nào để đánh giá hiệu quả của các phương pháp phát hiện sao chép mã nguồn?
Hiệu quả được đánh giá qua các chỉ số như độ chính xác (ACC), độ nhạy (TPR), tỷ lệ dương tính giả (FPR) và biểu diễn đường cong ROC. Ví dụ, phương pháp AST-CC đạt độ chính xác khoảng 82%, vượt trội so với các phương pháp khác, cho thấy khả năng phân biệt và dự đoán chính xác hơn.
Kết luận
- Luận văn đã nghiên cứu và phát triển các phương pháp xác định mức độ tương tự giữa các mã nguồn dựa trên cây cú pháp trừu tượng (AST), tập trung vào ngôn ngữ C++ và sử dụng công cụ Clang trong khung LLVM.
- Phương pháp AST-CC được đánh giá là hiệu quả nhất với độ chính xác khoảng 82%, vượt trội so với LCS và TF-IDF.
- Nghiên cứu phân tích chi tiết ảnh hưởng của các thủ thuật sao chép mã nguồn đến cấu trúc AST và hiệu quả phát hiện.
- Đề xuất các giải pháp ứng dụng thực tiễn trong đào tạo và phát triển phần mềm, đồng thời mở rộng nghiên cứu cho các ngôn ngữ lập trình khác.
- Các bước tiếp theo bao gồm triển khai công cụ trong môi trường đào tạo, đào tạo người dùng và nghiên cứu mở rộng phạm vi ứng dụng.
Hành động tiếp theo: Áp dụng phương pháp AST-CC trong các hệ thống phát hiện sao chép mã nguồn tại các trường đại học và doanh nghiệp phần mềm để nâng cao chất lượng đào tạo và phát triển phần mềm.