định lượng so sánh hình dạng AST


8

Làm thế nào người ta có thể so sánh hình dạng của các cây cú pháp trừu tượng của các chương trình mã nguồn tương tự (C, C ++, Go hoặc bất cứ thứ gì được biên dịch với GCC ...)?

Tôi đoán rằng việc phát hiện đạo văn trên mã nguồn sẽ sử dụng các kỹ thuật như vậy, nhưng tôi không biết làm thế nào mà nó được gọi là ...

Ví dụ, thống nhất có thể được sử dụng để so sánh AST, nhưng nó chỉ đưa ra một câu trả lời boolean. Tôi đang tìm kiếm một số kỹ thuật đưa ra một số "khoảng cách" số, hoặc một số loại vectơ số (để sau này được cung cấp, ví dụ như thuật toán học máy hoặc phân loại, hoặc một số điều dữ liệu lớn khác).

Bất kỳ tài liệu tham khảo nào về dữ liệu lớn hoặc phương pháp tiếp cận máy học trên bộ mã nguồn lớn cũng được hoan nghênh.

(Xin lỗi vì câu hỏi rộng hoặc mờ như vậy, tôi không biết nên sử dụng thuật ngữ nào)

Tôi không chỉ đơn giản muốn so sánh hai AST hoặc chương trình. Tôi muốn xử lý một tập hợp lớn các chương trình (ví dụ một nửa mã nguồn phân phối Debian) và tìm bên trong nó các thói quen tương tự. Tôi đã có MELT để làm việc trên các đại diện nội bộ của GCC (Gimple) và tôi muốn tận dụng điều đó, do đó lưu trữ một số số liệu ( độ phức tạp nào có thể không đủ) trong một số cơ sở dữ liệu và so sánh & xử lý chúng ...

Phụ lục: Tìm thấy về hệ thống & giấy MOSS , nhưng dường như nó không quan tâm đến hình dạng cú pháp. Cũng nhìn vào khoảng cách chỉnh sửa cây .

Cũng được tìm thấy (nhờ Jérémie Salvucci) Luận án tiến sĩ của Michel Chilowicz (bằng tiếng Pháp, tháng 11 năm 2010) về Tìm kiếm sự tương đồng trong mã nguồn


Vì vậy, bạn muốn làm điều đó theo cách học máy cũ với các tính năng thủ công? Đối với các chủ đề ngôn ngữ, việc học sâu đã khá thành công trong những năm gần đây ... Tôi tưởng tượng các hình dạng của biểu đồ luồng điều khiển và luồng dữ liệu có thể hữu ích để mô tả mã - nhưng việc giảm độ tương tự của cây với độ tương tự của biểu đồ có thể không như vậy một gợi ý hữu ích.
Patrick

Tôi mở cho các ý tưởng khác và tôi đang tìm kiếm tài liệu tham khảo & thuật ngữ.
Basile Starynkevitch

Câu trả lời:


6

Một cách tiếp cận sẽ là biên dịch nguồn thành XML và sau đó xem hai bit nguồn khác nhau như thế nào. Ví dụ, trong thế giới Java, công cụ phân tích tĩnh pmd thực hiện điều này như là cách tiếp cận của nó để tìm kiếm những thứ cần cảnh báo.

class Example {
 void bar() {
  while (baz)
   buz.doSomething();
 }
}

được 'biên dịch' thành:

CompilationUnit
 TypeDeclaration
  ClassDeclaration:(package private)
   UnmodifiedClassDeclaration(Example)
    ClassBody
     ClassBodyDeclaration
      MethodDeclaration:(package private)
       ResultType
       MethodDeclarator(bar)
        FormalParameters
       Block
        BlockStatement
         Statement
          WhileStatement
           Expression
            PrimaryExpression
             PrimaryPrefix
              Name:baz
           Statement
            StatementExpression:null
             PrimaryExpression
              PrimaryPrefix
               Name:buz.doSomething
              PrimarySuffix
               Arguments

Và điểm đó bạn sẽ so sánh mã bằng cách nói "sự khác biệt giữa mã này và mã đó là tên này khác nhau". Vì trên đây thực sự là xml, điều này có thể được thực hiện với bất kỳ số lượng công cụ so sánh xml nào tồn tại. Hoặc nếu bạn theo sau một số, người ta có thể áp dụng thuật toán khoảng cách chỉnh sửa cây trên nó ( câu hỏi SO liên quan ).


Một cách tiếp cận khác là xem xét 'chữ ký' của hình dạng mã. Các Chữ ký Khảo sát được thực hiện bởi Ward Cunningham

văn bản thay thế

Truyền thuyết đó hơi khó đọc:

  • 14m có nghĩa là 14 phương pháp
  • 294L là 294 dòng.
  • . là một dòng không trống
  • ' là một bình luận
  • |(màu xanh lá cây) là một iftuyên bố dòng đơn .
  • (.)(màu xanh lá cây) là một tuyên bố duy nhất trong một ifkhối
  • [(.)](màu nâu) là một tuyên bố duy nhất bên iftrong một vòng lặp.
  • {.} là một phương thức với một câu lệnh đơn.
  • [.] (màu đỏ) là một câu lệnh đơn trong vòng lặp
  • ([.]) (màu đỏ sẫm) là một câu lệnh đơn trong vòng lặp bên trong khối if.

So sánh hai bộ mã sau đó đang xem xét khoảng cách chỉnh sửa giữa hai chuỗi với ngôn ngữ rất hạn chế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.