元编程
元编程是指某类计算机程序的编写,这类计算机程序编写或者操纵其它程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。多数情况下,与手工编写全部代码相比,程序员可以获得更高的工作效率, 或者给与程序更大的灵活度去处理新的情形而无需重新编译。
编写元程序的语言称之为元语言。被操纵的程序的语言称之为目标语言。一门编程语言同时也是自身的元语言的能力称之为反射或者自反。
反射是促进元编程的一种很有价值的语言特性。把编程语言自身作为一级数据类型(如LISP,Forth或Rebol)也很有用。支持泛型编程的语言也使用元编程能力。
元编程通常通过两种方式实现。一种是通过应用程序编程接口(APIs)将运行时引擎的内部信息暴露于编程代码。另一种是动态执行包含编程命令的字符串表达式。因此,“程序能够编写程序”。虽然两种方式都能用于同一种语言,但大多数语言趋向于偏向其中一种。
示例
这是一个简单的使用bash脚本编写的元程序示例,同时也是一个产生式编程的例子:
#!/bin/bash # metaprogram echo '#!/bin/bash' >program for ((I=1; I<=992; I++)) do echo "echo $I" >>program done chmod +x program
这个脚本(或程序)生成了一个新的993行的程序来打印输出数字1至992。这只是一个怎样用代码来编写更多代码的示例;但并不是打印一串数字最有效的方法。尽管如此,一个程序员可以在几分钟内编写和执行这个元程序,却生成了近1000行的代码。
不是所有的元编程都需要产生式编程。如果一个程序可以在运行时改变或者可以使用增量编译(如Lisp,Forth,Perl,Python,REBOL,Smalltalk,Ruby,PHP,Tcl,Lua,Groovy,Frink和JavaScript),那么就可以在不实际生成源代码的情况下使用这种技术实现元编程。
最常见的元编程工具是编译器,它可以将程序员使用高级语言编写的相对短小的程序转换为等价的汇编语言或者机器语言程序。这是最基础的编程工具,在大多数情况下,直接编写机器语言程序是不太现实的。
编译器能够将一种语言转换为另一种,而其它元编程系统则允许以编程方式操纵一种语言。宏系统即是这样一种简单的系统。
在 Microsoft Office© 的程序中,宏可以记录一些特定的按键组合,并重新执行。另一方面,这些可执行代码可以通过点击宏选择界面的“编辑”按钮获得。
LISP恐怕是具备元编程能力的典范语言,不仅因为它在历史上优先发展,更由于它的元编程的简洁与强大。在Lisp元编程中,准引用操作符(通常是一个逗号)引入的代码是在程序定义时而不是运行时被赋值。元编程语言因此等价于主编程语言,并且在需要的时候,已经存在的Lisp例程还可以直接重用于元编程。
在程序中嵌入直接处理程序数据的解释器即可实现这一目的。现在已经有一些用于常用高级语言的实现,例如RemObject为Object Pascal编写的Pascal Script。
另一个很常用的元编程例子是lex和yacc,这两个工具用来生成词法分析器和语法分析器。Yacc通常用作编译器的编译器,生成能够将高级语言转换为机器语言的工具。
quine是一种源代码等于输出的特殊的元程序。
面向语言的程序设计是一种强烈关注元编程的编程风格,通过领域特定语言来实现。
宏用于产生式编程
IBM System/360及其衍生物拥有强大的汇编宏工具,通常用于生成完整的程序或者程序片段(比如针对不同操作系统)。CICS事务处理系统也提供了汇编宏,可以生成用于预处理阶段的COBOL语句。
更多内容
元编程实现
外部链接
- Code generation Vs Metaprogramming
- The Art of Enterprise Metaprogramming
- c2.com Wiki: Metaprogramming article
- "Solenoid": The first metaprogramming framework for eXist-db
-
本文介绍的是编程技术。关于管理技术,请参看“元编程 (管理)”。