Я пытаюсь найти хорошие примеры семантических утилит сравнения / слияния. Традиционная парадигма сравнения файлов исходного кода работает путем сравнения строк и символов ... но существуют ли какие-либо утилиты (для любого языка), которые действительно учитывают структуру кода при сравнении файлов?
Например, существующие программы сравнения будут сообщать «различие обнаружено в символе 2 строки 125. Файл x содержит void, а файл y содержит bool». Специализированный инструмент должен иметь возможность сообщать «Тип возвращаемого значения метода doSomething () изменен с void на bool».
Я бы сказал, что этот тип семантической информации на самом деле является тем, что пользователь ищет при сравнении кода, и должен быть целью инструментов программирования следующего поколения. Есть ли примеры этого в доступных инструментах?
источник
Ответы:
Мы разработали инструмент, способный точно справиться с этим сценарием. Проверьте http://www.semanticmerge.com
Он объединяет (и различается) на основе структуры кода, а не с использованием текстовых алгоритмов, что в основном позволяет вам иметь дело с такими случаями, как следующие, включая сильный рефакторинг. Он также может отображать как различия, так и конфликты слияния, как вы можете видеть ниже:
И вместо того, чтобы запутаться с перемещаемыми текстовыми блоками, поскольку он сначала анализирует, он может отображать конфликты для каждого метода (фактически для каждого элемента). В случае, подобном предыдущему, не будет даже ручных конфликтов, которые нужно решить.
Это инструмент слияния с поддержкой языка, и было здорово, что наконец-то удалось ответить на этот SO-вопрос :-)
источник
В Eclipse эта функция есть уже давно. Это называется «Сравнение структур», и это очень приятно. Вот пример снимка экрана для Java, за которым следует еще один снимок экрана для файла XML:
(Обратите внимание на значки «минус» и «плюс» на методах в верхней панели.)
источник
Чтобы хорошо провести «семантическое сравнение», вам необходимо сравнить синтаксические деревья языков и принять во внимание значение символов. Действительно хороший семантический diff поймет семантику языка и поймет, когда один блок кода эквивалентен по функциям другому. Чтобы зайти так далеко, требуется средство доказательства теорем, и, хотя это было бы очень мило, в настоящее время непрактично для реального инструмента.
Работоспособное приближение к этому - простое сравнение синтаксических деревьев и сообщение об изменениях с точки зрения вставленных, удаленных, перемещенных или измененных структур. Подойдя несколько ближе к «семантическому сравнению», можно сообщить, когда идентификатор изменяется последовательно в блоке кода.
См. Наш http://www.semanticdesigns.com/Products/SmartDifferencer/index.html для получения информации о механизме сравнения на основе синтаксического дерева, который работает со многими языками и выполняет указанное выше приближение.
ИЗМЕНИТЬ Январь 2010 г .: Доступны версии для C ++, C #, Java, PHP и COBOL. На веб-сайте приведены конкретные примеры для большинства из них.
ИЗМЕНИТЬ Май 2010: добавлены Python и JavaScript.
ИЗМЕНИТЬ Октябрь 2010: добавлен EGL.
РЕДАКТИРОВАТЬ ноябрь 2010: добавлены VB6, VBScript, VB.net
источник
То, что вы нащупываете, - это "древовидное различие". Оказывается, сделать это намного сложнее, чем простой текстовый diff с линейной ориентацией, который на самом деле представляет собой просто сравнение двух плоских последовательностей.
" Детальный подход к структурному сравнению XML " завершается, в частности:
(курсив мой)
В самом деле, если вы ищете больше примеров дифференцирования деревьев, я предлагаю сосредоточиться на XML, поскольку он является движущей силой практических разработок в этой области.
источник
Бесстыдный штекер для собственного проекта:
HTML Tree Diff выполняет структурированное сравнение документов xml и html, написанных на python.
http://pypi.python.org/pypi/html-tree-diff/0.1.0
источник
Решение этой проблемы будет зависеть от языка. Т.е. если он не спроектирован с архитектурой плагина, которая откладывает большую часть синтаксического анализа кода в дерево и семантическое сравнение с плагином для конкретного языка, тогда будет очень сложно поддерживать несколько языков. Для какого языка (языков) вам нужен такой инструмент. Лично я бы хотел один для C #.
Для C # существует надстройка сборки diff для Reflector, но она делает diff только для IL, а не для C #.
Вы можете загрузить надстройку diff здесь [zip] или перейти к проекту на сайте codeplex здесь .
источник
Компания под названием Zynamics предлагает инструмент семантического сравнения двоичного уровня. Он использует язык мета-ассемблера под названием REIL для теоретико-графического анализа двух версий двоичного файла и создает график с цветовой кодировкой для иллюстрации различий между ними. Я не уверен в цене, но сомневаюсь, что это бесплатно.
источник
http://prettydiff.com/
Pretty Diff минимизирует каждый ввод, удаляя комментарии и ненужные пробелы, а затем украшает код до алгоритма сравнения. Я не могу придумать, как стать более семантическим, чем этот. И его написанный JavaScript, поэтому он запускается прямо в браузере.
источник