国内第一批Go语言爱好者和Go语言代码的贡献者有一本《Go语言定制指南》出版了,本书从Go语言语法树出发,重新审视Go语言源文件,阐述定制Go语言的核心技术。书中通过对go/ast、go/ssa等包的分析,一步步深入Go语言核心,最后简要介绍LLVM,读者可以结合LLVM和Go语言语法树按需定制,创造一个语法与Go语言语法类似的简单的编程语言及与其对应的编译器,达到掌握自制编程语言和编译器的目的。

Go语言定制指南

Go语言的代码贡献者出版了一本《Go语言定制指南》_go语言

关于作者


柴树杉,Go/C/汇编语言爱好者,《Go语言高级编程》作者之一,关注与汇编语言相关的底层技术。他目前在蚂蚁集团从事领域特定语言(DSL)的设计和开发工作。

史斌,有十余年编译器和虚拟机开发经验。Go和LLVM 开源项目贡献者,拥有这两个项目官方代码仓库的提交权限,目前两个项目的提交记录都超过100次。他在全球Go贡献者榜上长期排名TOP50,目前致力于国产芯片软件生态系统的构建工作。

丁尔男,Go/C/Web前端技术爱好者,长年从事3D开发工作,热衷于性能优化。他目前在武汉航天远景科技股份有限公司分管3D相关产品的开发工作。


普通程序员以传统方式从头发明或实现一整套实用的编程语言难于登天:不仅要学习涉及诸多编译方面的理论,还要通过大量的编码工作解决各种细节问题。自制编程语言爱好者不只是想要掌握“龙书”的理论,更想要有一门自己可控的编程语言,因此我们同样需要寻找一条自制编程语言的捷径。

Go语言作为一门将自身的编译器内置到标准库的主流通用编译型编程语言,其与语法树相关的包的设计与实现堪称编程艺术和编译理论相结合的典范,是“Unix之父”等老一辈软件工程师毕生的艺术结晶。Go语言的语法比较简单(只有25个关键字),非常适合作为自制编程语言的基础参考语言。开源社区已经从Go语言语法树发展出了诸多扩展语言:GopherJS项目将Go语言带入了前端开发领域,TinyGo则将Go语言带入了单片机等微系统的开发领域,国内的七牛公司针对数据科学领域定制了Go+语言。这些基于Go语言的定制语言的一个共通之处就是都基于Go语言语法树进行再加工处理。因此,只要能熟练掌握Go语言语法树的使用方法,就能跨过繁杂的词法分析、语法分析等步骤,直接使用“龙书”中的高深理论,进入语言特性定制领域。这将极大地降低自定义编程语言的门槛。

研究Go语言语法的实现方式,是学习软件设计和实现技术的最好方法。虽然大多数程序员从事的是应用程序或其他系统程序的开发工作,并不需要了解编译器的原理与实现,但是他们依然可以从本书受益,原因有以下几个。

(1)理解语言语法树的工作原理可以提升编程技能。Go语言语法树涵盖了常见的数据结构和算法,程序员通过深入学习能够更好地掌握语言本身及基础算法在现代计算机上的高效实现,进而应用到他们未来的开发工作中。

(2)编译器是Go语言反射技术的另一种形态。通过手动方式解析语法树可以得到远超反射技术可以获取的信息,从而在编译时可以灵活地输出更高效的辅助代码,极大地释放元编程的能力。例如,通过Go语言语法树可以很容易地从Go语言的结构体中提取出Kubernetes的CRD结构。

(3)本书通过类似组装计算机的方式避免初学者从刚开始就陷入浩瀚繁杂的编译理论。本书先基于Go语言语法树快速组装出可以马上运行的凹语言,帮助读者快速理解Go语言底层的运行机制,便于后面更深刻地理解Go语言的特性。

《Go语言定制指南》各章主要内容

  • 第1章讨论Go语言的词法分析和抽象的FileSet对象。
  • 第2章讲解基础字面值对应的语法树结构。
  • 第3章讲解基础表达式的递归结构。
  • 第4章讲解Go语言的代码结构。
  • 第5章讨论Go语言中的导入、类型、常量和变量声明结构。
  • 第6章讨论Go函数的语法树结构,其中包括函数的接收者、函数的参数和返回值类型。
  • 第7章讲解数组和结构体等复合类型。
  • 第8章讨论更复杂的字面值。
  • 第9章讨论复合表达式,其中包含由数组索引和结构体成员等更加复杂的元素构成的表达式。
  • 第10章讨论控制流结构对应的语句块和语句。
  • 第11章讨论如何在解析后对语法树进行类型检查。
  • 第12章讲述如何从语法树解析出更有意义的语义信息。
  • 第13章讨论如何将经过语义验证的语法树转换为静态单赋值形式(简称SSA形式),静态单赋值是后端优化的重要步骤。
  • 第14章通过将Go语言的极小子集定制为一门脚本语言来展示语法树的能力。
  • 第15章讲解热门编译器后端框架LLVM的基础知识。
  • 第16章讲解一个将抽象语法树和LLVM结合并生成可执行程序的综合示例。

适用读者

本书非常适合专业技术人员自学使用,也适合在校学生用作编译原理课程的课外阅读资料。本书弥补了传统编译原理教材的不足,让枯燥无味的理论学习之路变成更有趣味的自制编程语言之旅。

延伸阅读

作者柴树杉2019年出版的《Go语言高级编程》,豆瓣评分8.0。

Go语言的代码贡献者出版了一本《Go语言定制指南》_go语言_02

本书第1章简单回顾Go语言的发展历史;第2章和第3章系统介绍CGO编程和Go汇编语言的用法;第4章对RPC和Protobuf技术进行深入介绍,并讲述如何打造一个自己的RPC系统;第5章介绍工业级环境的Web系统的设计和相关技术;最后的第6章介绍Go语言在分布式领域的一些编程技术。