Ответ 1
Наш Инструмент DMS Software Reengineering Toolkit пытается стать инструментом, который вы хотите. Но это толкает современное состояние и не является инструментом стиля нирваны. Это достаточно хорошо, чтобы делать настоящую, интересную работу.
DMS предоставляет общие возможности для анализа, анализа и преобразования исходного кода.
Он использует явные грамматики для определения языков (таких как C и С++); грамматики управляют парсерами, которые строят абстрактные синтаксические деревья (АСТ). Различные примитивы анализа обеспечивают: а) средства [ "грамматики атрибутов" ATG] для сбора информации по древовидным путям информационных потоков, которые хорошо соответствуют форме AST, b) построение использования символа для карт определения символов [ "таблиц символов" ], c) контроль и анализ потока данных с использованием фактов, извлеченных ATG, d) анализ диапазона, e) анализ точек как локального, так и глобального. Эти примитивные анализаторы могут быть использованы для составления фактов из АСТ, чтобы сделать выводы о коде, представленном АСТ (например, "это утверждение изменяет эти переменные" ). A langauge front end объединяет грамматику и анализаторы, специфичные для языка, в многоразовом комплекте. DMS имеет такие языковые интерфейсы с разной степенью глубины и зрелости для самых разных языков.
[EDIT 6/27: передние концы C и С++ поддерживают определенные диалекты C и С++: ANSIC, C99, GCC3/4 C, MS Visual C, ANSI С++ 98, ANSI С++ 11, GCC3/4 С++, MS Visual С++ 2005/2008/2010. Если вам нужен точный анализ кода, вы должны использовать "правильный" диалект для обработки вашего кода.]
Но "анализ" не тот момент. Цель анализа - изменить ситуацию. DMS предоставляет дополнительную поддержку для процедурного изменения АСТ, для изменения АСТ посредством правил перезаписи источника-источника, написанных в поверхностном синтаксисе языка ( оба обусловлены каким-то выбранным результатом анализа) или группировать группы процедурных и исходных переписаний вместе, чтобы сделать сложные сложные перезаписи, которые могут переносить массовые изменения кода, такие как переструктурирование и т.д. После преобразования АСТ, они могут использоваться для регенерации ( "prettyprint" ) синтаксически корректного кода на соответствующем интерфейсе языка/диалекта. [Модифицируя АСТ для одного языка кусочно, пока у вас нет АСТ для другого, вы можете создавать переводчиков, но это не так просто, как это предложение подразумевает].
Это все работает в значительной степени, но все же несколько замешано в некоторых языковых осложнениях. Для C и С++ известным сложным является препроцессор; редактируя текст программы произвольно, условные обозначения препроцессора могут сделать исходный код невозможным для чего-либо, похожего на стандартную технологию синтаксического анализа. Передние концы DMS C и С++ немного улучшают эту ситуацию и могут анализировать код с хорошо структурированными директивами препроцессора, включая некоторые странные случаи, которые большинство людей не называли структурированными, но которые обычно встречаются:
#IF cond
if (abc) {
#ELSE
if (def) {
#ENDIF
Мы делаем интересный прогресс в анализе кода с произвольным размещением условных препроцессоров. Но как только вы это сделаете, теперь все ваши анализаторы внезапно вынуждены учитывать условные условия препроцессора, и мы все внезапно сталкиваемся с тем, что люди-компиляторы на самом деле не посетили.
DMS используется для создания крупных архитектурных сдвигов в больших программах на С++, конвертирования из стиля не CORBA в стиль CORBA с огромным количеством перетасовки кода, для извлечения кода по произвольным путям управления потоком для создания API-интерфейсов SOW-стиля для существующих C, чтобы вставить инструментарий в большие программы на C, чтобы обнаружить ошибки указателя и т.д. [Это было применено к другим задачам на многих других языках].
В нашем собственном опыте это довольно сложно использовать. По нашему мнению, это в том же смысле, что демократия является наихудшей из всех систем правления, за исключением всех остальных; YMMV. На веб-сайте имеется множество инструментов и дискуссий, основанных на DMS.
Фактически он использовался для извлечения функций (SOW-упражнение гораздо более общее, чем это) и вставки функций (это обобщенный случай инструментария).
Такие инструменты, как GCC-XML, являются тенями возможностей DMS. GCC-XML анализирует, строит таблицы символов и выдает декларации данных (а не код), но не может изменять какие-либо изменения кода. Кланг лучше; он анализирует C и С++ для АСТ, может анализировать промежуточное представление LLVM и имеет какой-то механизм для выплескивания к последующим исправлениям в исходный текст, вдохновленный желаемым изменением дерева. Я не знаю, может ли Clang выполнять массовые преобразования кода, особенно те, где один результат преобразования снова преобразуется (как вы модифицируете дерево для отложенного текстового патча?). DMS может делать это весь день и может делать это для многих языков, отличных от C и С++, и может делать это для произвольной смеси известных ему языков.
До тех пор, пока проблема препроцессора с условиями не будет решена, анализ/преобразование кода C и С++ будет непростым. Мы преуспеваем в этих задачах на этих языках только благодаря силе воли и используем самые сильные инструменты, которые мы можем построить. (Java не имеет этих проблем, и DMS соответственно лучше анализирует/преобразует его).
При серьезном риске высокомерия, я считаю, что DMS является лучшим инструментом для анализа и трансформации общего назначения. Как его архитектор, я рассматриваю его как свою долгосрочную работу, чтобы сделать его еще более сильным для этой задачи.