BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Anders Hejlsberg讲解现代编译器结构

| 作者 Pierre-Luc Maheu 关注 4 他的粉丝 ,译者 钱露晗 关注 0 他的粉丝 发布于 2016年6月29日. 估计阅读时间: 2 分钟 | ArchSummit北京2018 共同探讨机器学习、信息安全、微服务治理的关键点

《编译原理》又名龙书,是编译器结构的主要参考书,首次出版于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在最后讨论了学习现代编译器结构的资源,RoslynTypeScript项目是很好的实例,且都在Github上开源。

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


感谢张龙对本文的审校。

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

大神 by sen firefly

我心目中唯一的真神。。。。没有之一

Re: 大神 by Hovering Eagle

绝对的大神

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT