代码操作代码?请告诉我更多

时间:2011-08-20 16:40:27

标签: macros code-generation metaprogramming wasabi

当程序将源代码作为输入并吐出新的源代码并且可能立即运行新代码时,这是什么叫做?

示例:

  1. 自动重构
  2. 取一个功能并将其转换为GUI(将功能输入转换为输入框)
  3. 向函数添加新功能,例如结果缓存。
  4. 最简单的语言是语法简单的函数式语言,对吧? (口齿不清,计划等)?

    但是只要你能将源代码解析成树或其他数据结构,你就可以使用任何语言或语言之间进行,对吧? (使用antlr或其他工具?)

    那么,这叫什么?这样做的其他例子有哪些,无论大小?有哪些常用工具?请给我一个跳跃点,以便彻底了解这种类型的编程。

    (我试图利用我作为单个程序员,一双手,可以做的,通过编写代码来完成我的代码。)

1 个答案:

答案 0 :(得分:0)

您感兴趣的是“源到源”program transformation systems

解析器是必要的,但几乎不够。 (事实上​​,你正在使用的langauge 你的方言的解析器是必要的......鉴于人们使用这么多“编程”语言,这需要很多解析器)。您还需要捕获解析结果(通常作为树),能够以某种方式操作该树,然后从树中重新生成有效的源代码。如果您希望源代码永久更改为手动编程的源,则解析器/树/解析器组合必须保留代码格式和注释,以实现最大范围。

除非标识符的含义清楚,否则通常无法真正转换代码;所以在实践中你不仅需要解析而是构造符号表(此时你有相当于编译器前端,而不是解析器)。许多转换需要跟踪信息流(控制流,数据流,指向点,谁调用,......)。如果没有这些功能,这些工具对于构成大量源代码的过程/ OO语言并不十分有效。 (函数式语言的人可以通过较少的流分析得到,因为一切都是表达式,但大多数编写的代码都不起作用,所以这在实际意义上并不重要。)

有许多源到源转换系统,某些语言特定(例如,Java的JackPot);一些由langauge定义(TXL,Stratego,DMS)参数化。

某些特定语言提供了符号表和流分析。我知道只有一种转换可以为许多编程语言提供这些功能,那就是我们的DMS Software Reengineering Toolkit

DMS为许多真正的编程语言及其常见方言提供此功能,而不是玩具:C,Java,COBOL。

DMS是C ++中为数不多的源到源程序转换系统之一;它已被用于愤怒,以改变大型C ++程序。我认为Clang非常接近野心; Rose Compiler是另一个主要用于超级计算圈子的,但这些都是特定的C ++(可能带有C语言)。