猜你喜欢
Lua解释器构建:从虚拟机到编译器

Lua解释器构建:从虚拟机到编译器

书籍作者:吴尹杰 ISBN:9787111718833
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:1925
创建日期:2023-05-28 发布日期:2023-05-28
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介
Lua是一门设计精简、功能强大的脚本语言。本书将Lua解释器拆解,使用C语言,一步一步构建能够正确运行的Lua解释器。本书共6章,分别为Lua解释器概述,Lua虚拟机,Lua脚本的编译与虚拟机指令运行流程,Lua编译器,Lua的解释器的其他基础特征,dummylua开发案例:俄罗斯方块。阅读本书,并不需要读者事先精通有关编译原理的知识,书中会尝试用简洁的语言,向读者介绍相关的具体内容。
Lua解释器构建:从虚拟机到编译器面向对Lua内部以及解释器的设计和实现感兴趣的读者,并要求读者对C语言和Lua有一定的了解和使用经验。本书免费提供书中配套案例的全部源码,相关获取方式见封底。
作者简介
吴尹杰 网名Manistein,广州某游戏开发有限公司服务端技术总监,热爱计算机技术,喜欢钻研,熟悉多门编程语言,为知名服务端框架skynet贡献过多篇核心源码分析文档。
个人博客地址:http://manistein.club/ 。
编辑推荐
适读人群 :软件工程师 游戏开发者 在校大学生 新入行IT从业者
这是一本深入探索Lua解释器内部设计与实现的书,作者专业能力强,有一定的粉丝群体,建议前期全网推广。
前言
Lua是一门被广泛使用的脚本语言,它是巴西里约热内卢天主教大学里的一个由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所组成的研究小组于1993年开发的。截止本书编写的时间,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章介绍了一个dummylua开发案例:俄罗斯方块,它使用Lua脚本编写,并使用本书仿制的Lua解释器运行。
笔者希望通过拆解Lua解释器,让读者每次只专注于章节所涉及的模块,这样比直接阅读最终的源码,干扰因素会更少。因为不需要一开始就直接面对烦琐的模块间交互的逻辑。
阅读本书,笔者推荐的方式是按照目录,逐个章节阅读,并且在阅读每一章随书源码之后,再自己动手写一次,并通过对应的单元测试,这样能够最充分地消化和吸收所学的内容。当然,这也不是阅读本书的唯一方式,如果读者只对Lua解释器主要组成部分的结构和运行流程感兴趣,而不关心其内部实现细节,完全可以抽取感兴趣的章节进行阅读,而不阅读对应章节的随书代码。本书尽可能少粘贴代码,而使用大量的图文进行论述。
本书的设计和实现参照了Lua 5.3的标准,目的是希望通过简洁的方式,揭示Lua的内部运行机制,因此不会在所有的细节上和官方保持一致,但是基本遵循了Lua官方的设计思路。读者可以在完成本书的学习之后,再回归官方源码进行研究,相信可以事半功倍。此外,也希望读者通过本书,对研究Lua更新版本的源码有所帮助。
本书的内容,始于笔者2018年开始写的Lua解释器相关的博客。从开始到完成,笔者得到了许多朋友的热情支持。
首先要感谢的是机械工业出版社的编辑们,感谢他们的辛勤付出,使得书籍的书写方式和组织结构更加严谨。
其次要感谢为笔者写推荐语的四位老师:昆仑万维技术总监蔡俊鸿、美国犹他大学CPU博士Marisa、微软最有价值专家Mouri和腾讯游戏服务器专家廖阿敏。他们不辞辛劳,在百忙之中阅读了稿件,并提供了很多很好的建议。同时也祝贺Marisa博士在学术领域取得了新的突破,他们的新算法能使V8引擎的GC性能提升30%。
最后要感谢笔者的父母和妹妹一直以来的支持,还有一直在背后支持笔者的朋友们,他们是笔者能坚持完成本书的动力。
目录

