web-dev-qa-db-fra.com

Utilitaires de diff sémantique

J'essaie de trouver de bons exemples d'utilitaires de diff/fusion sémantique. Le paradigme traditionnel de la comparaison des fichiers de code source fonctionne en comparant les lignes et les caractères .. mais existe-t-il des utilitaires (pour n'importe quelle langue) qui prennent réellement en compte la structure du code lors de la comparaison des fichiers?

Par exemple, les programmes de diff existants rapporteront "différence trouvée au caractère 2 de la ligne 125. Le fichier x contient v-o-i-d, où le fichier y contient b-o-o-l". Un outil spécialisé devrait être en mesure de signaler "Le type de méthode de retour doSomething () est passé de void à bool".

Je dirais que ce type d'informations sémantiques est en fait ce que l'utilisateur recherche lorsqu'il compare le code, et devrait être l'objectif des outils de programmation de nouvelle génération. Y a-t-il des exemples de cela dans les outils disponibles?

105
jasonmray

Nous avons développé un outil capable de gérer précisément ce scénario. Vérifiez http://www.semanticmerge.com

Il fusionne (et diffère) en fonction de la structure du code et en n'utilisant pas d'algorithmes basés sur du texte, ce qui vous permet essentiellement de traiter des cas comme les suivants, impliquant un refactor fort. Il est également capable de rendre les différences et les conflits de fusion comme vous pouvez le voir ci-dessous:

enter image description here

Et au lieu de se confondre avec les blocs de texte déplacés, car il analyse d'abord, il est capable d'afficher les conflits par méthode (par élément en fait). Un cas comme le précédent n'aura même pas de conflits manuels à résoudre.

enter image description here

Il s'agit d'un outil de fusion prenant en compte la langue et cela a été formidable de pouvoir enfin répondre à cette SO question :-)

36
pablo

Eclipse a cette fonctionnalité depuis longtemps. Ça s'appelle "Structure Compare", et c'est très sympa. Voici un exemple de capture d'écran pour Java, suivi d'un autre pour un fichier XML:

(Notez les icônes moins et plus sur les méthodes dans le volet supérieur.)

Eclipse's Java Structure ComparerEclipse's XML Structure Comparer

29
Hosam Aly

Pour bien faire des "comparaisons sémantiques", vous devez comparer les arbres de syntaxe des langages et prendre en compte la signification des symboles. Un très bon diff sémantique comprendrait la sémantique du langage et se rendrait compte quand un bloc de code était équivalent en fonction à un autre. Aller aussi loin nécessite un prouveur de théorème, et bien qu'il soit extrêmement mignon, il n'est actuellement pas pratique pour un véritable outil.

Une approximation pratique de cela consiste simplement à comparer les arbres de syntaxe et à signaler les changements en termes de structures insérées, supprimées, déplacées ou modifiées. En se rapprochant un peu d'une "comparaison sémantique", on pourrait signaler lorsqu'un identifiant est modifié de manière cohérente sur un bloc de code.

Voir notre http://www.semanticdesigns.com/Products/SmartDifferencer/index.html pour un moteur de comparaison basé sur une arborescence de syntaxe qui fonctionne avec de nombreuses langues, qui fait l'approximation ci-dessus.

EDIT Jan 2010: Versions disponibles pour C++, C #, Java, PHP et COBOL. Le site Web présente des exemples spécifiques pour la plupart d'entre eux.

EDIT mai 2010: Python et JavaScript ajoutés.

EDIT oct. 2010: EGL ajouté.

EDIT Nov 2010: VB6, VBScript, VB.net ajoutés

14
Ira Baxter

Ce que vous cherchez à tâtons, c'est un "diff d'arbre". Il s'avère qu'il est beaucoup plus difficile de bien faire qu'un simple diff textuel orienté ligne, qui n'est en réalité que la comparaison de deux séquences plates.

" ne approche de comparaison structurelle XML fine " conclut, en partie avec:

Notre étude théorique ainsi que notre évaluation expérimentale ont montré que la méthode proposée donne des résultats de similarité structurelle améliorés par rapport aux alternatives existantes, tout en ayant la même complexité temporelle (O (N ^ 2))

(c'est moi qui souligne)

En effet, si vous cherchez plus d'exemples de différenciation d'arbre, je vous suggère de vous concentrer sur XML car cela a conduit à des développements pratiques dans ce domaine.

12
bendin

Prise sans vergogne pour mon propre projet:

HTML Tree Diff effectue une comparaison structurelle des documents xml et html, écrits en python.

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

5
Christian Oudard

http://prettydiff.com/

Pretty Diff minimise chaque entrée pour supprimer les commentaires et les espaces blancs inutiles, puis embellit le code avant l'algorithme diff. Je ne peux pas penser de toute façon à devenir plus sémantique de code que cela. Et, son JavaScript écrit pour qu'il s'exécute directement dans le navigateur.

2
austincheney

La solution à cela se ferait par langue. C'est à dire. à moins qu'il ne soit conçu avec une architecture de plugin qui reporte une grande partie de l'analyse du code dans une arborescence et la comparaison sémantique avec un plugin spécifique à une langue, il sera très difficile de prendre en charge plusieurs langues. Pour quelle (s) langue (s) souhaitez-vous disposer d'un tel outil? Personnellement, j'aimerais un pour C #.

Pour C #, il existe un complément Assembly diff au réflecteur, mais il ne fait qu'un diff sur l'IL et non sur le C #.

Vous pouvez télécharger le complément diff ici [Zip] ou aller au projet sur le site codeplex ici .

2
Jonathan Parker

Une entreprise appelée Zynamics propose un outil de diff sémantique au niveau binaire. Il utilise un langage de méta-assemblage appelé REIL pour effectuer une analyse graphique théorique de 2 versions d'un binaire, et produit un graphique codé par couleur pour illustrer les différences entre elles. Je ne suis pas sûr du prix, mais je doute qu'il soit gratuit.

2
David V McKay