84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
元编程:编写在运行时操纵语言构件的代码。 --《Ruby元编程》
应该是借鉴了lisp里的宏(macro)。其他语言里还有类似的用法吗?
人生最曼妙的风景,竟是内心的淡定与从容!
这样来说吧: 工业时代初期,是这样的情况: 人生产机器,机器生产产品。
到了后期: 人生产机器,机器生产机器,机器生产产品。
显然,机器生产机器是一个了不起的进步,这大大的解放了劳动力。
元编程就类似于机器生产机器,简单说就是程序可以自己改变自己或者生成新的程序。这样的当然大大的解放了程序员。
当然,事实上在元编程之前,程序员就发明了大量的辅助工具来帮助自己编程,例如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++模板元编程。
Javascript 就有呀!
http://www.slideshare.net/danwrong/metaprogramming-javascript
注意这个 presentation 的发表日期,这已经不是什么新鲜玩意儿了,这些年随着语言的不断完善和扩展,还有更多的元编程技巧被广泛应用,你可以 google 一下。
另外,支持元编程的语言是非常普遍的,几乎所有的函数式编程语言都可以,Java 有 Annotation,Clojure 自不必说。Lisp 基于宏,Ruby 和 Smalltalk 类似都是主要利用反射机制。还有像 Groovy 是基于字节编码和 AST 转换等等。
元编程算是进阶技巧,但不是什么魔法,也不是很罕见的特性。
这样来说吧:
工业时代初期,是这样的情况:
人生产机器,机器生产产品。
到了后期:
人生产机器,机器生产机器,机器生产产品。
显然,机器生产机器是一个了不起的进步,这大大的解放了劳动力。
元编程就类似于机器生产机器,简单说就是程序可以自己改变自己或者生成新的程序。这样的当然大大的解放了程序员。
当然,事实上在元编程之前,程序员就发明了大量的辅助工具来帮助自己编程,例如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++模板元编程。
Javascript 就有呀!
http://www.slideshare.net/danwrong/metaprogramming-javascript
注意这个 presentation 的发表日期,这已经不是什么新鲜玩意儿了,这些年随着语言的不断完善和扩展,还有更多的元编程技巧被广泛应用,你可以 google 一下。
另外,支持元编程的语言是非常普遍的,几乎所有的函数式编程语言都可以,Java 有 Annotation,Clojure 自不必说。Lisp 基于宏,Ruby 和 Smalltalk 类似都是主要利用反射机制。还有像 Groovy 是基于字节编码和 AST 转换等等。
元编程算是进阶技巧,但不是什么魔法,也不是很罕见的特性。