前言
第1章 Lua解释器概述/
1.1 Lua解释器/
1.1.1 Lua解释器的整体架构/
1.1.2 Lua解释器的运行机制/
1.2 Lua虚拟机/
1.2.1 虚拟机简介/
1.2.2 虚拟机指令的编码方式/
1.2.3 虚拟机指令集/
1.3 Lua编译器/
1.3.1 Lua的词法分析器/
1.3.2 Lua的语法分析器/
1.4 从0开发一个Lua解释器:dummylua项目/
1.4.1 项目简介/
1.4.2 项目架构说明/
第2章 Lua虚拟机/
2.1 Lua虚拟机基础知识/
2.1.1 基本类型定义/
2.1.2 虚拟机全局状态——global_State/
2.1.3 虚拟机的线程结构——lua_State/
2.1.4 虚拟机中执行函数的基础——CallInfo结构/
2.1.5 C函数在虚拟机线程中的调用流程/
2.1.6 虚拟机异常处理机制/
2.1.7 dummylua项目的虚拟机基础实现/
2.2 为虚拟机添加垃圾回收机制/
2.2.1 标记清除算法/
2.2.2 增量式标记清除算法/
2.2.3 dummylua项目的垃圾回收机制实现/
2.3 Lua虚拟机的字符串/
2.3.1 Lua字符串概述/
2.3.2 Lua字符串结构/
2.3.3 字符串的哈希运算/
2.3.4 短字符串与内部化/
2.3.5 长字符串与惰性哈希/
2.3.6 Lua-5.2的Hash DoS攻击/
2.3.7 dummylua的字符串实现/
2.4 Lua虚拟机的表/
2.4.1 Lua表功能概述/
2.4.2 Lua表的基本数据结构/
2.4.3 表的初始化/
2.4.4 键值的哈希运算/
2.4.5 查找元素/
2.4.6 值的更新与插入/
2.4.7 调整表的大小/
2.4.8 表遍历/
2.4.9 dummylua的表实现/
第3章 Lua脚本的编译与虚拟机指令运行流程 /
3.1 第一个编译并运行脚本的例子:让Lua说“hello world”/
3.2 Lua的整体编译和运行流程/
3.3 虚拟机如何运行编译后的指令/
3.4 虚拟机输出“hello world”的例子/
3.5 反编译工具——protodump/
3.5.1 protodump工具简介/
3.5.2 使用protodump反编译Lua的字节码/
3.5.3 反编译结果分析/
3.6 标准库加载流程/
3.7 Lua内置编译器补充说明/
3.7.1 EBNF简介/
3.7.2 本章定义的EBNF/
3.7.3 词法分析器设计与实现/
3.7.4 语句和表达式/
3.7.5 语法分析器的基础设计与实现/
3.8 让dummylua能够编译并运行“hello world”脚本/
第4章 Lua编译器/
4.1 Lua词法分析器 /
4.1.1 词法分析器简介/
4.1.2 词法分析器基本数据结构/
4.1.3 词法分析器的接口设计/
4.1.4 词法分析器的初始化流程/
4.1.5 token识别流程/
4.1.6 一个测试用例/
4.1.7 dummylua的词法分析器实现/
4.2 Lua语法分析器基础——expr语句编译流程/
4.2.1 语法分析器的主要工作/
4.2.2 实现的语法/
4.2.3 语法分析器基本数据结构/
4.2.4 编译逻辑与EBNF的关联/
4.2.5 exprstat的逻辑结构/
4.2.6 expr的构造与编译/
4.2.7 suffixedexp构造与编译/
4.2.8 assignment构造和编译/
4.2.9 为dummylua添加编译exprstat的功能/
4.3 完整的Lua语法分析器/
4.3.1 Lua的语句块/
4.3.2 local语句编译流程/
4.3.3 doend语句编译流程/
4.3.4 if语句编译流程/
4.3.5 while语句编译流程/
4.3.6 repeat语句编译流程/
4.3.7 for语句编译流程/
4.3.8 break语句编译流程/
4.3.9 function语句编译流程/
4.3.10 return语句编译流程 /
4.3.11 dummylua的完整语法分析器实现/
第5章 Lua解释器的其他基础特性/
5.1 元表/
5.1.1 元表简介/
5.1.2 元表的_index域/
5.1.3 元表的_newindex域/
5.1.4 双目运算事件/
5.1.5 dummylua的元表实现/
5.2 用户数据/
5.2.1 用户数据的数据结构/
5.2.2 用户数据的接口/
5.2.3 用户数据的垃圾回收处理/
5.2.4 用户数据的user domain域内部的堆内存清理/
5.2.5 用户数据的测试用例/
5.2.6 dummylua的用户数据实现/
5.3 上值/
5.3.1 上值的定义/
5.3.2 Lua函数的探索/
5.3.3 上值的生成/
5.3.4 开放上值和已关闭上值/
5.3.5 dummylua的上值实现/
5.4 弱表 /
5.4.1 弱表的定义/
5.4.2 弱表的用途/
5.4.3 弱键/
5.4.4 弱值/
5.4.5 完全弱引用/
5.4.6 dummylua的弱表实现/
5.5 require机制 /
5.5.1 require功能简述/
5.5.2 package初始化/
5.5.3 require运作流程/
5.5.4 dummylua的require机制实现/
第6章 dummylua开发案例:俄罗斯方块/
6.1 案例简介/
6.2 案例代码结构/
6.3 编译与运行/
附录/
附录A Lua虚拟机指令集/
附录B Lua的EBNF语法/