转载

Anders Hejlsberg讲解现代编译器结构

《编译原理》又名龙书,是编译器结构的主要参考书,首次出版于1986年。 Anders Hejlsberg,以从事Turbo Pascal,Delphi,C#和TypeScript的开发而闻名,在 Channel 9的采访中 讲解当前的编译器结构和30年前的不同。

经典编译器的主要特征是顺序处理输入,各个阶段都可以看作是管道的组件。

词法分析 -> 语法分析 -> 类型检查 -> 代码生成 -> Emitter 

在过去的十年里,需要IDE和工具来提供诸如自动完成,重构,代码导航和静态分析等等功能的需求逐渐增强。微软的用户研究表明这些特性必须低于100ms的延迟,否则的话就会被认为太慢。这和编译一个中型解决方案的项目时间可能会花费超过1分钟不一样。

为了在IDE里提供快速的反馈,编译器必须尽可能的限制实时处理的量。这意味着在每次键入的时候编译整个程序是不可行的。相反,编辑器仅仅构建足够给用户提供答案的信息量。

快速响应不仅仅是通过限制处理内容,还通过尽可能的重用老的数据结构。每当用户键入一个新的字符,内存中的所有数据结构可以认为是抹去的。然后,为了提高响应时间,所有没有修改的东西都可以重用。诸如 抽象语法树(AST) ,如果其所代表的源文件没有被修改就可以被重用。

即使数据结构被修改了,重用也是可以的。持久化的数据结构是不可变的,通过创建和返回新的实例来实现修改,从而保持底层的部分不被修改。以抽象语法树为例,意味着修改当前的节点和该节点对应的父节点直到根节点为止。树的其他部分,保持原状并在创建新的实例的时候被重用。

回到几年前,IDE中的实时特性需求导致C#编译器和IDE特性实现中的代码重复。这也是创建Roslyn背后的主要原因之一。Roslyn的设计出发点就是能在IDE和命令行中同样使用。

Roslyn和Seth在最后讨论了学习现代编译器结构的资源, Roslyn 和 TypeScript 项目是很好的实例,且都在Github上开源。

查看英文原文: Anders Hejlsberg Explains Modern Compiler Construction

感谢张龙对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们。

原文  http://www.infoq.com/cn/news/2016/06/anders-hejlsberg-compiler
正文到此结束
Loading...