前 几天在PDC 2010会议上Anders Hejlsberg发表了一场名为“The Future of C# and Visual Basic”的演说,谈论了未来C#和VB中最为重要的两个特性:“异步(Async)”及“编译器即服务(Compiler as a Service)”。我现在对这场演讲进行总结,但不会像上次《编程语言的发展趋势及未来方向》那样逐句翻译,而是以Anders的角度使用一种简捷合适的方式表述其完整内容。上一篇Anders对async和await的的实现及效果作更进一步的解释,本篇则是对“编译器即服务”做了些最表面的尝试。
你们某些人可能参加了PDC 2008,那时我谈到了“编译器即服务(Compier as a Service)”,也作了点演示。现在我来演示一点这方面的进展。
编译器即服务的关键,在于目前的编译器是个黑盒,输入源文件,输出.NET程序集。至于它是如何工作的,你不能参与进去。
为了打造更灵活工作过程,我们把编译器展开,把其中的信息展示出来并加以利用,这样就能做到实现元编程、REPL,把C#和VB作为内嵌的DSL,或是根据语言对象模型实现重构,代码生成器等语义相关的工作。
我最后的示例便是些这方面的展示。(译注:这个示例展示的代码非常复杂,但并不重要,它的主要目的便是根据编译器提供的语言对象模型,判断其中的 if/else逻辑,并在Visual Studio中显示出轮廓(就像方法的折叠功能一样)。有趣的是,这个演示失败了……)
这里的语言对象模型,就是C#和VB编译器内部所使用的,包含了完整的语义,可用于理解代码的工作目的。有了这些数据,我们就能作一些非常有趣的事 情了。例如,我们有两个语言,它们的语法非常接近,不是吗?那么我们理解了其中一个语言,把它转化成另外一个应该也不太困难。
这里还有一个简单的C#到VB的代码转换器(译注:又一个演示),你可以把C#代码复制到剪贴板里,然后粘贴成VB代码。在实现时,只不过遍历了 C#语法树,生成另一个对象模型。当然,这个程序也不是太简单,实际上还是要有几千行代码的,这里只是个最简单的实现。那么我这里来试着把那段没法工作的 代码,粘贴到VB文件中……砰,这就出现了功能一致的VB代码(掌声)。这就是利用这种技术可以做到的事情。我们也已经发布了CTP版本的编译器,也包含 了这些示例。
我答应过,这里是Visual Studio Async CTP的下载地址,它基于Visual Studio 2010安装。其中包含了所有我演示过的示例,有C#也有VB。此外还有一些相关的讲座,例如LINQ,我也会参加下午的语言话题讨论。接下来还有点时 间,可以回答一两个问题。
提问:除了这里您提到的这些,C#和VB还会包含其他功能吗?
Anders:呃,现在说起C#和VB最终是什么样的为时尚早,不过的确还有些其他的功能。
提问:我想知道您对于数据并发和数据共享的看法。
Anders:并发有许多令人头痛的地方,你说的就是其中之一。我们在内部有些研究是关于不可变性,状态隔离, 纯函数式编程,还有其他一些编译器方面的工作。现在还没有准备好公开,不过我们正在取得些不错的进展。我相信接下来的几十年间并发会一直是个课题,这里的 异步功能是其中的一小步,我肯定还会有更多进展。
提问:从反射的视角来说,异步方法和普通方法有什么区别?
Anders:对于反射来说,异步方法就是普通的方法,调用方法也一样。不过它会在第一个await的地方返 回,等异步任务完成之后,它再继续执行下去。所以它其实和普通方法没有任何区别,但如果你要知道它什么时候结束,那么就必须去关注它返回的Task对象 了。你还看到我写过一些void方法,可能你根本不会在乎它什么时候结束,不过原理上它还是一样的。
就到这里,非常感谢各位参与。