Знать различия двух версий кода с очень разным форматированием

У меня есть два файла из программы C. Я предполагаю, что оба принадлежат к одной и той же версии. Используя «diff», я мог узнать, где находятся различия, которые, вероятно, состоят из 3 строк. Проблема в том, что второй файл был передан другому программисту, который использовал совершенно другую индексацию, стиль скобок и т. д., но, вероятно, изменил только те 3 строки, которые мне нужно найти. Если я использую «diff», я получаю много различий. Итак, мой вопрос в том, как я мог в этой ситуации узнать, в чем различия с точки зрения кода. Я попытался применить одинаковое форматирование к обоим файлам, а затем использовать «diff», но в моем случае это не работает.


person Open the way    schedule 24.02.2011    source источник


Ответы (3)


Вы можете использовать нашу программу SmartDifferencer. Он сравнивает два файла кода, анализируя их с помощью реального синтаксического анализатора (что делает его полностью независимым от форматирования и размещения или изменений в комментариях), сравнивая синтаксические деревья, а затем сообщая об изменениях с точки зрения действий редактирования (копировать, перемещать, вставлять, расширять). -переменная-внутри-блока), которые объясняют, что произошло. Таким образом, вы видите различия в языковых структурах, а не в строках, что часто дает гораздо меньшие результаты различий. Он даже игнорирует изменения в системе счисления и экранировании строк, если фактические литеральные значения совпадают.

Для таких языков, как C# и Java, это работает очень хорошо. C немного более проблематичен, так как люди пишут оскорбительный код C, который нельзя проанализировать, не зная всех определений, #include и т. д. Таким образом, он не будет обрабатывать некоторые файлы, и вам придется вернуться к обычному diff, возможно, дополненному форматер, как предложил другой автор, но это все равно даст вам только линейные различия. C++, возможно, имеет те же проблемы, что и C, но на практике код C++ не так оскорбителен.

person Ira Baxter    schedule 26.02.2011
comment
вы знаете какой-нибудь эквивалент с открытым исходным кодом? - person Open the way; 28.02.2011
comment
Насколько я знаю, аналогов с открытым исходным кодом нет. Вопрос о том, задавалась ли БЕСПЛАТНАЯ версия в прошлом на SO, без других ответов, кроме наших. См. stackoverflow.com/questions/ 3829453/ Меня это не сильно удивляет; чтобы иметь такую ​​линейку продуктов, вам нужно слияние двух редких артефактов: точных синтаксических анализаторов языка и практической реализации полезного алгоритма AST-diffing (насколько мне известно, опубликовано только в исследовательских работах). У нас есть и то, и другое, последнее из-за некоторых серьезных размышлений и пота сверх того, что написано в газетах. - person Ira Baxter; 28.02.2011

Используйте pretty-printer для форматирования обоих файлов, а затем выполните сравнение.

person Jeff Foster    schedule 24.02.2011
comment
Я рекомендую плагин AStyle в Code::Blocks API. Работает удовольствие и довольно настраиваемый. Visual Studio также может выполнять автоматическое форматирование. Однако вы можете найти подходящий плагин для вашего редактора. - person Mark H; 24.02.2011

diff принимает параметр -w, который указывает ему игнорировать все пробелы при сравнении строк. Однако, если возможно, что одна строка из одного файла была разделена на две или более строк в другом файле, вам, вероятно, лучше воспользоваться предложением @Jeff Foster.

person Aasmund Eldhuset    schedule 24.02.2011