2

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

例子:

  1. 自动重构
  2. 获取函数并将其转换为 GUI(将函数输入转换为输入框)
  3. 向函数添加新功能,例如结果缓存。

最容易做到这一点的语言是语法简单的函数式语言,对吧?(lisp、scheme 等)?

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

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

(我试图通过编写可以用我的代码执行操作的代码来利用我作为一个程序员,一双双手可以做的事情。)

4

1 回答 1

0

您感兴趣的是“源到源”程序转换系统

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

除非标识符的含义很清楚,否则您通常无法真正转换代码。所以在实践中,您不仅需要解析,还需要构建符号表(此时您拥有相当于编译器前端的东西,而不是解析器)。许多转换需要跟踪信息流(控制流、数据流、指向、谁调用......)。如果没有这些特性,这些工具对于迄今为止构成大量源代码的过程/OO 语言不是很有效。(函数式语言的人可以通过较少的流分析来解决问题,因为一切都是一个表达式,但大多数编写的代码都不是函数式的,所以这在实际意义上并不重要)。

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

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

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

DMS 是为数不多的 C++ 源到源程序转换系统之一;它已被愤怒地用于对大型 C++ 程序进行更改。 我认为Clang非常接近,当然是雄心勃勃。Rose Compiler是另一种主要用于超级计算领域的编译器,但它们都是 C++(可能包含 C)特定的。

于 2011-08-20T17:32:56.113 回答