Macros 在代码上运行的代码?请告诉我更多

Macros 在代码上运行的代码?请告诉我更多,macros,code-generation,metaprogramming,wasabi,Macros,Code Generation,Metaprogramming,Wasabi,当一个程序将源代码作为输入,输出新的源代码,并且可能立即运行新代码时,这叫什么 示例: 自动重构 将函数转换为GUI(将函数输入转换为输入框) 向函数添加新功能,如结果缓存 最简单的语言是语法简单的函数式语言,对吗?(lisp、scheme等) 但是你可以用任何一种语言或者两种语言之间,只要你能把源代码解析成树或者其他数据结构,对吗?(使用antlr或其他工具?) 那么,这叫什么?其他的例子有哪些,大的和小的?有哪些常用工具?请给我一个起点,让我彻底了解这类编程 (我试图利用我作为一个程序员,一

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

示例:

  • 自动重构
  • 将函数转换为GUI(将函数输入转换为输入框)
  • 向函数添加新功能,如结果缓存
  • 最简单的语言是语法简单的函数式语言,对吗?(lisp、scheme等)

    但是你可以用任何一种语言或者两种语言之间,只要你能把源代码解析成树或者其他数据结构,对吗?(使用antlr或其他工具?)

    那么,这叫什么?其他的例子有哪些,大的和小的?有哪些常用工具?请给我一个起点,让我彻底了解这类编程


    (我试图利用我作为一个程序员,一双手所能做的事情,通过编写代码来处理我的代码。)

    您感兴趣的是“源代码到源代码”

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

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

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

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

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


    DMS是C++中几种源程序转换系统之一;它已经被愤怒地用于对大型C++程序进行更改。我认为,在雄心壮志方面,这是相当接近的;另一个主要用于超级计算圈,但这两个都是C++(可能是C抛出)。

    < P>你感兴趣的是“源到源”。

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

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

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

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

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


    DMS是C++中几种源程序转换系统之一;它已经被愤怒地用于对大型C++程序进行更改。我认为,在雄心壮志方面,这是相当接近的;另一个主要用于超级计算圈,但这两个都是C++(也许是C抛出)。

    我不知道,我把它们叫做代码生成器。对于那些提出“关闭”的人来说,这个问题是完全有意义的。你使用的是正确的标签——它叫做元编程。一些具有增量编译支持和编译时宏扩展的语言可以自然地做到这一点(Lisp就是其中之一)。我不知道,我称它们为代码生成器。对于那些提出“关闭”的人来说:这个问题非常有意义。您使用了正确的标记-它被称为元编程。一些支持增量编译和编译时宏扩展的语言可以自然地做到这一点(Lisp就是其中之一)