Вопрос

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

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

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

Это было полезно?

Решение

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

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

enter image description here

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

enter image description here

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

Другие советы

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

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

Eclipse's Java Structure Comparer Eclipse's XML Structure Comparer

Чтобы хорошо выполнять "семантические сравнения", вам нужно сравнить синтаксические деревья языков и принять во внимание значение символов.Действительно хорошее семантическое различие позволило бы понять семантику языка и осознать когда один блок кода был эквивалентен по функции другому.Чтобы зайти так далеко, требуется доказательство теоремы, и, хотя это было бы чрезвычайно мило, в настоящее время непрактично для реального инструмента.

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

Смотрите наш http://www.semanticdesigns.com/Products/SmartDifferencer/index.html для механизма сравнения на основе синтаксического дерева, который работает со многими языками, это делает приведенное выше приближение.

РЕДАКТИРОВАТЬ Январь 2010:Доступны версии для C ++, C #, Java, PHP и COBOL.На веб-сайте приведены конкретные примеры большинства из них.

РЕДАКТИРОВАТЬ Май 2010:Добавлены Python и JavaScript.

РЕДАКТИРОВАТЬ Октябрь 2010:Добавил ЭГЛ.

РЕДАКТИРОВАТЬ Ноябрь 2010:VB6, VBScript, VB.net добавлен

То, что вы ищете, - это "разница в дереве".Оказывается, это гораздо сложнее сделать хорошо, чем простое текстовое различие, ориентированное на строку, которое на самом деле представляет собой просто сравнение двух плоских последовательностей.

"Детализированный подход к структурному сравнению XML"заключает, частично с:

Наше теоретическое исследование, а также наша экспериментальная оценка показали, что предлагаемый метод дает улучшенные результаты структурного сходства по отношению к существующим альтернативам, при той же временной сложности (O(N^2))

(курсив мой)

Действительно, если вы ищете больше примеров различения деревьев, я предлагаю сосредоточиться на XML, поскольку это стимулирует практические разработки в этой области.

Бесстыдная заглушка для моего собственного проекта:

HTML Tree Diff выполняет структурно-ориентированное сравнение xml- и html-документов, написанных на python.

http://pypi.python.org/pypi/html-tree-diff/0.1.0

Решение этой проблемы было бы на основе каждого языка.То есть.если он не разработан с использованием архитектуры плагина, которая переносит большую часть синтаксического анализа кода в дерево и семантическое сравнение с плагином, специфичным для конкретного языка, то поддерживать несколько языков будет очень сложно.Для какого языка (языков) вы заинтересованы в наличии такого инструмента?Лично я бы с удовольствием сделал один для C #.

Для C # существует надстройка assembly diff для Reflector, но она выполняет diff только в IL, а не в C #.

Вы можете загрузить надстройку diff здесь [zip] или перейдите к проекту на сайте codeplex здесь.

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

http://prettydiff.com/

Pretty Diff минимизирует каждый ввод, чтобы удалить комментарии и ненужные пробелы, а затем украшает код, предшествующий алгоритму diff.Я все равно не могу придумать, как сделать код более семантичным, чем этот.И, это написанный JavaScript, поэтому он запускается непосредственно в браузере.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top