【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

Anders Hejlsberg 讲解现代编译器结构

  • 2016-06-28
  • 本文字数:873 字

    阅读完需:约 3 分钟

《编译原理》又名龙书,是编译器结构的主要参考书,首次出版于 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 )关注我们。

2016-06-28 19:002400

评论

发布
暂无评论
发现更多内容

构建并运行 Databend

Databend

databend

全景剖析阿里云容器网络数据链路(一):Flannel

阿里巴巴云原生

阿里云 容器 云原生

ThreadLocal源码解析及实战应用

京东科技开发者

Java 源码 技术 后端 企业号 1 月 PK 榜

从零开始实现一个Promise

helloworld1024fd

JavaScript

年终盘点丨最受开发者欢迎的文章 TOP20

阿里巴巴云原生

阿里云 云原生

阿里云开源大数据平台EMR全面升级 性能最高可提升6倍

阿里云大数据AI技术

大数据 云原生 大数据 开源

Rewrite sqllogictest framework in rust

Databend

Kstry流程编排框架

lykan

软件架构 模块化 流程编排 高并发编程 业务可视化

从零手写react-router

helloworld1024fd

JavaScript

SOA 和微服务有何区别?

江南一点雨

Java 微服务 springboot SOA

带你用20张图了解什么是 JVM 运行时数据区

风铃架构日知录

Java 程序员 JVM 码农 内存

表格集算表高性能原理——怎样实现纯前端百万行数据秒级响应

葡萄城技术团队

高级前端常考手写面试题合集

helloworld1024fd

JavaScript

安畅携手阿里云共建Landing Zone方案,助力企业上云无忧

云布道师

阿里云

Java Netty框架自建DNS代理服务器教程

小小怪下士

Java 程序员 Netty DNS

程序员该如何用“高科技”智能地教狗狗上厕所

风铃架构日知录

人工智能 深度学习 程序人生 后端 系统架构

《隐私计算白皮书(2022年)》概览

京东科技开发者

技术 安全 隐私保护 白皮书 企业号 1 月 PK 榜

醉三皇成为第12届北京国际网络电影展官方指定用酒品牌

联营汇聚

每日一题之Vue的异步更新实现原理是怎样的?

bb_xiaxia1998

Vue

一文了解 Go time 包的时间常用操作

陈明勇

Go golang time

如何使用API Hub 实现一个图片列表

Towify

EMQX+阿里云飞天洛神云网络NLB:MQTT消息亿级并发、千万级吞吐性能达成

EMQ映云科技

阿里云 物联网 IoT mqtt 企业号 1 月 PK 榜

Excelize 2.7.0 发布, 2023 年首个更新

xuri

golang GitHub 开源 编程 Excelize

京音平台-一起玩转SCRM之电销系统

京东科技开发者

架构设计 系统 scrm 企业号 1 月 PK 榜 电销

前端必会手写面试题合集

helloworld1024fd

JavaScript

那些炫酷的CSS文字效果之诗词《兔》

南城FE

CSS css3 前端 动画

简单谈谈Redis中的几种java客户端以及优缺点!

风铃架构日知录

Java redis 程序员 程序人生 客户端

排障定位时间缩短一半, 博睿数据如何赋能青岛住房公积金管理中心

博睿数据

APM AIOPS 智能运维 博睿数据 精选案例

Spring项目中用了这种解耦模式,经理对我刮目相看

JAVA旭阳

Java spring

如何实现发送评论时总数自动加一?

Towify

Java高手速成 | Java集合类泛类型

TiAmo

Java 泛型 编程语言、

Anders Hejlsberg讲解现代编译器结构_.NET_Pierre-Luc Maheu_InfoQ精选文章