Próbuję znaleźć dobre przykłady semantycznych narzędzi do porównywania / scalania. Tradycyjny paradygmat porównywania plików z kodem źródłowym polega na porównywaniu wierszy i znaków… ale czy istnieją narzędzia (dla dowolnego języka), które uwzględniają strukturę kodu podczas porównywania plików?
Na przykład, istniejące programy porównujące będą raportować „różnicę znalezioną w znaku 2 wiersza 125. Plik x zawiera void, gdzie plik y zawiera bool”. Specjalistyczne narzędzie powinno być w stanie zgłosić „Zwracany typ metody doSomething () zmieniony z void na bool”.
Twierdziłbym, że tego typu informacje semantyczne są w rzeczywistości tym, czego szuka użytkownik podczas porównywania kodu, i powinny być celem narzędzi programistycznych nowej generacji. Czy są jakieś przykłady tego w dostępnych narzędziach?
źródło
Odpowiedzi:
Opracowaliśmy narzędzie, które jest w stanie precyzyjnie poradzić sobie z takim scenariuszem. Sprawdź http://www.semanticmerge.com
Scala (i różnicuje) na podstawie struktury kodu i nie używa algorytmów tekstowych, co w zasadzie pozwala radzić sobie z przypadkami podobnymi do poniższych, obejmujących silną refaktoryzację. Jest również w stanie renderować zarówno różnice, jak i konflikty scalania, jak widać poniżej:
I zamiast mylić się z przenoszonymi blokami tekstu, ponieważ najpierw analizuje, jest w stanie wyświetlić konflikty na podstawie metody (w rzeczywistości dla każdego elementu). Sprawa taka jak poprzednia nie będzie miała nawet ręcznych konfliktów do rozwiązania.
Jest to narzędzie do scalania uwzględniające język i wspaniale było móc wreszcie odpowiedzieć na to pytanie SO :-)
źródło
Eclipse ma tę funkcję od dawna. Nazywa się „Porównanie struktur” i jest bardzo przyjemne. Oto przykładowy zrzut ekranu dla języka Java, a następnie drugi dla pliku XML:
(Zwróć uwagę na ikony minus i plus na metodach w górnym panelu).
źródło
Aby dobrze wykonać „porównania semantyczne”, należy porównać drzewa składniowe języków i wziąć pod uwagę znaczenie symboli. Naprawdę dobra różnica semantyczna rozumiałaby semantykę języka i zdawała sobie sprawę, kiedy jeden blok kodu byłby równoważny funkcji z innym. Posunięcie się tak daleko wymaga dowodzenia twierdzeniem i chociaż byłoby to niezwykle urocze, nie jest obecnie praktyczne dla prawdziwego narzędzia.
Użytecznym przybliżeniem tego jest po prostu porównanie drzew składni i raportowanie zmian pod względem wstawionych, usuniętych, przeniesionych lub zmienionych struktur. Zbliżając się nieco do „porównania semantycznego”, można by zgłosić, że identyfikator jest zmieniany konsekwentnie w całym bloku kodu.
Zobacz naszą http://www.semanticdesigns.com/Products/SmartDifferencer/index.html, aby zapoznać się z mechanizmem porównywania opartym na drzewie składni, który działa z wieloma językami i wykonuje powyższe przybliżenie.
EDYCJA, styczeń 2010: Dostępne wersje dla C ++, C #, Java, PHP i COBOL. Witryna zawiera konkretne przykłady większości z nich.
EDYCJA Maj 2010: Dodano Python i JavaScript.
EDYCJA Październik 2010: dodano EGL.
EDYCJA listopad 2010: dodano VB6, VBScript, VB.net
źródło
To, czego szukasz, to "różnica drzew". Okazuje się, że jest to o wiele trudniejsze do wykonania niż prosta tekstowa różnica zorientowana liniowo, która jest tak naprawdę tylko porównaniem dwóch płaskich sekwencji.
„ Podejście do szczegółowego porównania strukturalnego XML ” kończy się częściowo następująco:
(podkreślenie moje)
Rzeczywiście, jeśli szukasz więcej przykładów różnicowania drzew, proponuję skupić się na XML, ponieważ jest to motorem praktycznych zmian w tej dziedzinie.
źródło
Bezwstydna wtyczka do własnego projektu:
HTML Tree Diff porównuje z uwzględnieniem struktury dokumenty XML i HTML, napisane w Pythonie.
http://pypi.python.org/pypi/html-tree-diff/0.1.0
źródło
Rozwiązanie tego problemu byłoby zależne od języka. To znaczy, jeśli nie jest zaprojektowany z architekturą wtyczek, która odracza wiele przetwarzania kodu do drzewa i porównania semantycznego z wtyczką specyficzną dla języka, bardzo trudno będzie obsługiwać wiele języków. W jakich językach chciałbyś mieć takie narzędzie. Osobiście chciałbym jeden dla C #.
W przypadku języka C # istnieje dodatek diff zestawu do Reflector, ale robi to tylko różnicę w IL, a nie C #.
Możesz pobrać dodatek diff tutaj [zip] lub przejść do projektu w witrynie codeplex tutaj .
źródło
Firma o nazwie Zynamics oferuje narzędzie do porównywania semantycznego na poziomie binarnym. Używa meta-asemblera zwanego REIL, aby przeprowadzić analizę teoretyczną dwóch wersji pliku binarnego i tworzy kolorowy wykres ilustrujący różnice między nimi. Nie jestem pewien ceny, ale wątpię, że jest darmowa.
źródło
http://prettydiff.com/
Pretty Diff minimalizuje każde wejście, aby usunąć komentarze i niepotrzebne białe znaki, a następnie upiększa kod przed algorytmem porównywania. I tak nie mogę myśleć o tym, aby stać się bardziej semantycznym kodem niż to. I ma napisany JavaScript, więc działa bezpośrednio w przeglądarce.
źródło