AST形状を定量的に比較する


8

同様のソースコードプログラム(C、C ++、Go、またはGCCでコンパイルされたもの)の抽象構文ツリーの形状をどのように比較できますか?

私は推測するソースコードの盗用検出は、そのような技術を使用しますが、私はそれと呼ばれることだろうかの見当がつかない...

たとえば、統一を使用してASTを比較できますが、それはブール値の回答しか提供しません。数値の「距離」、またはある種の数値ベクトル(たとえば、機械学習や分類アルゴリズム、またはその他のビッグデータのものに後でフィードされる)を提供するいくつかの手法を探しています。

大規模なソースコードセットでのビッグデータや機械学習アプローチへの言及も歓迎します。

(このように広範またはあいまいな質問で申し訳ありません。使用する用語がわかりません)

2つのASTまたはプログラムを単純に比較したくありません。大量のプログラム(Debianディストリビューションのソースコードの半分など)を処理し、その中に同様のルーチンを見つけたいと思っています。私はすでにMELTを使用してGCC内部表現(Gimple)に取り組んでいるため、それを活用したいので、いくつかのメトリック(どれか?循環的複雑度はおそらく十分ではない)をデータベースなどに保存し、比較して処理します...

補遺:MOSSシステムと紙について発見されましたが、構文の形はまったく気にしていないようです。ツリーの編集距離も調べます

ソースコードの類似性探すことについて(JérémieSalvucciに感謝)Michel Chilowi​​czの博士論文(2010年11月フランス語)も発見


それで、手作りの機能を使って昔ながらの機械学習の方法でそれを実行したいですか?言語のトピックについては、ディープラーニングが近年非常に成功しています...コントロールフローグラフとデータフローグラフの形状がコードの特徴を示すのに役立つと思いますが、ツリーの類似性をグラフの類似性に減らすのはそうではないかもしれません役立つ提案。
Patrick、

私は他のアイデアに心を開いており、参考文献や用語を探しています。
Basile Starynkevitch、2015年

回答:


6

1つのアプローチは、ソースをXMLにコンパイルしてから、ソースの2つのビットがどれほど異なるかを調べることです。たとえば、Javaの世界では、静的分析ツールpmdは、警告するものを探すためのアプローチとしてこれを行います。

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

「コンパイル」されて:

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

その点は、「このコードとそのコードの違いは、この名前が異なるということです」と言ってコードを比較することになります。上記は実際にはxmlであるため、これは、存在する任意の数のxml比較ツールで実行できます。または、数値を求めていた場合は、ツリー編集距離アルゴリズムを適用できます(関連するSO質問)。


別のアプローチは、コード形状の「署名」を調べることです。署名調査は、ウォード・カニンガムによって行われました

代替テキスト

その伝説は少し読みにくいです:

  • 14m 14メソッドを意味します
  • 294L 294行です。
  • . 空白でない行です
  • ' コメントです
  • |(緑)は1行のifステートメントです。
  • (.)(緑)はifブロック内の単一のステートメントです
  • [(.)](茶色)はifループ内の単一ステートメントです。
  • {.} 単一のステートメントを持つメソッドです。
  • [.] (赤)はループ内の単一ステートメントです
  • ([.]) (濃い赤)は、ifブロック内のループ内の単一ステートメントです。

2つのコードセットを比較すると、非常に制限された言語で2つの文字列間の編集距離が調べられます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.