文章总结: 这篇文章介绍了作者翻译的《用Golang从零开发一个解释器》一书,书中详细讲解了从词法分析、语法分析、求值到宏系统的完整解释器开发过程,使用普拉特解析法等技术实现类似JavaScript的解释器,适合Go语言初学者学习大型项目组织和犀利的程序开发技巧。
综合评分: 84
文章分类: 二进制安全,安全工具
Go项目实战:使用Go从零开发一个解释器
CppGuide
2025年5月7日 21:10
上海
我离开某大厂后,加入了一家外企,做分布式消息中间件的产品,工作不是很忙,除了完成主线架构设计工作外,有一些时间去做一些结合产品的技术研究性工作。
我之前对编译器、解释器都挺感兴趣的,研究过Lua解释器的源码,也看过golang运行时的源码。
随着近年来,科技战愈演愈烈,虽然我们在高科技的某些方面不再受制于人,但是像编译器、调试器,例如 gcc、gdb、clang,虽然是开源的,但是开源团体成员会受到 zz 的压力,哪天不对我们开源了呢?
另外,国内的编译原理的教学大多数都停留在理论层面,实战并不多,而编译器、调试器等工具的实现,深深地依赖 CPU 芯片的架构和操作系统的实现机理。这些现在都是我们的弱项。
我在实现我的消息中间件产品解析类似 SQL 语法的过程中,也参考了一些其他书籍,分别是《从零写一个C编译器》《用Golang从零开发一个编译器》《用Golang从零开发一个解释器》等,阅读这些图书的过程中,那些曾经停留在编译原理书上的理论变成一行行可真实运行的代码和程序,并且我可以自由在我的新“SQL”中增加我喜欢的语法。那种畅快淋漓,犹如庖丁解牛,洋洋洒洒。
我将近花了四个多月的时间,把这几本书翻译了中文版,当然,期间因为无暇刷碗,被媳妇喷了很多次。女人嘛,只会影响我拔刀的速度。不信,你看大同。
《用Golang从零开发一个解释器》专栏介绍
如果有一定 golang 语法基础,真的只要一点点 golang 语法基础,甚至连go routine、channel 等知识你都不需要会的,都可以阅读这本书。而最终实现的编译器功能麻雀虽小,五脏俱全。另外,本书文风非常幽默,我在翻译时,尽量保持这样的文风,当然,你也可能会看到一些中国人不懂的英语思维的笑点。
如果你的golang水平仅仅入门,不知道大型golang项目如何组织,或者想学习犀利的golang程序如何开发,强烈推荐看一看。
《用Golang从零实现一个解释器》,类似javascript和lua那样的解释器。
详细目录如下:
-
引言
-
猴子编程语言与解释器
-
为什么选择Go语言?
-
第1章 词法分析
-
1.1 – 词法分析(Lexical Analysis)
-
1.2 – 定义我们的词法单元(Tokens)
-
1.3 – 词法分析器(Lexer)
-
1.4 – 扩展词法单元集和词法分析器
-
1.5 – 交互式解释器(REPL)的开端
-
第2章 语法分析
-
布尔字面量
-
分组表达式
-
if表达式
-
函数字面量
-
调用表达式
-
去除待办事项(TODOs)
-
猴子语言中的表达式
-
自顶向下运算符优先级(或:普拉特解析法,Pratt Parsing)
-
术语
-
准备抽象语法树(AST)
-
实现普拉特解析器
-
标识符
-
整数字面量
-
前缀运算符
-
中缀运算符
-
2.1 – 解析器(Parsers)
-
2.2 – 为什么不使用解析器生成器?
-
2.3 – 为猴子编程语言编写解析器
-
2.4 – 解析器的第一步:解析let语句
-
2.5 – 解析返回语句
-
2.6 – 解析表达式
-
2.7 – 普拉特解析法的工作原理
-
2.8 – 扩展解析器
-
2.9 – 读取 – 解析 – 打印循环(Read-Parse-Print-Loop)
-
第3章 求值
-
整数字面量
-
完善交互式解释器(REPL)
-
布尔字面量
-
空值
-
前缀表达式
-
中缀表达式
-
对象系统的基础
-
整数
-
布尔值
-
空值(Null)
-
3.1 – 赋予符号意义
-
3.2 – 求值策略
-
3.3 – 树遍历解释器
-
3.4 – 表示对象
-
3.5 – 求值表达式
-
3.6 – 条件语句
-
3.7 – 返回语句
-
3.8 – 中止!中止!出问题了!或:错误处理
-
3.9 – 绑定与环境(Environment)
-
3.10 – 函数与函数调用
-
3.11 – 谁去倒垃圾?
-
第4章 扩展解释器
-
词法分析哈希字面量
-
解析哈希字面量
-
对象哈希化
-
求值哈希字面量
-
求值哈希索引表达式
-
在词法分析器中支持数组
-
解析数组字面量
-
解析索引运算符表达式
-
求值数组字面量
-
求值索引运算符表达式
-
为数组添加内置函数
-
测试驱动数组功能
-
len函数
-
在词法分析器中支持字符串
-
解析字符串
-
求值字符串
-
字符串拼接
-
4.1 – 数据类型与函数
-
4.2 – 字符串
-
4.3 – 内置函数
-
4.4 – 数组
-
4.5 – 哈希(Hashes)
-
4.6 – 大结局
-
第5章 Monkey的宏系统
-
宏关键字(Macro Keyword)
-
解析宏字面量
-
定义宏
-
展开宏
-
强大的unless宏
-
遍历语法树
-
替换反引用调用
-
5.1 – 宏系统
-
5.2 – 猴子语言的宏系统
-
5.3 – 引用(Quote)
-
5.4 – 反引用(Unquote)
-
5.5 – 宏展开
-
5.6 – 扩展交互式解释器(REPL)
-
5.7 – 在宏中畅想……
如果你想阅读我的翻译版本,请移步我的知识星球,加入星球后,看置顶帖子即可阅读。
人到中年,养家糊口不易,赚点米。
小方的星球提供五大服务:
- 优问优答 2. 不定期的技术直播和录像
- 优质源码分享和指导
- 模拟面试、职业解惑和简历review
- 星球专属技术专栏。
注意:小方的星球不卖课,星球专栏只是星球服务很小的一部分。如果你单纯为了看热闹,请勿加入,倒不如省下这几百块带孩子吃点好的。
小方说服务器开发知识星球详细介绍点击这里。
如果你还不是球友,可以通过下面的优惠券扫码加入(立即优惠40):
老球友续费扫码如下(半价基础上再优惠20):
年纪大了,对越来越多的东西失去了兴趣。虽然现在也带一些团队,看到团队中的新人渴求知识的双眸,我也很乐意分享和指导一二,他们有我当年的影子!我庆幸,我还对实际写代码很感兴趣,一个项目技术方案确定好后,我一定要给自己分几个模块,实际去写一写。
王羲之说:向之所欣,俯仰之间,已为陈迹,犹不能不以之兴怀;况修短随化,终期于尽。
诚然,祝每一位公众号的老读者、新读者,都能在键盘之下、行号之间实现自己的愿望。
推荐阅读
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:CppGuide 《Go项目实战:使用Go从零开发一个解释器》