• 作者:[德] 索斯藤·鲍尔(Thorsten Ball)廖彬
  • 分类: 互联网

放下大部头,换一种方式入门编译原理

本书是《用Go语言自制解释器》的续篇。在自制解释器时,你已经为Monkey语言实现了类C语法、变量绑定、基本数据类型、算术运算、内置函数、闭包等特性。是时候让Monkey继续成长了!在本书中,Monkey将继续“进化”,并最终成长为成熟的程序设计语言。在已有词法分析器、语法分析器和抽象语法树的基础上,你将为Monkey语言定义字节码指令,指定操作数,编写反汇编程序,构建执行字节码的虚拟机。通过动手学习,你将能够体验从无到有实现类C语言的乐趣。

【业内佳评】

编译器和语言开发是门槛较高的领域。我作为从业者,经常遇到培养新人却无法很快上手的问题。这套书很好地解决了此问题,在降低门槛的同时,又不损失丰富性,全面展示了开发编译器和程序设计语言的要素,因此我向所有对此有兴趣的读者推荐这套书。

——史斌(benshi001)

Go语言全球排名前50的贡献者

几年前看SICP的时候,我学习过如何写解释器。在书本上学习编译原理的过程是很枯燥的。这套书让我们可以一边学习理论,一边实践。我们能够看到,如何通过亲手实现解释器和编译器摆脱学习理论的枯燥过程。

——左书祺(@Draven)

云原生工程师、Kubernetes项目成员、《Go语言设计与实现》作者

如果你熟悉解释性语言,同时是Go语言爱好者,那么这套书就是为你编写的。使用Go语言从零实现一个解释器/编译器,不仅让你明白它们是如何工作的,而且你对Go语言也会有更深的理解。如果能够跟着书中内容实际动手实现一个解释器/编译器,那么你的技术一定会有很大的飞跃。

——徐新华

Go语言中文网站长、公众号“polarisxu”主理人

程序员的三大浪漫之一就是自制编程语言。得益于Go自身语法的简洁性和在工程方面的平衡性,这套书通过简明直接的代码,一步步地向读者揭示自制一门编程语言并不是高不可攀的事情。对于想自制编程语言又不想啃编译原理的读者,我推荐这套书。

——蒙卓(mengzhuo)

Go项目成员

这是一套很好的书,我曾在学习Go语言的时候有幸拜读过。现在,它终于有中译本了。自制解释器和编译器,一听就知道是很酷的事情。这套书的成功之处在于,它并非高屋建瓴,而是从零开始带着我们完成解释器和编译器的搭建,实战性很强。

——启舰

2017年度CSDN博客之星、前阿里巴巴研发工程师、“启舰杂谈”主理人

在软件设计中,开发人员经常需要开发一些高度抽象的定制模块。这些模块很可能涉及领域特定语言(DSL)的设计和解析。如果你很熟悉编译器的各个模块和运行原理,就可以很轻松地设计出适配自己项目的DSL。市面上关于编译器的书有很多,这些著作往往大而全,但是不易理解。这套书的作者对内容设计得非常精巧,通过从0到1创造一门编程语言来带领读者了解解释器和编译器的核心原理。我相信,它能给DSL设计者带来帮助。

——李正兴

腾讯高级工程师

放下大部头,换一种方式入门编译原理

本书是《用Go语言自制解释器》的续篇。在自制解释器时,你已经为Monkey语言实现了类C语法、变量绑定、基本数据类型、算术运算、内置函数、闭包等特性。是时候让Monkey继续成长了!在本书中,Monkey将继续“进化”,并最终成长为成熟的程序设计语言。在已有词法分析器、语法分析器和抽象语法树的基础上,你将为Monkey语言定义字节码指令,指定操作数,编写反汇编程序,构建执行字节码的虚拟机。通过动手学习,你将能够体验从无到有实现类C语言的乐趣。

【业内佳评】

编译器和语言开发是门槛较高的领域。我作为从业者,经常遇到培养新人却无法很快上手的问题。这套书很好地解决了此问题,在降低门槛的同时,又不损失丰富性,全面展示了开发编译器和程序设计语言的要素,因此我向所有对此有兴趣的读者推荐这套书。

——史斌(benshi001)

Go语言全球排名前50的贡献者

几年前看SICP的时候,我学习过如何写解释器。在书本上学习编译原理的过程是很枯燥的。这套书让我们可以一边学习理论,一边实践。我们能够看到,如何通过亲手实现解释器和编译器摆脱学习理论的枯燥过程。

——左书祺(@Draven)

云原生工程师、Kubernetes项目成员、《Go语言设计与实现》作者

