元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在编译时完成部分本应在运行时完成的工作。很多情况下比手工编写全部代码相比工作效率更高。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。一门语言同时也是自身的元语言的能力称之为反射。 反射是促进元编程的一种很有价值的语言特性。把编程语言自身作为头等对象(如Lisp或Rebol)也很有用。支持泛型编程的语言也使用元编程能力。 元编程通常有两种方式起作用。一种方式是通过应用程序接口(API)来暴露运行时引擎的内部信息。另一种方法是动态执行包含编程命令的字符串。因此,“程序能编写程序”。虽然两种方法都能用,但大多数方法主要靠其中一种。
使用示例
一个简单元编程的例子是使用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、Ruby、Python、Smalltalk、Lua、Groovy和JavaScript),这种技术可以不实际生成源代码就使用元编程。 在Ruby中,最常用的就是attr系列方法,譬如attr、attr_reader、attr_writer、attr_accessor。attr_reader方法为一个实例变量产生一个用于读取其值的方法,attr_writer为其产生一个用于写入值的方法,attr_accessor则同时具有这两种功能。 class Foo attr_reader :just_read attr_writer :just_write attr_accessor :both_read_and_write def initialize @just_read = 0 @just_write = 0 @both_read_and_write = 0 end end # 输出attr系列方法生成的方法 puts Foo.instance_methods - Foo.superclass.instance_methods 最常用的元编程工具是编译器,把高级语言转换为汇编语言或机器语言。更灵活的方法是在程序中嵌入解释器直接处理程序数据。有一些实现例如为Object Pascal编写的RemObject's Pascal Script。 另一个很常用的元编程例子是lex和yacc,用来生成词法分析器和语法分析器。Yacc通常用作编译器的编译器,生成一个把高级语言转换为机器语言的工具。 quine是一种源代码等于输出的特殊的元程序。 面向语言的程序设计是一种强烈关注元编程的编程风格,通过领域特定语言来实现。