Anders Hejlsberg讲解现代编译器结构

LaurenceWis 4年前
   <p>《编译原理》又名龙书,是编译器结构的主要参考书,首次出版于1986年。 Anders Hejlsberg,以从事Turbo Pascal,Delphi,C#和TypeScript的开发而闻名,在 <a href="/misc/goto?guid=4959674862761287629" rel="nofollow,noindex">Channel 9的采访中</a> 讲解当前的编译器结构和30年前的不同。</p>    <p>经典编译器的主要特征是顺序处理输入,各个阶段都可以看作是管道的组件。</p>    <pre>  词法分析 -> 语法分析 -> 类型检查 -> 代码生成 -> Emitter  </pre>    <p>在过去的十年里,需要IDE和工具来提供诸如自动完成,重构,代码导航和静态分析等等功能的需求逐渐增强。微软的用户研究表明这些特性必须低于100ms的延迟,否则的话就会被认为太慢。这和编译一个中型解决方案的项目时间可能会花费超过1分钟不一样。</p>    <p>为了在IDE里提供快速的反馈,编译器必须尽可能的限制实时处理的量。这意味着在每次键入的时候编译整个程序是不可行的。相反,编辑器仅仅构建足够给用户提供答案的信息量。</p>    <p>快速响应不仅仅是通过限制处理内容,还通过尽可能的重用老的数据结构。每当用户键入一个新的字符,内存中的所有数据结构可以认为是抹去的。然后,为了提高响应时间,所有没有修改的东西都可以重用。诸如 <a href="/misc/goto?guid=4958965081645958935" rel="nofollow,noindex">抽象语法树(AST)</a> ,如果其所代表的源文件没有被修改就可以被重用。</p>    <p>即使数据结构被修改了,重用也是可以的。持久化的数据结构是不可变的,通过创建和返回新的实例来实现修改,从而保持底层的部分不被修改。以抽象语法树为例,意味着修改当前的节点和该节点对应的父节点直到根节点为止。树的其他部分,保持原状并在创建新的实例的时候被重用。</p>    <p>回到几年前,IDE中的实时特性需求导致C#编译器和IDE特性实现中的代码重复。这也是创建Roslyn背后的主要原因之一。Roslyn的设计出发点就是能在IDE和命令行中同样使用。</p>    <p>Roslyn和Seth在最后讨论了学习现代编译器结构的资源, <a href="/misc/goto?guid=4958865634722135749" rel="nofollow,noindex">Roslyn</a> 和 <a href="/misc/goto?guid=4958866223614504895" rel="nofollow,noindex">TypeScript</a> 项目是很好的实例,且都在Github上开源。</p>    <p>查看英文原文: <a href="/misc/goto?guid=4959674862924849407" rel="nofollow,noindex">Anders Hejlsberg Explains Modern Compiler Construction</a></p>    <p> </p>    <p>来自: <a href="/misc/goto?guid=4959674863019692691" rel="nofollow">http://www.infoq.com/cn/news/2016/06/anders-hejlsberg-compiler</a></p>    <p> </p>