同様のソースコードプログラム(C、C ++、Go、またはGCCでコンパイルされたもの)の抽象構文ツリーの形状をどのように比較できますか?
私は推測するソースコードの盗用検出は、そのような技術を使用しますが、私はそれと呼ばれることだろうかの見当がつかない...
たとえば、統一を使用してASTを比較できますが、それはブール値の回答しか提供しません。数値の「距離」、またはある種の数値ベクトル(たとえば、機械学習や分類アルゴリズム、またはその他のビッグデータのものに後でフィードされる)を提供するいくつかの手法を探しています。
大規模なソースコードセットでのビッグデータや機械学習アプローチへの言及も歓迎します。
(このように広範またはあいまいな質問で申し訳ありません。使用する用語がわかりません)
2つのASTまたはプログラムを単純に比較したくありません。大量のプログラム(Debianディストリビューションのソースコードの半分など)を処理し、その中に同様のルーチンを見つけたいと思っています。私はすでにMELTを使用してGCC内部表現(Gimple)に取り組んでいるため、それを活用したいので、いくつかのメトリック(どれか?循環的複雑度はおそらく十分ではない)をデータベースなどに保存し、比較して処理します...
補遺:MOSSシステムと紙について発見されましたが、構文の形はまったく気にしていないようです。ツリーの編集距離も調べます。
ソースコードの類似性を探すことについて(JérémieSalvucciに感謝)Michel Chilowiczの博士論文(2010年11月フランス語)も発見