Pergunta

Eu estou tentando encontrar alguns bons exemplos de utilitários diff / merge semânticas. O paradigma tradicional de comparar arquivos de código fonte funciona comparando linhas e caracteres .. mas existem utilitários lá fora (para qualquer idioma) que realmente considerar o Estrutura do código quando comparando arquivos?

Por exemplo, programas de diferenças existentes irá relatar "diferença encontrada em caráter 2 da linha 125. Arquivo x contém v-o-i-d, onde arquivo y contém b-o-o-l". Uma ferramenta especializada deve ser capaz de relatar "Return tipo de método doSomething () mudou de vazio para bool".

Eu diria que este tipo de informação semântica é realmente o que o usuário está procurando quando se compara código, e deve ser o objetivo de ferramentas de programação de última geração. Existem exemplos deste em ferramentas disponíveis?

Foi útil?

Solução

Nós desenvolvemos uma ferramenta que é capaz de lidar precisamente com este cenário. Verifique http://www.semanticmerge.com

Funde (e diffs) com base na estrutura de código e não usando algoritmos baseados em texto, que basicamente permite que você lidar com casos como o seguinte, envolvendo forte refatorar. Ele também é capaz de tornar ambas as diferenças e os conflitos de mesclagem como você pode ver abaixo:

enter descrição da imagem aqui

E, em vez de ficar confuso com os blocos de texto que está sendo movida, uma vez que analisa em primeiro lugar, ele é capaz de exibir os conflitos em uma base por método (por elemento na verdade). Um caso como o anterior não vai mesmo ter conflitos manuais para resolver.

enter descrição da imagem aqui

É uma ferramenta de mesclagem com reconhecimento de linguagem e tem sido ótimo para ser finalmente capaz de responder a esta pergunta SO: -)

Outras dicas

Eclipse teve esse recurso por um longo tempo. É chamado de "Estrutura Compare", e é muito bom. Aqui está uma imagem de exemplo para Java, seguido de outro para um arquivo XML:

(Observe a menos e mais ícones em métodos no painel superior).

Estrutura Java do Eclipse Comparer Estrutura XML do Eclipse Comparer

Para fazer "comparações semânticas" bem, você precisa comparar as árvores de sintaxe de as línguas, e ter em conta o significado dos símbolos. Um realmente boa diff semântica iria entender a semântica da linguagem, e perceber quando um bloco de código foi equivalente em função para outra. Indo isso exige muito de um provador de teoremas, e ao mesmo tempo seria extremamente bonito, não é presentemente prático para uma ferramenta real.

A aproximação viável deste é simplesmente comparando árvores de sintaxe, e relatórios alterações em termos de estruturas inseridos, eliminados, movidos, ou alterados. Ficando um pouco mais perto de uma "comparação semântica", pode-se relatar quando um identificador é alterada de forma consistente em um bloco de código.

Veja nossa http://www.semanticdesigns.com/Products/SmartDifferencer/index .html para um motor baseado em árvore sintaxe comparação que trabalha com muitas línguas, que faz à aproximação acima.

EDIT janeiro 2010: Versões disponíveis para C ++, C #, Java, PHP, e COBOL. Os exemplos de sites mostras específicas para a maioria destes.

EDIT maio de 2010: Python e JavaScript adicionado

.

EDIT outubro 2010: EGL adicionado

.

EDIT novembro 2010: VB6, VBScript, VB.net adicionado

O que você está tateando em busca de um "diff árvore". Acontece que isso é muito mais difícil de fazer bem do que um diff textual orientada-line simples, que é realmente apenas a comparação de duas sequências planas.

" A Fine-Grained XML estrutural comparação Abordagem ", conclui, em parte, com:

O nosso estudo teórico, bem como nossa avaliação experimental mostraram que os rendimentos do método proposto melhorou os resultados de similaridade estrutural com respeitar para as alternativas existentes, apesar de terem a mesma complexidade de tempo (O (N ^ 2))

(grifo meu)

Na verdade, se você está procurando mais exemplos de árvore diferenciação sugiro focando XML desde que foi dirigindo desenvolvimentos práticos na área.

Shameless plug para o meu próprio projeto:

HTML Árvore Diff faz comparação estrutura ciente de XML e HTML documentos, escrito em python.

http://pypi.python.org/pypi/html-tree-diff/0.1 0,0

A solução para isso seria em uma base por língua. Ou seja, a menos que seja projetado com uma arquitetura de plugin que adia um monte da análise do código em uma árvore e a comparação semântica para um plugin específico da linguagem, então será muito difícil de suportar vários idiomas. Que língua (s) que você está interessado em ter uma ferramenta para. Pessoalmente, eu adoraria um para C #.

Para C # existe um add-in de montagem diff para refletor, mas ele só faz um diff no IL não o C #.

Você pode baixar o diff add-in aqui [postal] ou ir para o projeto no site CodePlex aqui .

Uma empresa chamada Zynamics oferece uma ferramenta de comparação semântico-nível binário. Ele usa uma linguagem de meta-montagem chamado REIL para realizar a análise do gráfico de teoria de 2 versões de um binário, e produz um gráfico com código de cores para ilustrar as diferenças entre eles. Não tenho a certeza do preço, mas eu duvido que ele é livre.

http://prettydiff.com/

minifies Bonita Diff cada entrada aos comentários remover e espaço em branco desnecessário e, em seguida, embeleza o código antes do algoritmo diff. Eu não consigo pensar em uma maneira de se tornar mais código semântico do que isso. E, a sua escrita JavaScript para ser executado diretamente no navegador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top