Estou tentando encontrar alguns bons exemplos de utilitários de diff / merge semântico. O paradigma tradicional de comparação de arquivos de código-fonte funciona comparando linhas e caracteres ... mas há algum utilitário por aí (para qualquer linguagem) que realmente considere a estrutura do código ao comparar arquivos?
Por exemplo, programas diff existentes reportarão "diferença encontrada no caractere 2 da linha 125. Arquivo x contém void, onde o arquivo y contém bool". Uma ferramenta especializada deve ser capaz de relatar "Tipo de retorno do método doSomething () alterado de void para bool".
Eu diria que esse tipo de informação semântica é na verdade o que o usuário está procurando ao comparar o código e deve ser o objetivo das ferramentas de programação de próxima geração. Existem exemplos disso nas ferramentas disponíveis?
fonte
Respostas:
Desenvolvemos uma ferramenta capaz de lidar com precisão com este cenário. Verifique http://www.semanticmerge.com
Ele mescla (e diffs) com base na estrutura do código e não usando algoritmos baseados em texto, o que basicamente permite que você lide com casos como o seguinte, envolvendo refatoração forte. Ele também é capaz de renderizar as diferenças e os conflitos de mesclagem, como você pode ver abaixo:
E em vez de se confundir com os blocos de texto que estão sendo movidos, uma vez que analisa primeiro, é capaz de mostrar os conflitos por método (por elemento na verdade). Um caso como o anterior nem terá conflitos manuais para resolver.
É uma ferramenta de mesclagem com reconhecimento de idioma e foi ótimo finalmente poder responder a esta pergunta do SO :-)
fonte
O Eclipse tem esse recurso há muito tempo. É chamado de "comparação de estrutura" e é muito bom. Aqui está uma captura de tela de amostra para Java, seguida por outra para um arquivo XML:
(Observe os ícones de menos e mais nos métodos no painel superior.)
fonte
Para fazer bem as "comparações semânticas", você precisa comparar as árvores de sintaxe das línguas e levar em consideração o significado dos símbolos. Uma diferença semântica realmente boa compreenderia a semântica da linguagem e perceberia quando um bloco de código era equivalente em função a outro. Ir tão longe requer um provador de teoremas e, embora seja extremamente fofo, atualmente não é prático para uma ferramenta real.
Uma aproximação viável disso é simplesmente comparar árvores de sintaxe e relatar mudanças em termos de estruturas inseridas, excluídas, movidas ou alteradas. Chegando um pouco mais perto de uma "comparação semântica", pode-se relatar quando um identificador é alterado de forma consistente em um bloco de código.
Consulte nosso http://www.semanticdesigns.com/Products/SmartDifferencer/index.html para um mecanismo de comparação baseado em árvore de sintaxe que funciona com muitos idiomas, que faz a aproximação acima.
EDITAR janeiro de 2010: Versões disponíveis para C ++, C #, Java, PHP e COBOL. O site mostra exemplos específicos para a maioria deles.
EDITAR maio de 2010: Python e JavaScript adicionados.
EDITAR outubro de 2010: EGL adicionado.
EDITAR novembro de 2010: VB6, VBScript, VB.net adicionado
fonte
O que você está procurando é uma "árvore diferente". Acontece que isso é muito mais difícil de fazer bem do que um simples diff textual orientado por linha, que é na verdade apenas a comparação de duas sequências planas.
" Uma abordagem de comparação estrutural XML refinada " conclui, em parte com:
(ênfase minha)
Na verdade, se você estiver procurando por mais exemplos de diferenciação de árvore, sugiro focar em XML, uma vez que isso está gerando desenvolvimentos práticos nessa área.
fonte
Plugue sem vergonha para meu próprio projeto:
HTML Tree Diff compara a estrutura de documentos xml e html, escritos em python.
http://pypi.python.org/pypi/html-tree-diff/0.1.0
fonte
A solução para isso seria por idioma. Ou seja, a menos que seja projetado com uma arquitetura de plug-in que adie muito a análise do código em uma árvore e a comparação semântica com um plug-in específico de idioma, será muito difícil oferecer suporte a vários idiomas. Para quais idiomas você está interessado em ter essa ferramenta. Pessoalmente, adoraria um para C #.
Para C #, há um suplemento de diff de montagem para o Reflector, mas ele só faz uma diferença no IL, não no C #.
Você pode baixar o suplemento diff aqui [zip] ou ir para o projeto no site codeplex aqui .
fonte
Uma empresa chamada Zynamics oferece uma ferramenta de comparação semântica de nível binário. Ele usa uma linguagem de metamontagem chamada REIL para realizar a análise teórica de gráficos de 2 versões de um binário e produz um gráfico codificado por cores para ilustrar as diferenças entre eles. Não tenho certeza do preço, mas duvido que seja grátis.
fonte
http://prettydiff.com/
Pretty Diff reduz cada entrada para remover comentários e espaços em branco desnecessários e embeleza o código antes do algoritmo de diff. Não consigo pensar em nada para me tornar mais semântico de código do que isso. E é JavaScript escrito para que seja executado diretamente no navegador.
fonte