从零开始的Lua教程(零):学习路线
出于分享学习心得和获得同伴讨论的目的,我打算写一个教程给想要学习如何实现lua解释器的同学提供一个参考。
我的学习经历
我在去年4月开始接触到游戏引擎的脚本引擎,那时我在读一本名为《游戏脚本高级教程》的书。
这本书在我的脑子里植入了一个想法:脚本引擎是一个方便的开发工具。
经过一些搜索和学习,我选择了lua语言并决定实现它。
我从4月开发到8月底,加上今年3月到5月,共计半年的时间,完成了python和c#两个版本。
这里我使用了原型开发方法:先使用python开发项目原型,理解实现框架和基本概念,使用pythonic的方式编写优雅的代码,忽略边界条件和细节。然后再用c#重写并最终实现项目。
学习路线
我提供一个学习路线:
简略版
- 掌握C和Lua编程语言
- 掌握编译原理
- 实现一个json解析器
- 实现lua解释器
详细版
首先需要一些编程的经验,应该掌握一门静态类型语言和一门动态类型语言。
C和Lua是必须的,因为Lua是用C实现的。
不必过于纠结细节,语言本身要通过使用来增进理解。
然后需要编译原理的知识,包括以下主题:
- 了解编译器大概如何工作(龙书第2章)
- 词法分析
- 语法分析的LL算法
- 代码生成
然后实现一个json解析器,参见milo yip的json教程。
Milo Yip:从零开始的 JSON 库教程zhuanlan.zhihu.comjson是一个简洁的数据定义语言,适合作为实现lua的热身练习。
此外,你可以发现lua的表构造表达式(table constructor)和json非常相似,可以认为是抽出一部分先实现了。
然后才开始实现lua,获取以下资料后结合lua源代码学习如何实现lua:
Lua解释器实现参考资料
-
- 《Lua设计与实现》
- 《自己动手实现Lua》
- 《Programming in Lua 4th Edition》
- 《The Implementation Of Lua5》
- 《A No Frill Intro To Lua5.1 VM Instructions》
- 《Lua Bytecode Reference 5.3》
- 《The Evolution Of Lua》
实现路线
我提供一个实现路线:
将lua分为前端编译器和后端虚拟机两个部分。
首先实现虚拟机。为了测试虚拟机,实现undump模块,使用clua编译出二进制chunk文件,由undump读取出Proto实例,喂给虚拟机执行。
- 实现lundump模块(luaU_undump函数)
- 实现lopcodes模块
- 实现lobject模块
- 实现虚拟机的指令循环(luaV_execute函数)
然后再实现编译器,按词法分析,语法分析,代码生成的顺序即可。