超级范式:元编程
模板元编程即
Template Metaprogramming
,与
GP
密切相关但自成一派,隶属于另一种编程范式
——
元编程(
Metaprogramming
),简称
MP
。这里的前缀
‘meta-’
常译作
‘
元
’
,其实就是
‘
超级
’
,
‘
行而上
’
的意思。比如,元数据(
Metadata
)是关于数据的数据
,元对象(
Metaobject
)
是关于对象的对象,依此类推,元编程自然是关于程序的程序,或者说是编写、操纵程序的程序。
例子:假设你需要批量处理用户文档,其格式结构预先给定,但既不像
CSV
(逗号分隔)那么简单,也不像
XML
那么标准,并且用户随时可能改变格式标准,请问如何设计这段程序?
最佳解法:利用元编程,根据不同的格式标准自动生成相应的解析器代码。
可用工具
Lex
和
Yacc
(
编写编译器和解释器的工具
)
。它们能根据格式标准生成相应的解析器代码。更妙的是,格式标准不限于静态数据,甚至可以含有动态指令!这意味着用户不仅能定义业务数据格式,还能定义业务流程乃至领域特定语言
DSL(Domain Specific Language)
,而这其实涉及到另一种编程范式:语言导向式编程(
Language-Oriented
Programming
)
。如果在此基础上再用图形界面包装一下,那么你的客户会欣喜地发现,他们只要点点鼠标就可以改变整个业务流程了,而这一切不仅不需要软件开发方的参与。
编译器本身就是元编程的典型范例
——
把高级语言转化为汇编语言或机器语言的程序,不就是能写程序的程序吗?其实元编程的例子比比皆是:许多
IDE
如
Visual
Studio
、
Delphi
、
Eclipse
等均能通过向导、拖放控件等方式自动生成代码;
UML
建模工具将类图转换为代码;
Servlet
引擎将
JSP
转换为
Java
代码等等。
自动生成源代码的编程也属于另一种编程范式
——
生成式编程(
Generative
Programming
)的范畴。有的元编程虽不生成源代码,却能修改程序。
从低级的汇编语言到一些高级的动态语言如
Perl
、
Python
、
Ruby
、
JavaScript
、
Lisp
、
Prolog
等均支持此类功能。