我的新书《Lua解释器构建:从虚拟机到编译器》出版啦~
2018年8月-2023年1月,没想到一个原本计划一个月搞定的研究,最后会延续将近4年半之久。一开始并没有想过要出一本书,只是想把自己的所学整理出来分享给大家。最后获得出书的机会也是倍感意外,完全超出自己的预期。
Lua是一门被广泛使用的动态语言,它在1993年于巴西里约热内卢天主教大学,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo创造。截止到本书编写的时间为止,Lua的最新版本为Lua5.4.4。Lua是开源的,读者可以在官网[ https://www.lua.org/ftp/]上找到它所有发布的历史版本。运行Lua脚本的程序,被称之为Lua解释器。
众所周知,要使用好一个工具,最好的方式就是理解它的内部构成,运作原理,这样我们才能如庖丁解牛一般,在使用过程中得心应手。对于一门编程语言来说,也是如此。作为一门知名的开源语言,有相当数量的技术人员、学者对其源码展开研究。
Lua尽管设计精简,我们现在能够搜集的资料也很多,但是整体上研究起来,还是有一些门槛和难度。我在经过阅读大量的资料,和实践后,梳理总结出了一套深入研究Lua解释器的知识体系和研究方法,并希望通过本书呈现给读者,给广大读者提供一种新的视角。
荀子有云:不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。其意思是,没有听到的不如听到的,听到的不如见到的,见到的不如了解到的,了解到的不如去实行,学问到了实行就达到了极点。这里的实行就是实践。同时,我们也可以相信,要更好地理解Lua解释器,最好的方式就是自己也去亲自实践,亲手写一个。向读者呈现,如何写一个能够正确运行的Lua解释器,就是我写本书的初衷。
本书将Lua解释器拆解成多个部分,一步一步构建。全书分为6个章节,第1章,介绍了解释器的基本概念,简要介绍了虚拟机和编译器,为读者继续阅读后面的内容提供铺垫。第2章介绍了Lua虚拟机,包括数据结构和基本运作流程、垃圾回收机制、字符串和表,这也是Lua虚拟机最核心的部分。第3章承上启下,介绍了Lua编译器和虚拟机如何交互。第4章介绍了Lua编译器的词法分析器和语法分析器。第5章呈现了Lua的基本特性,包括元表、Userdata、Upvalue、弱表和模块。第6章,呈现一个俄罗斯方块小游戏,它使用Lua脚本编写,并使用本书仿制的Lua解释器运行。
我希望通过拆解Lua解释器,让读者每次只专注于章节所涉及的模块,这样比直接阅读最终的源码,干扰因素会更少。因为不需要一上来,就直接面对烦琐的模块间交互的逻辑。
阅读本书,我推荐的方式是按照目录,逐个章节阅读,并且在阅读每一章随书源码之后,再自己动手写一次,并通过对应的单元测试,这样能够最充分地消化和吸收。当然,这也不是阅读本书的唯一方式,如果读者只对Lua解释器主要组成部分的结构和运作流程感兴趣,而不关心其内部实现细节,完全可以抽取感兴趣的章节进行阅读,而不阅读对应章节的随书代码。本书尽可能少地粘贴代码,而使用大量的图文进行论述。
第6章,介绍了通过本书构建的Lua解释器,运行的俄罗斯方块小游戏项目。本书添加这部分内容,目的是验证这个仿制项目各个模块的正确性,同时也是对书籍编写内容的一次总验证,最大限度验证本书的观点,以及希望通过它增强一定的说服力。
本书的设计和实现,深度参照了lua5.3的标准,本书的目标是希望通过简洁的方式,揭示Lua的内部运行机制,因此不会在所有的细节上和官方保持一致,但是基本遵循了Lua官方的设计思路。读者可以在完成本书的学习之后,再回归官方源码进行研究,相信可以事半功倍。此外,也希望读者通过本书,对研究Lua更新版本的源码,有所帮助。最后,由于作者水平有限,如果读者在阅读过程中,发现错漏,可以在本书的随书源码GitHub仓库(https://github.com/Manistein/let-us-build-a-lua-interpreter/issues)上提给作者。
本书的随书源码可以在这个链接找到:
感谢所有支持我的朋友们。出书的过程虽然艰辛,但是收获满满,尤其是认识了昆仑万维技术总监蔡哥、微软最有价值专家毛利老师、腾讯游戏服务器专家廖哥,廖哥是PUBGM和ApexM的架构师、当然还有美国犹他大学CPU博士,也是知名人工智能编译器TVM的维护者之一Marisa博士。感谢这几个大佬为我推荐。
最后放一个购买链接XD[社会社会][社会社会][社会社会]:
Lua解释器构建:从虚拟机到编译器【图片 价格 品牌 评论】-京东item.m.jd.com/product/13807126.html?gx=RnExlzJaOzK