Утилиты семантического разрыва
Я пытаюсь найти несколько хороших примеров утилит semantic diff/merge. Традиционная парадигма сравнения файлов исходного кода работает путем сравнения строк и символов.. но есть ли там какие-либо утилиты (для любого языка), которые фактически рассматривают структуру кода при сравнении файлов?
Например, существующие программы diff сообщают "разницу, найденную в символе 2 строки 125. Файл x содержит v-o-i-d, где файл y содержит b-o-o-l". Специализированный инструмент должен иметь возможность сообщить "Тип возврата метода doSomething() изменен с void на bool".
Я бы сказал, что этот тип семантической информации на самом деле является тем, что пользователь ищет при сравнении кода, и должен быть целью инструментов прогеммирования следующего поколения. Есть ли примеры этого в доступных инструментах?
Ответы
Ответ 1
Мы разработали инструмент, который способен точно справиться с этим сценарием. Проверьте http://www.semanticmerge.com
Он объединяет (и отличается) на основе структуры кода и не использует текстовые алгоритмы, что в основном позволяет вам иметь дело с такими случаями, как следующее, включая сильный рефактор. Он также способен отображать как различия, так и конфликты слияния, как вы можете видеть ниже:
![enter image description here]()
И вместо того, чтобы путаться с перемещаемыми текстовыми блоками, поскольку он сначала анализирует, он способен отображать конфликты на основе каждого метода (фактически на каждый элемент). В случае, подобном предыдущему, даже ручные конфликты не будут решены.
![enter image description here]()
Это инструмент для слияния с языком, и было здорово окончательно ответить на этот вопрос: -)
Ответ 2
Eclipse имеет эту функцию в течение длительного времени. Это называется "Structure Compare", и это очень приятно. Вот пример скриншота для Java, за которым следует еще один файл XML:
(Обратите внимание на значки минус и плюс на методах в верхней панели.)
Компоновщик XML-структуры Eclipse http://help.eclipse.org/ganymede/topic/org.eclipse.pde.doc.user/whatsNew/images/xml-compare.png
Ответ 3
Чтобы выполнить "семантические сравнения", вам нужно сравнить синтаксические деревья
языков и учитывать значение символов. Действительно
хороший семантический diff понимает семантику языка и реализует
когда один блок кода был эквивалентен функции другому. Собирается
для этого требуется теоретическая проверка, и хотя это было бы чрезвычайно
милый, в настоящее время не практичен для реального инструмента.
Работоспособная аппроксимация этого - просто сравнение синтаксических деревьев и отчетность
изменения в строках, вставленные, удаленные, перемещенные или измененные.
Приблизившись к "семантическому сравнению", можно было бы сообщить
когда идентификатор последовательно изменяется по блоку кода.
См. наш http://www.semanticdesigns.com/Products/SmartDifferencer/index.html
для синтаксического древовидного механизма сравнения, который работает со многими языками, что делает
вышеприведенное приближение.
EDIT Jan 2010: Версии доступны для С++, С#, Java, PHP и COBOL.
Веб-сайт показывает конкретные примеры для большинства из них.
EDIT Май 2010: добавлены Python и JavaScript.
EDIT Oct 2010: добавлен EGL.
EDIT Ноябрь 2010: добавлены VB6, VBScript, VB.net
Ответ 4
То, что вы нащупываете, - это "разброс дерева". Оказывается, это намного сложнее сделать, чем простой текстовой интерпретатор, который на самом деле является просто сравнением двух плоских последовательностей.
" Подчеркнутый метод структурного сопоставления XML" заключает, в частности:
Наши теоретические исследования, а также наша экспериментальная оценка показал, что предложенный метод дает улучшенные результаты структурного сходства с по сравнению с существующими альтернативами, имея при этом ту же сложность времени (O (N ^ 2))
(акцент мой)
В самом деле, если вы ищете больше примеров разницы в деревьях, я предлагаю сосредоточиться на XML, поскольку это привело к практическим изменениям в этой области.
Ответ 5
Бесстыдный плагин для моего собственного проекта:
HTML Tree Diff сопоставляет XML-документы и html-документы, ориентированные на структуру, написанные на python.
http://pypi.python.org/pypi/html-tree-diff/0.1.0
Ответ 6
Решение для этого было бы основано на каждом языке. То есть если он не разработан с плагиновой архитектурой, которая отвлекает много разбора кода в дерево и семантическое сравнение с языковым плагином, тогда будет очень сложно поддерживать несколько языков. На каком языке вас интересует такой инструмент. Лично я бы хотел один для С#.
Для С# есть надстройка сборки diff для Reflector, но только для diff используется IL, а не С#.
Вы можете скачать дополнение diff здесь [zip] или перейти к проекту на сайте codeplex здесь.
Ответ 7
Компания Zynamics предлагает инструмент семантического разграничения на двоичном уровне. Он использует мета-ассемблерный язык REIL для выполнения теоретико-графического анализа двух версий двоичного кода и создает цветно-кодированный граф, чтобы проиллюстрировать различия между ними. Я не уверен в цене, но я сомневаюсь, что это бесплатно.
Ответ 8
http://prettydiff.com/
Pretty Diff минимизирует каждый вход для удаления комментариев и ненужного пробела, а затем украшает код до алгоритма diff. В любом случае, я не могу думать о том, чтобы стать более семантическим кодом, чем это. И его письменный JavaScript, поэтому он запускается непосредственно в браузере.