《用Go语言自制解释器》简介:

* 从零开始,自己写一门语言

* 体验从无到有实现类C语言的乐趣

在程序员与计算机的“交流”过程中,解释器无疑扮演着优秀的翻译角色。它为只懂0和1的计算机翻译源代码,为看似随机的字符赋予含义。这是如何实现的呢?充满好奇心的你,是否曾经思考过这个问题?跟随本书,你将揭开解释器的神秘面纱,通晓它的工作原理,并编写出自己的解释器。本书采用Go语言来为自创的编程语言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语言自制解释器》目录:

第1章 词法分析 1
1.1 词法分析 1
1.2 定义词法单元 2
1.3 词法分析器 4
1.4 扩展词法单元和词法分析器 14
1.5 编写REPL 20
第2章 语法分析 23
2.1 语法分析器 23
2.2 为什么不用语法分析器生成器 26
2.3 为Monkey 语言编写语法分析器 27
2.4 语法分析器的第一步:解析let语句 28
2.5 解析return语句 42
2.6 解析表达式 44
2.6.1 Monkey 中的表达式 45
2.6.2 自上而下的运算符优先级分析(也称普拉特解析法) 46
2.6.3 术语 47
2.6.4 准备AST 48
2.6.5 实现普拉特语法分析器 52
2.6.6 标识符 53
2.6.7 整数字面量 57
2.6.8 前缀运算符 60
2.6.9 中缀运算符 65
2.7 普拉特解析的工作方式 72
2.8 扩展语法分析器 81
2.8.1 布尔字面量 83
2.8.2 分组表达式 87
2.8.3 if 表达式 88
2.8.4 函数字面量 94
2.8.5 调用表达式 100
2.8.6 删除TODO 105
2.9 RPPL 107
第3章 求值 110
3.1 为符号赋予含义 110
3.2 求值策略 111
3.3 树遍历解释器 113
3.4 表示对象 114
3.4.1 对象系统的基础 116
3.4.2 整数 116
3.4.3 布尔值 117
3.4.4 空值 118
3.5 求值表达式 118
3.5.1 整数字面量 119
3.5.2 完成REPL 122
3.5.3 布尔字面量 123
3.5.4 空值 125
3.5.5 前缀表达式 126
3.5.6 中缀表达式 129
3.6 条件语句 135
3.7 return语句 139
3.8 错误处理 143
3.9 绑定与环境 149
3.10 函数和函数调用 154
3.11 如何处理垃圾 165
第4章 扩展解释器 168
4.1 数据类型和函数 168
4.2 字符串 168
4.2.1 在词法分析器中支持字符串 169
4.2.2 字符串语法分析 172
4.2.3 字符串求值 173
4.2.4 字符串连接 175
4.3 内置函数 177
4.4 数组 182
4.4.1 在词法分析器中支持数组 183
4.4.2 数组字面量语法分析 185
4.4.3 索引运算符表达式语法分析 188
4.4.4 数组字面量求值 192
4.4.5 索引运算符表达式求值 194
4.4.6 为数组添加内置函数 197
4.4.7 测试驱动数组 201
4.5 哈希表 202
4.5.1 哈希字面量词法分析 203
4.5.2 哈希字面量语法分析 205
4.5.3 哈希对象 210
4.5.4 哈希字面量求值 215
4.5.5 哈希索引表达式求值 218
4.6 大结局 222
第5章 遗失的篇章:Monkey的宏系统 224
5.1 宏系统 224
5.2 Monkey 的宏系统 227
5.3 quote 229
5.4 unquote 233
5.4.1 遍历树 235
5.4.2 替换unquote调用 248
5.5 宏扩展 256
5.5.1 macro关键字 257
5.5.2 宏字面量语法分析 259
5.5.3 定义宏 262
5.5.4 展开宏 267
5.5.5 强大的unless 宏 271
5.6 扩展REPL 273
5.7 关于宏的一些畅想 274
· · · · · ·