是否有任何语言来指定自动代码修改?

时间:2011-04-08 15:55:24

标签: automation program-transformation

我正在做一些工作,我需要能够描述一些自动完成的程序代码的修改。

是否有任何语言可以描述这个?

语言应具有接收代码中要进行修改的位置的模块或函数,并应允许指定可能的修改。
它应该允许描述修改,例如删除给定的函数,在一段代码周围添加if条件,添加一个什么都不做的新函数声明等。
修改应该在解析树上完成,因此只有修改才能恢复原始代码 我甚至不需要语言来解析器或实现相关联,我需要的只是语言本身的描述,无论是作为BNF语法还是非正式语法。

我知道PHP提前编译的PHP能够将源代码转换为XML表示并返回,从而更容易修改代码并恢复它。 我需要的是一种描述对XML的实际修改的方法,以便我可以运行一个程序,例如可以删除特定函数调用的所有实例,或者在每个函数调用周围添加if(false)。 此外,如果语言与语言无关,那将更好,尽管它不是必需的。

你觉得这样的事情存在吗?

2 个答案:

答案 0 :(得分:2)

从语义设计中查看DMS software reengineering toolkit。它可能用于您正在寻找的东西。

答案 1 :(得分:1)

关键的想法是program transformations。 Ondrej对DMS有正确的想法,但我是DMS的作者所以我可能有偏见。

用于完成转换的DMS语言称为“(DMS)规则规范语言”或RSL,用于指定(程序转换)规则。这样的规则有:

  • 一个名字(我们往往有很多名字,这是一种方便的方式来引用它们)
  • 参数(定义模式变量),根据目标语言语法输入,
  • 左手“匹配 - 此”模式
  • 右手“替换为此”模式

模式通常用目标语言的 surface-syntax 编写,即使用模式变量扩展进行转换的语言的本机语法。区分 来自目标语言的RSL语言语法,模式被写入(meta)引号“...”。内部模式中的\字符是(元)转义回RSL。模式变量写为“\ x”。 (meta)函数foobar 写成\ foobar(...),注意(meta)函数论证中的(meta)转义。在引号之外,需要元转义,这些构造是在没有\的情况下编写的,例如,foobar(...)。

DMS规则可能比这复杂得多,但这些是基础知识。表面语法模式不代表文本;相反,它们实际上代表了模式中代码的等效AST。 DMS规则用于匹配和更改AST。程序转换系统当然必须有解析器来生成AST,并使用反解析器(“prettyprinters”)将AST转换回文本。 (DMS有一个很大的langauge前端库,适用于地球上所有广泛使用的语言和许多不常见的语言;我们刚刚添加了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)。

complete worked example显示如何定义DMS的语言和规则,以及如何将这些规则应用于实现“程序修改”(该示例实际修改了“代数表达式”但想法完全相同)

DMS毫不夸张地是商业化的,它不是一个二聚体商店工具,因此它可能不是您论文所需要的。

如果不是DMS,您可以获得具有相同想法的免费工具。考虑TXL(www.txl.ca)或StrategoXt(www.strategoxt.org)。 DMS,TXL,Stratego都使用表面语法模式进行程序转换,但TXL和Stratego无法处理代码以及DMS恕我直言的大规模更改。 (由于某些原因,请阅读DMS网站上的流量分析)。 TXL和Stratego有助于学习基础知识并建立强大的演示。