Есть ли язык для автоматического изменения кода?

Я делаю некоторую работу, где мне нужно, чтобы иметь возможность описывать изменения в некотором программном коде, которые должны быть сделаны автоматически.

Есть ли язык, который позволяет описать это?

Язык должен иметь модули или функции, которые получают место в коде, где должна быть сделана модификация, и должны позволять указывать возможные модификации, которые должны быть сделаны.
Он должен позволять описывать модификации, такие как удаление заданной функции, добавление условия if вокруг фрагмента кода, добавление нового объявления функции, которая ничего не делает, и т. Д.
Изменения должны быть выполнены поверх дерева разбора, чтобы можно было восстановить исходный код, только с изменениями.
Мне даже не нужен язык, чтобы иметь связанный с ним анализатор или реализацию, все, что мне нужно, - это описание самого языка, либо в виде грамматики BNF, либо даже неофициально.

Я знаю, что phc, PHP-компилятор с опережением времени, способен преобразовывать исходный код в XML-представление и обратно, облегчая модификацию кода и его восстановление. Что мне нужно, так это способ описать действительные модификации XML, чтобы я мог запустить программу, которая может, например, удалить все экземпляры определенного вызова функции или добавить if (false) вокруг каждого. Кроме того, было бы лучше, если бы язык не зависел от языка, хотя это и не обязательно.

Вы думаете, что-то подобное существует?

2 ответа

Решение

Ключевая идея - программные преобразования. У Ондрея правильная идея с DMS, но я автор DMS, так что я, вероятно, предвзят.

Язык DMS, используемый для выполнения преобразований, называется "Язык спецификации правил (DMS)", или RSL, и используется для указания (преобразования программ) правил. Такое правило имеет:

  • имя (у нас их много, и это удобный способ ссылаться на них)
  • параметры (определяющие переменные шаблона), набранные в соответствии с интересующей грамматикой целевого языка,
  • левый паттерн "матч-это"
  • правая рука "заменить на этот" шаблон

Шаблоны часто пишутся в поверхностном синтаксисе целевого языка, то есть в собственном синтаксисе преобразовываемого языка с расширениями для переменных шаблона. Чтобы отличить синтаксис языка RSL от целевого языка, шаблоны пишутся в (мета) кавычках "...". Символ \ внутри паттернов - это (мета) выход обратно в RSL. Переменная шаблона пишется "\x". (Мета) функция foobar записывается как \foobar( ...), обратите внимание на (мета) экранирование в аргументах (мета) функций. Вне кавычек необходимы мета-экранированные символы, и эти конструкции пишутся без \, например, foobar(...).

Правила DMS могут быть намного более сложными, чем это, но это основы. Шаблоны синтаксиса поверхности не представляют текст; скорее они действительно представляют эквивалентные AST-коды кода в шаблонах. Правила DMS используются для сопоставления и изменения AST. Конечно, система преобразования программ должна иметь парсеры для создания AST и анти-парсеры ("prettyprinters") для преобразования AST обратно в текст. (DMS имеет большую библиотеку внешних языков для всех широко используемых языков на планете и многих необычных; мы только что добавили MUMPS).

Для ваших конкретных примеров подойдут следующие правила:

"... удаление данной функции":

rule remove_function(f:IDENTIFIER,p:parameters,b:body): declarations -> declarations
  "  \f \p \b " -> " ; "  -- replace function delcaration by empty declation
  if f==target_function_name();

... добавление условия if вокруг блока кода:

rule wrap_in_if(s:statement): statement -> statement
 " \s " ->  " \if ( \generated_condition\(\) ) \s ";

... добавление нового объявления функции, которое ничего не делает:

rule insert_noop_function(d:declarations): delcarations -> declarations
" \d " -> " \target_function\name\(\) ( )  { } ";

Как вы заметили, вы должны куда-то их указать; это работа "метапрограммы", которая определяет, где в вашем AST вы хотите применить правила, а затем применяет их. Для ваших правил вам нужен (с DMS) и явный процедурный метод, чтобы найти правильное местоположение. Для некоторых правил DMS вы можете просто применить их "везде"; DMS, по сути, обходит все обозначенные AST и применяет правила для вас.

Несколько правил никогда не бывают впечатляющими, так же как несколько строк кода не впечатляют. Несколько сотен или тысяч правил могут делать довольно захватывающие вещи (например, полные языковые переводы), точно так же, как несколько сотен или тысяч строк кода могут давать довольно интересные результаты. Разница в том, что обычный код работает с числами, строками и структурами, а инструменты преобразования программ вычисляются по программным структурам (AST).

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

DMS беззастенчиво коммерческое, и это не Dimestore инструмента, поэтому он не может быть то, что вам нужно для вашего тезиса.

Если не DMS, вы можете получить бесплатные инструменты, которые имеют те же идеи. Рассмотрим TXL (www.txl.ca) или StrategoXt (www.strategoxt.org). DMS, TXL, Stratego все выполняют программные преобразования с использованием шаблонов поверхностного синтаксиса, но TXL и Stratego не могут обрабатывать значительные изменения в коде, а также DMS IMHO. (Читайте об анализе потока на веб-сайте DMS по некоторым причинам). TXL и Stratego хороши для изучения основ и создания сильных демо-версий.

Ознакомьтесь с инструментарием реинжиниринга программного обеспечения DMS от Semantic Designs. Это может быть использовано для того, что вы ищете.

Другие вопросы по тегам