写在前面
- 这本书长这样
- 这本书用Go语言实现Lua(包括虚拟机、编译器和标准库)。
- 本书的章节设计是我看过的专业书中设计最用心的,共21章,每章在前一章的基础上实现一个内容;平均下来每章的页数差不多,如果时间充分,一天读完一章(包括写代码)也是可以做到的。
- 本书的写作方式仍然是我喜欢的“谈话口吻”,非常详细,非常体贴我一个开头并不了解“虚拟机是什么”种种问号的人。
- 我认为它可以归到“能顺顺利利读下来的专业书”一类。
一些准备
- 心理准备:在下定决心读完这本书前,我翻了翻前言,感觉是“要读此书,先需要会Go语言,需要了解编译原理”,但我不会Go,也不会编译原理,如果真想读完这本书,感觉要花很多时间先去学Go和编译原理!Go倒还好说,我学到能基本看懂Go代码的程度就差不多了,这个花不了多久,但让我先弄懂编译原理实在有难度,而且我再一搜《编译原理》,真是好厚一砖头书!这会不会和我“实现Lua”的目标南辕北辙呢?“到底要不要读完这本书”,做这个心理准备真的做了很久,最后下的决定是先读起来,Go和编译原理它要用到的时候再去另外看。结果我发现读起来的时候,Go语言我是推迟到第2章一半内容读过去了才开始学的,学Go期间也在每天读这本书,只不过阅读进度缓慢;至于编译原理,我发现完全不用提前学,因为这本书就是在教我什么是编译原理,虽然我还没翻过《编译原理》一书,无法和它做对比,但我觉得既然它已经教会我成功“实现一种语言”,那《编译原理》想告诉我的,这本书也同样告诉了我。
- 搭建环境:“学一种语言,最难的一步就是第一步”,放在这里就是搭建环境,为了能成功跑出Lua语言和Go语言版的Hello World,我在搭建环境上花了不少时间,为此特意各写了一篇博文做踩坑记录( Lua:Windows快捷安装Lua ,Go:Windows用VSCode搭建Go环境 );读书到后期第19章,还需要先安装gcc编译器,不然会报无gcc错误,gcc编译器安装可以参考这两篇博文(博文1, 博文2)。
- 命令行:因为此书是在Mac环境中敲的代码,而命令行内容在Mac和Windows上略有不同,我特意在G站上另外开了一个库记录此书Windows相关命令行内容,不关心命令行差异的读者可以直接复制使用。
一些感想
- 我出于想要了解“为什么Lua就能实现热更新”的目的,开始搜索Lua相关书籍,结果除了《Lua程序设计》,还有《Lua设计与实现》,而《自己动手实现Lua》一书是在前两本书的参考下写作出来的,于是我把这三本书都买下来,到手先翻了翻。《Lua程序设计》是我的入门书在此略过,《Lua设计与实现》更像分析Lua源码的理论书籍,而《自己动手实现Lua》有实践部分能让我留下印象,所以我才选择这本书开始阅读,但读完感觉此书并没有介绍到热更部分。不过我在《Lua设计与实现》一书目录上有看到热更部分,所以我的下一本书会是阅读《Lua设计与实现》。
- 虽然阅读目的没有实现,但我顺便学会了虚拟机和编译器(我的成品)。
- 此书已经极尽所能讨论且实现了Lua的重要部分,对于我关心的userdata类型,GC垃圾回收等内容没有讲述,在阅读过程中也有一些小问题没有解决,我还需要阅读其他资料,继续把Lua琢磨明白。