Go语法树是Go语言源文件的另一种语义等价的表现形式。而Go语言自带的`go fmt`和`go doc`等命令都是在Go语法树的基础之上分析工具。因此将Go语言程序作为输入数据,让我们语法树这个维度重新审视Go语言程序,我们将得到创建Go语言本身的技术。Go语法树由标准库的`go/ast`包定义,它是在`go/token`包定义的词法基础之上抽象的语法树结构。本书简单介绍语法树相关包的使用。如果想从头实现一个玩具Go语言可以参考[《从头实现µGo语言》](https://github.com/chai2010/ugo-compiler-book)。
# 序言
在武侠小说中,天下武功出少林,少林寺的七十二绝技名扬天下。但是真正能学会并能够掌握七十二绝技的屈指可数,主要原因是学习周期太长。以七十二绝技中的一指禅为例,据说五代时期的法慧禅师以三十六年时间掌握的学习速度排名第一,其次是南宋的灵兴禅师花了三十九年时光排名第二,而韦爵爷的澄观师侄以四十二年而练成一指禅名列第三。如果一个绝技真的需要几十或上百年的时间才能掌握,那只能说明这个绝技没有实用价值,或者是学习的人没有掌握科学的学习方法。
其实少林寺的七十二绝技是有科学高效的学习方法的,这个方法由《天龙八部》中的鸠摩智发明并实践。鸠摩智国师经过科学研究发现少林寺的七十二绝技招式虽然厉害,但是其内部的驱动引擎性能极其底下(预热就需要几十年时间),而稍微强一点的易筋经引擎又涉及知识产权问题不对外开放授权,因此如何为七十二绝技定制一个合适的内功驱动引擎就成了一个关键问题。经过不懈努力,鸠摩智大师终于发现可以将逍遥派的小无相功作为驱动七十二绝技的内功引擎,从而开辟了一条武学弯道超车的新捷径。
在软件开发领域同样存在几个圣地:数据库、操作系统和编译器。其中编译器的开发技术更是被称为屠龙之技,号称龙书的《编译原理》的封面就是一个骑士在和巨龙搏斗的画面。编译器开发的相关理论就类似于少林寺内功心法,虽然理论强大但是学习的效率极其低下。而作为编译器界面的编程语言就类似于少林寺的七十二绝技的招式,普通码农如果想以常规传统的方式从头发明或实现一整套实用的编程语言难于登天。自己从头实现编程语言不仅仅要涉及诸多编译方面的理论,还需要通过大量的编码工作解决各种细节问题。作为自制编程语言爱好者而言,我们的目的不是为了单纯掌握龙书的理论,而是希望有一个自己可控的编程语言,因此我们同样需要寻找一个自制编程语言的捷径。
Go语言作为一个将自身的编译器内置到标准库的主流通用编译型编程语言,其语法树相关包的设计与实现堪称是编程艺术和编译理论相结合的典范,是Unix之父等老一辈软件工程师毕生的艺术结晶。同时Go语言的语法比较简单(只有25个关键字),非常适合作为自制编程语言的基础参考语言。开源社区已经从Go语言语法树诞生了诸多扩展语言:比如GopherJS项目将Go语言带入了前端开发领域;TinyGo则是将Go语言带入了单片机等微系统的开发领域;国内的七牛公司更是针对数据科学领域定制了Go+语言。这些基于Go定制语言的一个共通之处都是基于Go语法树进行再加工处理。因此如果能熟练掌握Go语法树的使用,就能跨过繁杂的词法分析、语法分析程序,直接使用龙书中的高深理论,进入语言特性定制领域。这将极大的降低自定义语言的门槛。
为了真正开启自制编程语言的历程,同时让Go语法树能够真正落地产生生产力,本书的最后一章引入了我们定制的语言。语言的定制过程类似自己组装一台电脑,在语言能够独立工作前并不自己创造新的核心模块,而是基于已有的软件模块进行改造和拼装,但是最终得到的依然是自主可控的语言。在语言可以初步工作之后,可以再进一步根据需求优化局部细节或者对语言的语法做局部性的重新设计,这样实现语言的每个阶段的难度都不会很大。我们的目标不是为了仅仅制造一个玩具语言,语言的语法树解析和语义分析都是工业级的,如果后端再接入LLVM就很容易将其改造为实用性的语言。
随着千禧年之后计算机在中国普及,我们国家的程序员已经在追赶并紧跟着世界前沿技术的发展。但是作为最古老的编程语言和编译相关技术,国内相关的图书资料还停留在讲述几十年前的理论或者是讲述如何构建一些缺乏实用价值的玩具语言阶段,理论和实践严重脱节。与经典著作编译龙书相比,龙书深刻地讲解了编译技术用到的理论知识;而本书立足于实战与理论的结合,教授读者利用现成的工具,快速搭建一个可以实用的编程语言。我们希望本书可以为我国编译器和编程语言的自主化提供力所能及的帮助。
最后,我们希望各位读者能够定制出自己的编程语言,并使用定制的语言快乐地编程。
# 致谢
感谢 [Ian Lance Taylor](https://www.airs.com/ian/) 本书写推荐序,他是Go语言第4位参与者,为社区做出了巨大贡献,靠一己之力完成了gccgo。感谢许式伟为本书写推荐序,许大是七牛公司的创始人和CEO,也是大中华区首席Go语言布道者。感谢Go语言之父和每一个为Go语言提交过补丁的朋友。感谢fango的第一本以Go语言为主题的网络小说《胡文Go.ogle》和第一本中文Go语言图书《Go语言·云动力》,是你的分享让带起了大家学习Go语言的热情。感谢GopherChina创始人谢孟军多年来的支持,感谢国内对社区作出贡献的每一个Go语言小伙伴,你们的奉献让社区更加壮大。最后感谢本书的编辑刘雅思老师、杨海铃老师,没有您本书就不可能出版。谢谢大家!