Como alguém pode comparar a forma das árvores de sintaxe abstrata de programas similares de código-fonte (C, C ++, Go ou qualquer coisa compilada com o GCC ...)?
Acho que a detecção de plágio no código-fonte usaria essas técnicas, mas não tenho idéia de como isso seria chamado ...
Por exemplo, a unificação pode ser usada para comparar o AST, mas fornece apenas uma resposta booleana. Eu estou procurando por alguma técnica que dê alguma "distância" numérica ou algum tipo de vetor numérico (para ser alimentado posteriormente, por exemplo, algoritmos de aprendizado de máquina ou classificação, ou alguma outra coisa de big data).
Todas as referências a big data ou abordagens de aprendizado de máquina em um grande conjunto de códigos-fonte também são bem-vindas.
(Desculpe por uma pergunta tão ampla ou confusa, não sei qual terminologia usar)
Não quero simplesmente comparar dois ASTs ou programas. Eu quero processar um grande conjunto de programas (por exemplo, metade de um código-fonte de distribuição Debian) e encontrar dentro dele rotinas semelhantes. Eu já tenho o MELT para trabalhar em representações internas do GCC (Gimple) e quero aproveitar acima disso, portanto, armazeno várias métricas (quais? A complexidade ciclomática provavelmente não é suficiente) em, por exemplo, alguns bancos de dados e os compara e processa ...
Adendo: Encontrado sobre o sistema e o papel MOSS , mas parece não se importar com a forma sintática. Também olhando para a distância de edição em árvore .
Também foi encontrada (graças a Jérémie Salvucci) a tese de doutorado de Michel Chilowicz (em francês, novembro de 2010) sobre Procurando similaridade no código-fonte