Hello World
Spiga

编程语言的发展趋势及未来方向(5):元编程

2010-05-30 17:42 by 老赵, 10481 visits

这是Anders Hejlsberg(不用介绍这是谁了吧)在比利时TechDays 2010所做的开场演讲。由于最近我在博客上关于语言的讨论比较多,出于应景,也打算将Anders的演讲完整地听写出来。在上一部分中,Anders谈及了他眼中编程语言的另一个发展趋势:动态性。在这一部分中,Anders则讨论了动态语言所擅长的“元编程”,并简单介绍了他为静态类型语言所设计的一种改进方案:编译器即服务。

如果没有特别说明,所有的文字都直接翻译自Anders的演讲,并使用我自己的口语习惯表达出来,对于Anders的口误及反复等情况,必要时在译文中自然也会进行忽略。为了方便理解,我也会将视频中关键部分进行截图,而某些代码演示则会直接作为文章内容发表。

(听写开始,接上篇

动态语言的另一个关键和有趣之处在于“元编程”。“元编程”实际上是“代码生成”的一种别称,其实在日常应用中我们也经常依赖这种做法。观察动态语言适合元编程的原因也是件十分有趣的事情。

在这个蓝框中是一段Ruby on Rails代码(见上图)。简单地说,这里定义了一个Order类,继承了ActiveRecord,也定义了一些关系,如belongs_to和has_many关系。Ruby这种动态语言的关键之处,在于一切事物都是通过执行而得到的,包括类型声明。比如这里的类型申明执行了belongs_to和has_many方法的调用,执行belongs_to会截获一对多或一对一关系所需要的信息,因此在这里语言是在运行的时候,动态为自身生成了代码。

实现这点在动态语言里自然会更容易一些,因为它们没有编译期和执行期的区别。静态类型语言在这方面会比较困难。例如在C#或Java里使用ORM时,传统的做法是让代码生成器去观察数据库,生成一大堆代码,然后再编译,有些复杂。不过我时常想着去改善这一点。

其中一种做法,是我们正在努力实现的“编译器即服务”,我现在先对它进行一些简单的介绍。传统的编译器像是一个黑盒,你在一端输入代码,而另一端便会生成.NET程序集或是对象代码等等。而这个黑盒却很神秘,你目前很难参与或理解它的工作。

你可以想象,一些代码往往是不包含在源文件中的。如果你想要交互式编程的体验,例如一个交互式的提示符,那么代码不是保存在源文件中而是由用户输入的。如果您在实现一个DSL,例如Windows Workflow或是Biztalk,则可能用C#或VB实现了一些需要动态执行的规则,它们也不是保存在源文件中,而可能是放在XML属性中的。此时你想编译它们却做不到,你还是要把它们放入源文件,这就变的复杂了。

另一方面,对于编译器来说,我们不一定需要它生成程序集,有时候需要的是一些树状的表现形式。例如一些由用户反射生成的代码,便可能不要程序集而是一个解析树,然后可以对它进行识别和重写。因此,我们可能越来越需要的是一些API,以此开放编译器的功能。

例如,你可以给它一小段代码,让它返回一段可执行的程序,或是一个可以识别或重写的解析树。这么做可以让静态类型语言获得许多有用的功能,例如元编程,以及可操作的完整的对象模型等等。我们正在朝这方面努力,我也会在下午1点的C# 4.0演讲中谈论更多这方面的内容。

(未完待续)

相关文章

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

7 条回复

  1. dogstar
    125.122.26.*
    链接

    dogstar 2010-05-30 19:46:16

    赵姐夫,变短了.

  2. 老赵
    admin
    链接

    老赵 2010-05-30 20:32:37

    @dogstar

    这一部分本来就短,不过马上就会有下一部分内容了。

  3. jiangzhen
    120.35.61.*
    链接

    jiangzhen 2010-05-30 20:54:06

    :):):):):):):):):):):)

    (您说哥们字数太少,所以我就多来几个笑脸吧)

  4. 老菜
    60.215.45.*
    链接

    老菜 2010-05-31 08:12:48

    昨天没及时过来看,今天过来时,老赵已经写了两篇文章。两篇一起学习。

  5. zhuisha
    114.250.110.*
    链接

    zhuisha 2010-05-31 15:28:06

    竟然是传说中的两篇,good job.

  6. NeighborWolf
    27.38.53.*
    链接

    NeighborWolf 2011-07-05 20:29:39

    等编译器将元编程能力暴露出来后,用来写动态的病毒就很容易了。估计现在的杀毒软件都查不出来了

  7. zhucai
    218.240.45.*
    链接

    zhucai 2011-08-04 14:14:52

    嘿嘿,我以前实现过一个LambdaParser,差不多就是这个目的。后来发现其实早有更好的,就没继续下去了。

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我