Есть ли язык для указания автоматических модификаций кода?

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

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

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

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

Как вы думаете, существует ли нечто подобное?


person Francisco Vieira    schedule 08.04.2011    source источник
comment
Вы используете здесь два языка, и у меня возникают проблемы с пониманием того, какой есть какой, и это вызывает странные фразы, например, если язык не зависит от языка. Пожалуйста, попробуйте описать это с большим разделением между программным обеспечением, которое вы хотите запустить, чтобы изменить программное обеспечение, которое вы используете.   -  person David Thornley    schedule 08.04.2011
comment
Два языка — это язык, описывающий модификации, и язык исходного кода, который необходимо изменить. Везде, где я использую слово «язык», оно означает первое, за исключением бита, не зависящего от языка, что означает, что язык (первый) не должен заботиться о языке (последнем) исходного кода.   -  person Francisco Vieira    schedule 08.04.2011
comment
Если вы настаиваете на манипулировании XML-представлениями кода, тогда XSLT будет идеальным ответом, не зависящим от языка. Вы обнаружите, что вам нужно а) говорить то, что зависит от языка, и б) говорить об изменениях, зависящих от языка, в XSLT не совсем удобно. Ваша лучшая надежда — это механизм преобразования программы из исходного кода в исходный, который в значительной степени поможет вам избежать изучения наноскопических деталей AST и позволит вам формулировать изменения с точки зрения языка, который вы собираетесь модифицировать.   -  person Ira Baxter    schedule 14.04.2011


Ответы (2)


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

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

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

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

Правила DMS могут быть намного сложнее, но это основы. Паттерны поверхностного синтаксиса не представляют текст; скорее, они действительно представляют собой эквивалентные AST кода в шаблонах. Правила DMS используются для сопоставления и изменения AST. Система преобразования программ, конечно же, должна иметь синтаксические анализаторы для создания AST и анти-парсеры («красивые принтеры») для преобразования 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 беззастенчиво коммерческий, и это не инструмент для продажи в магазине, так что это может быть не то, что вам нужно для вашей диссертации.

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

person Ira Baxter    schedule 14.04.2011
comment
Отлично, это именно то, что я хотел! Я попробую применить это в своей диссертации, мне не нужно, чтобы это работало, мне просто нужны примеры того, как это будет работать, так что этого достаточно! Благодарю вас! (Я бы проголосовал за вас, но у меня пока недостаточно репутации =P) - person Francisco Vieira; 15.04.2011

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

person Ondrej Tucny    schedule 08.04.2011
comment
Я не сомневаюсь, что мог бы использовать его, но как студент, пытающийся сделать свою магистерскую диссертацию, у меня нет денег, необходимых для покупки такого программного обеспечения, и я не мог найти место, где этот язык представлен бесплатно. - person Francisco Vieira; 08.04.2011
comment
Вы должны исследовать что-то лучше! Если вы полагаетесь в своей магистерской диссертации на коммерческое программное обеспечение, которое делает все, чего вы хотите достичь, все равно не принесет вам степень ;-) - person Ondrej Tucny; 09.04.2011
comment
Если бы я исследовал это вдобавок к тому, что я уже изучаю, я бы заслужил не одну, а две степени! =P Мне просто нужен был язык для использования в качестве небольшого компонента в более крупной архитектуре, которую я разрабатываю, и если я не найду его, мне просто придется быть более абстрактным при объяснении того, как этот компонент будет работать. Но все равно спасибо! - person Francisco Vieira; 10.04.2011