为什么编写本书
Lua是一门强大、高效、轻量、可嵌入的脚本语言。Lua语言设计十分精巧,在一个很小的内核上可以支持函数式编程、面向对象编程、元编程等多种编程范式。以本书完稿时的最新版本Lua 5.3.4为例,全部代码(包括Lua虚拟机、编译器、标准库等)仅有2万多行,这其中还包括注释和空行。
Lua语言大约于1993年诞生于巴西PUC-Rio大学,之后在游戏领域大放异彩,被很多游戏客户端选为脚本语言,比如知名游戏《魔兽世界》《模拟城市4》《愤怒的小鸟》等。很多流行的游戏引擎也选择Lua作为脚本语言,比如CryENGINE2、Cocos2d-x及Corona SDK等。另外,也有很多游戏服务端采用C/C++搭配Lua的开发模式。除了游戏领域,Lua语言在其他地方也有很多应用,例如被广泛使用的NoSQL数据库Redis就使用Lua作为脚本语言扩展其能力。
相信自己动手设计并实现一门编程语言是每个程序员都会有的一个梦想,目前国内也已经出版或引进了一些指导读者自己实现编程语言的书籍。不过这些书籍要么只介绍了语言实现环节中的一小部分,无法纵观全局;要么只讨论某种大幅裁减后的简化语言,离真正的工业语言还有一定距离。例如,我自己的《自己动手写Java虚拟机》,只讨论了Java虚拟机实现,没有涉及Java编译器和Java标准库。
如上所述,之所以选择Lua语言,就是因为它足够小巧,并且有很好的流行度。麻雀虽小,五脏俱全,这使得我们可以在一本书的篇幅范围内覆盖虚拟机、编译器、标准库这三个方面的内容。希望读者可以通过本书完整体验一门编程语言的实现过程,为将来打造属于自己的语言做好准备。这正是本书的与众不同之处。
本书主要内容
本书主要内容可以分为四个部分:第一部分(第1章)为准备工作;第二部分(第2~ 13章)主要讨论Lua虚拟机和Lua API;第三部分(第14~17章)主要讨论Lua语法和编译器,第四部分(第18~21章)主要讨论Lua标准库。
全书共21章,各章内容安排如下:
第一部分(准备)
第1章:准备工作。
准备编程环境,编写“Hello,World!”程序。
第二部分(Lua虚拟机和Lua API)
第2章:二进制chunk。
介绍Lua二进制chuck文件格式,编写代码解析二进制chunk文件。
第3章:指令集
介绍Lua虚拟机指令集和指令编码格式,编写代码对指令进行解码。
第4章:Lua API
初步介绍Lua API和Lua State,实现栈相关API方法。
第5章:Lua运算符
介绍Lua语言运算符,给Lua API添加运算符相关方法。
第6章:虚拟机雏形
初步实现Lua虚拟机,可以解释执行大约一半的Lua虚拟机指令。
第7章:表
介绍并实现Lua表、表相关API方法,以及表相关指令。
第8章:函数调用
介绍并实现Lua函数调用。
第9章:Go函数调用
介绍如何在Lua中调用Go语言函数。
第10章:闭包和Upvalue
介绍并实现闭包和Upvalue,以及Upvalue相关指令。
第11章:元编程
介绍并实现Lua元表、元方法及元编程。
第12章:迭代器
介绍并实现Lua迭代器。
第13章:异常和错误处理
介绍Lua异常和错误处理机制。
第三部分(Lua语法和编译器)
第14章:词法分析
介绍Lua语言词法规则,实现词法分析器。
第15章:抽象语法树
初步介绍Lua语言语法规则,定义抽象语法树。
第16章:语法分析
进一步介绍Lua语言语法规则,编写语法分析器。
第17章:代码生成
编写代码生成器。
第四部分(Lua标准库)
第18章:辅助API和基础库
介绍Lua辅助API和标准库,实现基础库。
第19章:工具库
介绍并实现数学、表、字符串、UTF-8、OS等标准库。
第20章:包和模块
介绍Lua包和模块机制,实现package标准库。
第21章:协程
介绍Lua协程,实现coroutine标准库。
本书面向的读者
本书假定读者已经了解Go语言和Lua语言,所以不会对这两种语言的语法进行专门介绍。本书使用Go语言实现Lua解释器,但并没有用到特别高深的技术,加之Go语言语法比较简单,相信有C系列语言(比如C、C++、C#、Java等)基础的程序员都可以轻松读懂书中的代码。此外,如果读者更加熟悉Java语言,本书也提供了Java版实现代码。简而言之,本书主要面向以下三类读者:
对脚本语言实现原理感兴趣的读者。
对编译原理和高级语言虚拟机感兴趣的读者。
对Lua语言感兴趣,想探究其内部实现的读者。
如何阅读本书
本书内容主要围绕代码对Lua虚拟机、编译器和标准库展开讨论。本书代码经过精心安排,除第1章外,每一章都建立在前一章的基础之上,但每一章又都可以单独编译和运行。建议读者从第1章开始,按顺序阅读本书并学习每一章的代码。但也可以直接跳到感兴趣的章节进行阅读,必要时再阅读其他章节。
参考资料
相比C/C++、Java、Python等主流语言,Lua算是较为小众的语言,因此能够找到的介绍其内部实现原理和细节的资料并不多,这也是本书写作的动机之一。除了Lua官方实现的源代码,本书在写作过程中主要参考了下面这些资料:
《Programming in Lua, Fourth Edition》
《Lua 5.3 Reference Manual》
《The Evolution of Lua》
《The Implementation of Lua 5.0》
《A No-Frills Introduction to Lua 5.1 VM Instructions》
《Lua 5.3 Bytecode Referenc