文章总结: 作者在消息中间件开发中需要支持SQL-like语法,这促使他研究编译原理,翻译了MySQL内部和Go编译器书籍,强调实战学习的重要性,并推广知识星球提供技术专栏和服务,鼓励读者加入学习。
综合评分: 40
文章分类: 软文广告,产品介绍
Go项目实战:使用Go从零开发一个编译器
CppGuide
2025年5月15日 19:26
上海
我离开某大厂后,加入了一家外企,做分布式消息中间件的产品,工作不是很忙,除了完成主线架构设计工作外,有一些时间去做一些结合产品的技术研究性工作。
去年 8 月份左右,内部有一个需求希望我们的消息中间件能支持类似 SQL 那样的消息匹配语法,用以支持消息属性匹配。这让我又一次重拾了对编译原理中词法解析、句法解析等功能的具体实现的兴趣,我一边阅读 MySQL 源码,分析其中的相关组件,一边结合着《Understanding MySQL Internals》一书阅读,于是后来索性翻译了一下该书,放出来分享给大家免费阅读。
阅读地址:
https://cppguide.cn/pages/understandingmysqlinternals00/
(公众号不支持外链,请复制到浏览器中打开,手机电脑均支持)
我之前对编译器、解释器都挺感兴趣的,研究过Lua解释器的源码,也看过golang运行时的源码。
随着近年来,科技战愈演愈烈,虽然我们在高科技的某些方面不再受制于人,但是像编译器、调试器,例如 gcc、gdb、clang,虽然是开源的,但是开源团体成员会受到 zz 的压力,哪天不对我们开源了呢?
另外,国内的编译原理的教学大多数都停留在理论层面,实战并不多,而编译器、调试器等工具的实现,深深地依赖 CPU 芯片的架构和操作系统的实现机理。这些现在都是我们的弱项。
我在实现我的消息中间件产品解析类似 SQL 语法的过程中,也参考了一些其他书籍,分别是《从零写一个C编译器》《用Golang从零开发一个编译器》《用Golang从零开发一个解释器》等,阅读这些图书的过程中,那些曾经停留在编译原理书上的理论变成一行行可真实运行的代码和程序,并且我可以自由在我的新“SQL”中增加我喜欢的语法。那种畅快淋漓,犹如庖丁解牛,洋洋洒洒。
我将近花了四个多月的时间,把这几本书翻译了中文版,当然,期间因为无暇刷碗,被媳妇喷了很多次。女人嘛,只会影响我拔刀的速度。不信,你看大同。
《用Golang从零开发一个编译器》专栏介绍
如果有一定 golang 语法基础,真的只要一点点 golang 语法基础,甚至连go routine、channel 等知识你都不需要会的,都可以阅读这本书。而最终实现的编译器功能麻雀虽小,五脏俱全。另外,本书文风非常幽默,我在翻译时,尽量保持这样的文风,当然,你也可能会看到一些中国人不懂的英语思维的笑点。
如果你的golang水平仅仅入门,不知道大型golang项目如何组织,或者想学习犀利的golang程序如何开发,强烈推荐看一看。
其详细目录如下:
-
引言
-
过去与现在
-
未来
-
说明
-
不断进化的“猴子”
-
如何阅读
-
配套源码
-
目录
-
1. 编译器与虚拟机
-
真实机器
-
什么是虚拟机?
-
为什么要构建虚拟机?
-
字节码
-
编译器
-
虚拟机器与真实机器
-
我们要做什么,或:虚拟机与编译器的二元性
-
2. 你好,字节码!
-
从字节开始
-
最小的编译器
-
字节码,反汇编!
-
回到手头的任务
-
启动虚拟机
-
最初的指令
-
添加栈
-
连接REPL
-
3. 编译表达式
-
清理栈
-
中缀表达式
-
布尔值
-
比较运算符
-
前缀表达式
-
4. 条件语句
-
跳转
-
编译条件语句
-
执行跳转
-
欢迎回来,空值!
-
5. 追踪名称
-
引入:符号表
-
在编译器中使用符号
-
计划
-
编译绑定
-
向虚拟机添加全局变量
-
6. 字符串、数组和哈希
-
字符串
-
数组
-
哈希
-
添加索引运算符
-
7. 函数
-
编译带参数的调用
-
解析参数引用
-
虚拟机中的参数
-
局部绑定的操作码
-
编译局部变量
-
表示函数
-
执行函数的操作码
-
编译函数字面量
-
编译函数调用
-
虚拟机中的函数
-
一个小惊喜
-
初探:一个简单函数
-
局部绑定
-
在虚拟机中实现局部绑定
-
参数
-
8. 内置函数
-
让改变更容易
-
做出改变:计划
-
内置函数的新作用域
-
执行内置函数
-
9. 闭包
-
问题
-
计划
-
一切都是闭包
-
编译和解析自由变量
-
在运行时创建真正的闭包
-
递归闭包
-
- 总结
如果你想阅读我的翻译版本,请移步我的知识星球,加入星球后,看置顶帖子即可阅读。
人到中年,养家糊口不易,赚点米。
小方的星球提供五大服务:
- 优问优答 2. 不定期的技术直播和录像
- 优质源码分享和指导
- 模拟面试、职业解惑和简历review
- 星球专属技术专栏。
注意:小方的星球不卖课,星球专栏只是星球服务很小的一部分。如果你单纯为了看热闹,请勿加入,倒不如省下这几百块带孩子吃点好的。
小方说服务器开发知识星球详细介绍点击这里。
如果你还不是球友,可以通过下面的优惠券扫码加入(立即优惠40):
老球友续费扫码如下(半价基础上再优惠20):
年纪大了,对越来越多的东西失去了兴趣。虽然现在也带一些团队,看到团队中的新人渴求知识的双眸,我也很乐意分享和指导一二,他们有我当年的影子!我庆幸,我还对实际写代码很感兴趣,一个项目技术方案确定好后,我一定要给自己分几个模块,实际去写一写。
王羲之说:向之所欣,俯仰之间,已为陈迹,犹不能不以之兴怀;况修短随化,终期于尽。
诚然,祝每一位公众号的老读者、新读者,都能在键盘之下、行号之间实现自己的愿望。
推荐阅读
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:CppGuide 《Go项目实战:使用Go从零开发一个编译器》