Ich versuche einige gute Beispiele für semantische Diff / Merge-Dienstprogramme zu finden. Das traditionelle Paradigma des Vergleichs von Quellcodedateien besteht darin, Zeilen und Zeichen zu vergleichen. Gibt es jedoch Dienstprogramme (für jede Sprache), die beim Vergleichen von Dateien tatsächlich die Struktur des Codes berücksichtigen ?
Beispielsweise melden vorhandene Diff-Programme "Unterschied in Zeichen 2 von Zeile 125 gefunden. Datei x enthält void, wobei Datei y bool enthält". Ein spezialisiertes Tool sollte in der Lage sein, "Rückgabetyp der Methode doSomething () von void in bool geändert" zu melden.
Ich würde argumentieren, dass diese Art von semantischer Information tatsächlich das ist, wonach der Benutzer beim Vergleichen von Code sucht, und das Ziel von Programmierwerkzeugen der nächsten Generation sein sollte. Gibt es Beispiele dafür in verfügbaren Tools?
quelle
Antworten:
Wir haben ein Tool entwickelt, das genau mit diesem Szenario umgehen kann. Überprüfen Sie http://www.semanticmerge.com
Es wird basierend auf der Codestruktur zusammengeführt (und unterscheidet sich) und verwendet keine textbasierten Algorithmen. Dies ermöglicht es Ihnen grundsätzlich, Fälle wie die folgenden mit starkem Refactor zu behandeln. Es ist auch in der Lage, sowohl die Unterschiede als auch die Zusammenführungskonflikte zu rendern, wie Sie unten sehen können:
Und anstatt mit den zu verschiebenden Textblöcken verwechselt zu werden, können die Konflikte, da sie zuerst analysiert werden, pro Methode (tatsächlich pro Element) angezeigt werden. In einem Fall wie dem vorherigen müssen nicht einmal manuelle Konflikte gelöst werden.
Es ist ein sprachbewusstes Zusammenführungswerkzeug und es war großartig, diese SO-Frage endlich beantworten zu können :-)
quelle
Eclipse hat diese Funktion schon lange. Es heißt "Structure Compare" und ist sehr schön. Hier ist ein Beispiel-Screenshot für Java, gefolgt von einem weiteren für eine XML-Datei:
(Beachten Sie die Minus- und Plus-Symbole für Methoden im oberen Bereich.)
quelle
Um "semantische Vergleiche" gut durchführen zu können, müssen Sie die Syntaxbäume der Sprachen vergleichen und die Bedeutung von Symbolen berücksichtigen. Ein wirklich guter semantischer Unterschied würde die Sprachsemantik verstehen und erkennen, wann ein Codeblock in seiner Funktion einem anderen äquivalent ist. Um so weit zu gehen, ist ein Theorembeweiser erforderlich, und obwohl er äußerst niedlich wäre, ist er für ein echtes Werkzeug derzeit nicht praktikabel.
Eine praktikable Annäherung daran besteht einfach darin, Syntaxbäume zu vergleichen und Änderungen in Bezug auf eingefügte, gelöschte, verschobene oder geänderte Strukturen zu melden. Wenn man sich einem "semantischen Vergleich" etwas nähert, kann man berichten, wenn ein Bezeichner in einem Codeblock konsistent geändert wird.
In unserer http://www.semanticdesigns.com/Products/SmartDifferencer/index.html finden Sie eine auf Syntaxbäumen basierende Vergleichs-Engine, die mit vielen Sprachen funktioniert und die obige Annäherung ausführt.
EDIT Jan 2010: Versionen für C ++, C #, Java, PHP und COBOL verfügbar. Die Website zeigt spezifische Beispiele für die meisten davon.
EDIT Mai 2010: Python und JavaScript hinzugefügt.
EDIT Okt 2010: EGL hinzugefügt.
EDIT Nov 2010: VB6, VBScript, VB.net hinzugefügt
quelle
Was Sie suchen, ist ein "Baumdiff". Es stellt sich heraus, dass dies viel schwieriger ist als ein einfaches zeilenorientiertes Textdiff, das eigentlich nur der Vergleich zweier flacher Sequenzen ist.
" Ein feinkörniger XML-Strukturvergleichsansatz " schließt teilweise mit:
(Hervorhebung von mir)
Wenn Sie nach weiteren Beispielen für die Differenzierung von Bäumen suchen, empfehle ich, sich auf XML zu konzentrieren, da dies die praktischen Entwicklungen in diesem Bereich vorantreibt.
quelle
Schamloser Stecker für mein eigenes Projekt:
HTML Tree Diff führt einen strukturbewussten Vergleich von XML- und HTML-Dokumenten durch, die in Python geschrieben sind.
http://pypi.python.org/pypi/html-tree-diff/0.1.0
quelle
Die Lösung hierfür wäre pro Sprache. Das heißt, wenn es nicht mit einer Plugin-Architektur entworfen wurde, die das Parsen des Codes in einen Baum und den semantischen Vergleich mit einem sprachspezifischen Plugin stark verzögert, ist es sehr schwierig, mehrere Sprachen zu unterstützen. Für welche Sprache (n) interessieren Sie sich für ein solches Tool? Persönlich würde ich einen für C # lieben.
Für C # gibt es ein Assembly-Diff-Add-In für Reflector, aber es gibt nur ein Diff für das IL, nicht für das C #.
Sie können die diff Add-In herunterladen hier [zip] oder auf der Codeplex - Website zu dem Projekt gehen hier .
quelle
Eine Firma namens Zynamics bietet ein semantisches Diff-Tool auf Binärebene an. Es verwendet eine Meta-Assemblersprache namens REIL, um eine graphentheoretische Analyse von zwei Versionen einer Binärdatei durchzuführen, und erstellt ein farbcodiertes Diagramm, um die Unterschiede zwischen ihnen zu veranschaulichen. Ich bin mir des Preises nicht sicher, aber ich bezweifle, dass er kostenlos ist.
quelle
http://prettydiff.com/
Pretty Diff minimiert jede Eingabe, um Kommentare und unnötigen Leerraum zu entfernen, und verschönert dann den Code vor dem Diff-Algorithmus. Ich kann mir sowieso nicht vorstellen, mehr Codesemantik als diese zu werden. Und es ist JavaScript geschrieben, so dass es direkt im Browser ausgeführt wird.
quelle