Подтвердить что ты не робот

Утилиты семантического разрыва

Я пытаюсь найти несколько хороших примеров утилит semantic diff/merge. Традиционная парадигма сравнения файлов исходного кода работает путем сравнения строк и символов.. но есть ли там какие-либо утилиты (для любого языка), которые фактически рассматривают структуру кода при сравнении файлов?

Например, существующие программы diff сообщают "разницу, найденную в символе 2 строки 125. Файл x содержит v-o-i-d, где файл y содержит b-o-o-l". Специализированный инструмент должен иметь возможность сообщить "Тип возврата метода doSomething() изменен с void на bool".

Я бы сказал, что этот тип семантической информации на самом деле является тем, что пользователь ищет при сравнении кода, и должен быть целью инструментов прогеммирования следующего поколения. Есть ли примеры этого в доступных инструментах?

4b9b3361

Ответ 1

Мы разработали инструмент, который способен точно справиться с этим сценарием. Проверьте http://www.semanticmerge.com

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

enter image description here

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

enter image description here

Это инструмент для слияния с языком, и было здорово окончательно ответить на этот вопрос: -)

Ответ 2

Eclipse имеет эту функцию в течение длительного времени. Это называется "Structure Compare", и это очень приятно. Вот пример скриншота для Java, за которым следует еще один файл XML:

(Обратите внимание на значки минус и плюс на методах в верхней панели.)

Eclipse's Java Structure ComparerКомпоновщик 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, поэтому он запускается непосредственно в браузере.