Frage

Ich versuche, einige gute Beispiele für semantische diff zu finden / Merge-Dienstprogramme. Das traditionelle Paradigma der Quellcode-Dateien zu vergleichen Werke von Linien und Zeichen .. aber gibt es Dienstprogramme gibt (für jede Sprache), die tatsächlich halten die Struktur Code zu vergleichen, wenn Dateien zu vergleichen?

Zum Beispiel bestehende diff-Programme berichten "Unterschied Charakter gefunden 2 der Zeile 125. Datei-x enthält v-o-i-d, wobei Datei y enthält b-o-o-l". Ein spezielles Tool sollte in der Lage sein, melden „Return Art der Methode doSomething () änderte sich von Leere Bool“.

Ich würde behaupten, dass diese Art von semantischen Informationen ist eigentlich, was die Nutzer suchen, wenn der Code zu vergleichen, und soll das Ziel der nächsten Generation Programme Tool sein. Gibt es Beispiele in verfügbaren Tools?

War es hilfreich?

Lösung

Wir haben ein Tool entwickelt, das genau die Lage ist, mit diesem Szenario zu befassen. Überprüfen Sie http://www.semanticmerge.com

Es verschmilzt (und diffs), basierend auf Codestruktur und nicht textbasierte Algorithmen, die Sie im Grunde kann mit Fällen wie die folgenden beschäftigen, an denen starken refactor. Es ist auch in der Lage, sowohl die Unterschiede und die Zusammenführung Konflikte zu machen, wie Sie unten sehen können:

eingeben Bild Beschreibung hier

Und statt mit den Textblöcken verwirrten bewegt wird, da es zuerst analysiert, es ist in der Lage, die Konflikte auf einer pro-Methode Basis anzuzeigen (pro Element in der Tat). Ein Fall wie die vorherigen nicht einmal manuell Konflikte zu lösen.

eingeben Bild Beschreibung hier

Es ist eine Sprache-aware Merge-Tool und es war großartig, endlich in der Lage zu sein, diese SO Frage zu beantworten: -)

Andere Tipps

Eclipse- hat diese Funktion für eine lange Zeit hat. Es heißt „Structure Vergleich“ genannt, und es ist sehr schön. Hier ist ein Beispiel-Screenshot für Java, gefolgt von einer anderen für eine XML-Datei:

(Beachten Sie die Minus- und Plus-Symbole auf Methoden im oberen Bereich.)

Eclipse Java Struktur Comparer Eclipse XML-Struktur Comparer

Um zu tun „semantische Vergleiche“ gut, müssen Sie die Syntaxbäume vergleichen von die Sprachen, und die Bedeutung von Symbolen berücksichtigen. Einen wirklich gute semantische diff würde die Sprachsemantik, verstehen und erkennen, wenn ein Codeblock war in der Funktion zu einem anderen gleichwertig. Gehen weit erfordert dies eine Theorembeweisers, und während es wäre extrem nett, ist derzeit nicht praktisch für ein echtes Werkzeug.

Eine praktikable Annäherung an diese einfach vergleichen Syntaxbäume und Reporting Änderungen in Bezug auf die Strukturen eingefügt, gelöscht, verschoben oder verändert. Immer etwas näher an einem „semantischen Vergleich“, so könnte man berichten wenn eine Kennung konsistent über einen Codeblock geändert wird.

Sehen Sie unsere http://www.semanticdesigns.com/Products/SmartDifferencer/index .html für einen Syntaxbaum basierten Vergleich Engine, die mit vielen Sprachen arbeitet, das tut die obige Annäherung.

EDIT Januar 2010: Versionen für C ++, C #, Java, PHP und COBOL. Die Website zeigt konkrete Beispiele für die meisten von ihnen.

EDIT Mai 2010:. Python und JavaScript hinzugefügt

EDIT Oktober 2010:. EGL hinzugefügt

EDIT November 2010: VB6, VBScript, VB.net hinzugefügt

Was Sie tastend für einen „Baum diff“. Es stellt sich heraus, dass dies viel schwieriger ist gut zu tun, als ein einfacher zeilenorientierten Text diff, das ist wirklich nur der Vergleich von zwei flachen Sequenzen.

" feinkörnige XML Struktur Vergleich Ansatz “kommt zu dem Schluss, teilweise mit:

  

Unsere theoretische Studie sowie unsere experimentelle Bewertung   zeigte, dass die vorgeschlagene Verfahren Ausbeuten mit struktureller Ähnlichkeit ergibt verbesserte   Bezug auf bestehende Alternativen, während gleichzeitig die Komplexität mit (O (N ^ 2))

(Hervorhebung von mir)

Ja, wenn Sie sich für weitere Beispiele von Baumdifferenzier ich auf der Suche auf XML empfiehlt konzentrieren, da die praktische Entwicklungen in diesem Bereich unterwegs worden ist.

Shameless Stecker für mein eigenes Projekt:

HTML-Baum Diff tut Struktur-aware Vergleich von XML- und HTML-Dokumenten, in Python geschrieben.

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

Die Lösung hierfür wäre auf einer pro Sprache Grundlage. D. h es sei denn, es mit einer Plugin-Architektur, die eine Menge der Parsen des Codes aufschiebt in einen Baum und der semantischen Vergleich zu einem sprachspezifischen Plugin entwickelt, ist dann wird es sehr schwierig sein, mehrere Sprachen zu unterstützen. Welche Sprache (n) sind Sie daran interessiert, dass ein solches Werkzeug für. Persönlich würde ich einen für C # lieben.

Für C # gibt es eine Montage-Add-in Diff Reflector aber es hat nur ein diff auf der IL nicht die C #.

Sie können die diff Add-In herunterladen hier [zip] oder auf der Codeplex-Website zu dem Projekt gehen hier .

Ein Unternehmen Zynamics bietet ein binary-Ebene semantischen Diff-Tool genannt. Es verwendet eine meta-Assembler-Sprache genannt REIL graphentheoretische Analyse von zwei Versionen eines binären auszuführen, und erzeugt ein farbcodierte Diagramm Unterschiede zwischen ihnen zu erläutern. Ich bin nicht sicher, ob der Preis, aber ich bezweifle es frei ist.

http://prettydiff.com/

Pretty Diff minifies jede Eingabe Kommentare und unnötigen Leerraum zu entfernen und dann verschönert den Code vor dem Diff-Algorithmus. Ich kann nicht von ohnehin denken, um mehr Code semantischen zu werden als diese. Und seine schriftliche JavaScript, damit es läuft direkt im Browser.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top