Wie könnte man die Form abstrakter Syntaxbäume ähnlicher Quellcode-Programme (C, C ++, Go oder irgendetwas mit GCC kompiliertes ...) vergleichen?
Ich denke, dass die Plagiatserkennung im Quellcode solche Techniken verwenden würde, aber ich habe keine Ahnung, wie das heißen würde ...
Zum Beispiel könnte die Vereinheitlichung verwendet werden, um AST zu vergleichen, aber es gibt nur eine boolesche Antwort. Ich suche nach einer Technik, die eine numerische "Distanz" oder eine Art numerischer Vektoren angibt (um später z. B. zu maschinellem Lernen oder Klassifizierungsalgorithmen oder einer anderen Big-Data-Sache zu gelangen).
Verweise auf Big Data oder maschinelle Lernansätze für große Mengen an Quellcode sind ebenfalls willkommen.
(Entschuldigung für eine so breite oder unscharfe Frage, ich weiß nicht, welche Terminologie ich verwenden soll)
Ich möchte nicht einfach zwei ASTs oder Programme vergleichen. Ich möchte eine große Anzahl von Programmen (z. B. die Hälfte eines Debian-Distributionsquellcodes) verarbeiten und darin ähnliche Routinen finden. Ich habe bereits MELT , um an internen GCC-Darstellungen (Gimple) zu arbeiten, und ich möchte darüber hinaus nutzen, daher mehrere Metriken (welche - zyklomatische Komplexität ist wahrscheinlich nicht ausreichend) in z. B. einer Datenbank speichern und vergleichen und verarbeiten ...
Nachträge: Gefunden über das MOSS- System und das Papier, aber es scheint sich überhaupt nicht um die syntaktische Form zu kümmern. Schauen Sie sich auch die Baumbearbeitungsentfernung an .
Gefunden auch (dank Jérémie Salvucci) Michel Chilowicz 'Doktorarbeit (auf Französisch, November 2010) über die Suche nach Ähnlichkeit im Quellcode