如果你熟悉解释性语言,同时是Go语言爱好者,那么这套书就是为你编写的。使用Go语言从零实现一个解释器/编译器,不仅让你明白它们是如何工作的,而且你对Go语言也会有更深的理解。如果能够跟着书中内容实际动手实现一个解释器/编译器,那么你的技术一定会有很大的飞跃。

——徐新华

Go语言中文网站长、公众号“polarisxu”主理人

程序员的三大浪漫之一就是自制编程语言。得益于Go自身语法的简洁性和在工程方面的平衡性,这套书通过简明直接的代码,一步步地向读者揭示自制一门编程语言并不是高不可攀的事情。对于想自制编程语言又不想啃编译原理的读者,我推荐这套书。

——蒙卓(mengzhuo)

Go项目成员

这是一套很好的书,我曾在学习Go语言的时候有幸拜读过。现在,它终于有中译本了。自制解释器和编译器,一听就知道是很酷的事情。这套书的成功之处在于,它并非高屋建瓴,而是从零开始带着我们完成解释器和编译器的搭建,实战性很强。

——启舰

2017年度CSDN博客之星、前阿里巴巴研发工程师、“启舰杂谈”主理人

在软件设计中,开发人员经常需要开发一些高度抽象的定制模块。这些模块很可能涉及领域特定语言(DSL)的设计和解析。如果你很熟悉编译器的各个模块和运行原理,就可以很轻松地设计出适配自己项目的DSL。市面上关于编译器的书有很多,这些著作往往大而全,但是不易理解。这套书的作者对内容设计得非常精巧,通过从0到1创造一门编程语言来带领读者了解解释器和编译器的核心原理。我相信,它能给DSL设计者带来帮助。

——李正兴

腾讯高级工程师

索斯藤·鲍尔(Thorsten Ball)

Sourcegraph软件工程师,精通多门程序设计语言,包括Go、C、JavaScript和Ruby,深谙编译原理、系统编程、Unix、数据库等相关技术。现居德国,长期活跃于欧洲各大技术大会。

廖彬

毕业于中国科学院计算技术研究所,高级语言虚拟机爱好者,在语言虚拟机领域从事开发近十年,曾就职于阿里巴巴和腾讯。

目录:第1章 编译器与虚拟机 1
1.1 编译器 2
1.2 虚拟机与物理机 5
1.2.1 物理机 6
1.2.2 什么是虚拟机 11
1.2.3 为什么要构建虚拟机 14
1.2.4 字节码 15
1.3 虚拟机与编译器的二元性 17
第2章 你好,字节码! 19
2.1 第一条指令 20
2.1.1 以字节作为开端 21
2.1.2 最小编译器 26
2.1.3 字节码与反汇编程序 32
2.1.4 回归初心,继续前行 37
2.1.5 给机器上电 40
2.2 栈上加法 46
2.3 连接REPL 52
第3章 编译表达式 55
3.1 栈清理 55
3.2 中缀表达式 60
3.3 布尔类型 64
3.4 比较运算符 69
3.5 前缀表达式 76
第4章 条件语句 83
4.1 跳转 86
4.2 编译条件语句 88
4.3 执行跳转 103
4.4 欢迎回来,Null 值 106
第5章 追踪名称 115
5.1 计划 116
5.2 编译绑定 117
5.2.1 添加符号表 120
5.2.2 在编译器中使用符号 123
5.3 在虚拟机中支持全局变量 126
第6章 字符串、数组和哈希表 132
6.1 字符串 132
6.2 数组 138
6.3 哈希表 142
6.4 索引运算符 149
第7章 函数 156
7.1 一个简单的函数 156
7.1.1 函数表示 157
7.1.2 执行函数的操作码 158
7.1.3 编译函数字面量 161
7.1.4 编译函数调用 176
7.1.5 虚拟机中的函数 179
7.1.6 一点奖励 190
7.2 局部绑定 191
7.2.1 局部绑定操作码 192
7.2.2 编译局部绑定 195
7.2.3 在虚拟机中实现局部绑定 208
7.3 参数 218
7.3.1 编译带参数的函数调用 219
7.3.2 将引用解析为参数 224
7.3.3 虚拟机中的参数 227
第8章 内置函数 237
8.1 使修改变得简单 238
8.2 做出改变:计划 244
8.3 内置函数作用域 245
8.4 执行内置函数 250
第9章 闭包 256
9.1 问题 257
9.2 计划 258
9.3 将一切视为闭包 260
9.4 编译和解析自由变量 271
9.5 运行时创建闭包 283
9.6 递归闭包 288
第10章 最后的测试 303