J'essaie de trouver de bons exemples d'utilitaires de diff / fusion sémantique. Le paradigme traditionnel de la comparaison de fichiers de code source fonctionne en comparant des lignes et des personnages .. mais sont - il des services là - bas (pour une langue) qui considèrent en fait la structure de code lorsque l'on compare les fichiers?
Par exemple, les programmes de diff existants rapporteront "la différence trouvée au caractère 2 de la ligne 125. Le fichier x contient void, où le fichier y contient le booléen". Un outil spécialisé devrait être capable de rapporter "Le type de retour de la méthode doSomething () a changé de void en bool".
Je dirais que ce type d'informations sémantiques est en fait ce que l'utilisateur recherche lors de la comparaison de 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?
la source
Réponses:
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 diffs) en fonction de la structure du code et n'utilise pas d'algorithmes basés sur du texte, ce qui vous permet essentiellement de traiter des cas comme celui-ci, impliquant un refactor fort. Il est également capable de rendre à la fois les différences et les conflits de fusion comme vous pouvez le voir ci-dessous:
Et au lieu de se confondre avec les blocs de texte déplacés, puisqu'il analyse en premier, 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.
C'est un outil de fusion compatible avec le langage et cela a été formidable de pouvoir enfin répondre à cette question SO :-)
la source
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'une autre pour un fichier XML:
(Notez les icônes moins et plus sur les méthodes dans le volet supérieur.)
la source
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 réaliserait quand un bloc de code était équivalent en fonction à un autre. Aller aussi loin nécessite un prouveur de théorème, et bien que ce soit extrêmement mignon, ce n'est actuellement pas pratique pour un vrai outil.
Une approximation viable de ceci consiste simplement à comparer les arborescences 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 plus d'une «comparaison sémantique», on pourrait signaler lorsqu'un identifiant est modifié de manière cohérente dans un bloc de code.
Consultez notre http://www.semanticdesigns.com/Products/SmartDifferencer/index.html pour un moteur de comparaison basé sur une arborescence de syntaxe qui fonctionne avec de nombreux langages, 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
la source
Ce que vous cherchez, c'est un "arbre diff". Il s'avère que c'est beaucoup plus difficile à faire qu'un simple diff textuel orienté ligne, qui n'est en réalité que la comparaison de deux séquences plates.
" Une approche de comparaison structurelle XML à grain fin" se termine, en partie par:
(c'est moi qui souligne)
En effet, si vous recherchez plus d'exemples de différenciation d'arbres, je vous suggère de vous concentrer sur XML, car cela a entraîné des développements pratiques dans ce domaine.
la source
Plug sans vergogne pour mon propre projet:
HTML Tree Diff compare la structure des documents xml et html, écrits en python.
http://pypi.python.org/pypi/html-tree-diff/0.1.0
la source
La solution à cela serait sur une base par langue. C'est-à-dire qu'à moins qu'il soit conçu avec une architecture de plugin qui reporte une grande partie de l'analyse du code dans un arbre et la comparaison sémantique à un plugin spécifique à un langage, 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'en aimerais un pour C #.
Pour C #, il existe un complément d'assembly diff pour Reflector, 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 .
la source
Une société appelée Zynamics propose un outil de diff sémantique de niveau binaire. Il utilise un langage de méta-assemblage appelé REIL pour effectuer une analyse théorique des graphes de 2 versions d'un binaire, et produit un graphique à code couleur pour illustrer les différences entre elles. Je ne suis pas sûr du prix, mais je doute que ce soit gratuit.
la source
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 de diff. Je ne peux pas penser de toute façon à devenir plus sémantique du code que cela. Et, son JavaScript écrit donc il s'exécute directement dans le navigateur.
la source