Ruby的元编程(Metaprogramming)在其他语言中是否有相似的技术?

【字号: 日期:2022-10-20浏览:15作者:雯心

问题描述

元编程:编写在运行时操纵语言构件的代码。 --《Ruby元编程》

应该是借鉴了lisp里的宏(macro)。其他语言里还有类似的用法吗?

问题解答

回答1:

这样来说吧:工业时代初期,是这样的情况:人生产机器,机器生产产品。

到了后期:人生产机器,机器生产机器,机器生产产品。

显然,机器生产机器是一个了不起的进步,这大大的解放了劳动力。

元编程就类似于机器生产机器,简单说就是程序可以自己改变自己或者生成新的程序。这样的当然大大的解放了程序员。

当然,事实上在元编程之前,程序员就发明了大量的辅助工具来帮助自己编程,例如IDE什么的。只是后来程序员觉得IDE啥的还是太弱了,就能查找替换跳到引用套用模板啥的,要是程序可以自己生产自己该多好。

====================科普完毕,下面是不负责任的畅想=====================

事实上meta-programming一直都不是一个定义良好的概念,主要是meta(元)这个词本身的含义就很模糊。

元一般被理解为更基本的,更基础的。元编程就是比程序更基础的的编程,也就是程序生成程序。从这个角度上来说,无论是C++的模板、C的宏、.NET的Emit和Compiler Provider、JavaScript的字符串拼接和eval,甚至于什么动网代码生成器,都是程序生成程序。

但是一般而言,要称得上元编程还是要满足一定的条件,当然,由于元编程这个概念并非是定义良好,这些条件也只能算得上是什么共识。这个语言的特性被A当作是元编程,而B不这么认为是很正常的事情,下面列举的这些条件,仅仅只是站在我的角度认为的:

1、具备元编程能力的语言,必须是可以产生同一程序设计语言代码的语言,而不能是用一种语言产生另一种语言的程序。这就把代码生成器排除在外了。2、具备元编程能力的语言,元编程产生的程序代码,必须能够通过词法分析。这一条把C的宏排除在外和JavaScript的eval排除在外了。……

可以看出来,到底算得上元编程,采用不同的限制条件可以得到不同的结果。当我们讨论一个程序设计语言是不是可以元编程时,条件1基本是可以达成共识,条件2就各有各的看法。

话说元编程最初产生的时候,单纯只是为了减轻程序员的负担,C++的模板最初只是重载的一个延伸。由于强类型的缘故,C语言必须针对不同的类型编写一大堆重复的代码,重载解决了这些重复代码的名称污染,而泛型则开始解决这些代码的重复。但C++标委会那群家伙显然不会像Anders那样止步于泛型,高端大气上档次一直是C++努力不懈的追求,所以泛型就被搞成了模板,更进一步的,程序员也一起来Happy,就玩出了C++模板元编程。

回答2:

Javascript 就有呀!

http://www.slideshare.net/danwrong/metaprogramming-javascript

注意这个 presentation 的发表日期,这已经不是什么新鲜玩意儿了,这些年随着语言的不断完善和扩展,还有更多的元编程技巧被广泛应用,你可以 google 一下。

另外,支持元编程的语言是非常普遍的,几乎所有的函数式编程语言都可以,Java 有 Annotation,Clojure 自不必说。Lisp 基于宏,Ruby 和 Smalltalk 类似都是主要利用反射机制。还有像 Groovy 是基于字节编码和 AST 转换等等。

元编程算是进阶技巧,但不是什么魔法,也不是很罕见的特性。

相关文章: