自己动手实现Lua:虚拟机、编译器和标准库 出版时间: 2018内容简介 本书是一本面向Lua程序员和脚本语言爱好者的语言自制指南和实战宝典。作者融合自己丰富的工程实践经验,详细阐述Lua语言的核心语法和实现原理,深入探讨Lua虚拟机、编译器和标准库,并给出了实际可以编译执行的代码。助你从零基础开始编程实现Lua语言,彻底理解脚本语言工作原理。全书分为3个部分,共21章。部分主要讨论LuaAPI和虚拟机实现,包括二进制chunk格式、Lua虚拟机指令集、元编程、错误处理等。第二部分主要讨论Lua语法和编译器实现,包括词法分析、语法分析、代码优化、代码生成等。第三部分主要讨论Lua辅助API和标准库实现,包括基础库、实用工具库、包和模块、协程等。目录前言第一部分 准备第1章 准备工作 31.1 准备开发环境 31.1.1 操作系统 31.1.2 安装Lua 41.1.3 安装Go 41.2 准备目录结构 41.3 本章小结 6第二部分 Lua虚拟机和Lua API第2章 二进制chunk 92.1 什么是二进制chunk 102.2 luac命令介绍 112.2.1 编译Lua源文件 112.2.2 查看二进制chunk 132.3 二进制chunk格式 152.3.1 数据类型 162.3.2 总体结构 172.3.3 头部 182.3.4 函数原型 222.4 解析二进制chunk 272.4.1 读取基本数据类型 282.4.2 检查头部 292.4.3 读取函数原型 302.5 测试本章代码 332.6 本章小结 36第3章 指令集 373.1 指令集介绍 373.2 指令编码格式 383.2.1 编码模式 383.2.2 操作码 393.2.3 操作数 403.2.4 指令表 413.3 指令解码 423.4 测试本章代码 443.5 本章小结 47第4章 Lua API 494.1 Lua API介绍 494.2 Lua栈 514.2.1 Lua数据类型和值 514.2.2 栈索引 544.2.3 定义luaStack结构体 544.3 Lua State 574.3.1 定义LuaState接口 574.3.2 定义luaState结构体 584.3.3 基础栈操纵方法 594.3.4 Push方法 644.3.5 Access方法 654.4 测试本章代码 694.5 本章小结 70第5章 Lua运算符 715.1 Lua运算符介绍 715.2 自动类型转换 755.3 扩展LuaState接口 795.3.1 Arith()方法 805.3.2 Compare()方法 835.3.3 Len()方法 855.3.4 Concat()方法 865.4 测试本章代码 875.5 本章小结 88第6章 虚拟机雏形 896.1 添加LuaVM接口 896.1.1 定义LuaVM接口 916.1.2 改造luaState结构体 926.1.3 实现LuaVM接口 936.2 实现Lua虚拟机指令 946.2.1 移动和跳转指令 946.2.2 加载指令 966.2.3 算术运算指令 1016.2.4 长度和拼接指令 1036.2.5 比较指令 1066.2.6 逻辑运算指令 1076.2.7 for循环指令 1106.3 指令分派 1136.4 测试本章代码 1156.5 本章小结 118第7章 表 1197.1 表介绍 1197.2 表内部实现 1217.3 表相关API 1257.3.1 Get方法 1267.3.2 Set方法 1297.4 表相关指令 1317.4.1 NEWTABLE 1317.4.2 GETTABLE 1337.4.3 SETTABLE 1357.4.4 SETLIST 1367.5 测试本章代码 1387.6 本章小结 140第8章 函数调用 1418.1 函数调用介绍 1418.2 函数调用栈 1438.2.1 调用帧实现 1448.2.2 调用栈实现 1458.3 函数调用API 1478.3.1 Load() 1488.3.2 Call() 1498.4 函数调用指令 1528.4.1 CLOSURE 1528.4.2 CALL 1538.4.3 RETURN 1578.4.4 VARARG 1588.4.5 TAILCALL 1598.4.6 SELF 1608.4.7 扩展LuaVM接口 1628.4.8 改进SETLIST指令 1638.5 测试本章代码 1648.6 本章小结 166第9章 Go函数调用 1679.1 Go函数登场 1679.1.1 添加Go函数类型 1689.1.2 扩展Lua API 1699.1.3 调用Go函数 1709.2 Lua注册表 1729.2.1 添加注册表 1729.2.2 操作注册表 1739.3 全局环境 1759.3.1 使用API操作全局环境 1759.3.2 在Lua里访问全局环境 1789.4 测试本章代码 1799.5 本章小结 181第10章 闭包和Upvalue 18310.1 闭包和Upvalue介绍 18310.1.1 背景知识 18310.1.2 Upvalue介绍 18510.1.3 全局变量 18710.2 Upvalue底层支持 18910.2.1 修改closure结构体 18910.2.2 Lua闭包支持 19110.2.3 Go闭包支持 19210.3 Upvalue相关指令 19510.3.1 GETUPVAL 19510.3.2 SETUPVAL 19610.3.3 GETTABUP 19710.3.4 SETTABUP 19910.3.5 JMP 20010.4 测试本章代码 20210.5 本章小结 203第11章 元编程 20511.1 元表和元方法介绍 20511.1.1 元表 20611.1.2 元方法 20611.2 支持元表 20711.3 调用元方法 20811.3.1 算术元方法 20911.3.2 长度元方法 21111.3.3 拼接元方法 21111.3.4 比较元方法 21211.3.5 索引元方法 21411.3.6 函数调用元方法 21611.4 扩展Lua API 21711.4.1 GetMetatable() 21811.4.2 SetMetatable() 21811.5 测试本章代码 21911.6 本章小结 222第12章 迭代器 22312.1 迭代器介绍 22312.2 next()函数 22612.2.1 修改luaTable结构体 22712.2.2 扩展Lua API 22812.2.3 实现next()函数 22912.3 通用for循环指令 22912.4 测试本章代码 23212.5 本章小结 234第13章 异常和错误处理 23513.1 异常和错误处理介绍 23513.2 异常和错误处理API 23713.2.1 Error() 23813.2.2 PCall() 23913.3 error()和pcall()函数 24013.4 测试本章代码 24113.5 本章小结 242第三部分 Lua语法和编译器第14章 词法分析 24514.1 编译器介绍 24514.2 Lua词法介绍 24714.3 实现词法分析器 25114.3.1 定义Token类型 25214.3.2 空白字符 25414.3.3 注释 25614.3.4 分隔符和运算符 25614.3.5 长字符串字面量 25814.3.6 短字符串字面量 25914.3.7 数字字面量 26214.3.8 标识符和关键字 26314.4 LookAhead()和其他方法 26414.5 测试本章代码 26514.6 本章小结 267第15章 抽象语法树 26915.1 抽象语法树介绍 26915.2 Chunk和块 27015.3 语句 27215.3.1 简单语句 27315.3.2 while和repeat语句 27315.3.3 if语句 27415.3.4 数值for循环语句 27515.3.5 通用for循环语句 27515.3.6 局部变量声明语句 27615.3.7 赋值语句 27715.3.8 非局部函数定义语句 27815.3.9 局部函数定义语句 27915.4 表达式 28015.4.1 简单表达式 28015.4.2 运算符表达式 28115.4.3 表构造表达式 28115.4.4 函数定义表达式 28215.4.5 前缀表达式 28315.4.6 圆括号表达式 28415.4.7 表访问表达式 28415.4.8 函数调用表达式 28515.5 本章小结 286第16章 语法分析 28716.1 语法分析介绍 28716.1.1 歧义 28816.1.2 前瞻和回溯 28916.1.3 解析方式 29016.2 解析块 29016.3 解析语句 29316.3.1 简单语句 29416.3.2 if语句 29616.3.3 for循环语句 29716.3.4 局部变量声明和函数定义语句 29916.3.5 赋值和函数调用语句 30016.3.6 非局部函数定义语句 30216.4 解析表达式 30316.4.1 运算符表达式 30416.4.2 非运算符表达式 30616.4.3 函数定义表达式 30716.4.4 表构造表达式 30816.4.5 前缀表达式 31016.4.6 圆括号表达式 31116.4.7 函数调用表达式 31216.4.8 表达式优化 31316.5 测试本章代码 31516.6 本章小结 316第17章 代码生成 31717.1 定义funcInfo结构体 31717.1.1 常量表 31817.1.2 寄存器分配 31917.1.3 局部变量表 32017.1.4 Break表 32317.1.5 Upvalue表 32417.1.6 字节码 32517.1.7 其他信息 32717.2 编译块 32717.3 编译语句 32917.3.1 简单语句 33017.3.2 while和repeat语句 33117.3.3 if语句 33317.3.4 for循环语句 33417.3.5 局部变量声明语句 33517.3.6 赋值语句 33717.4 编译表达式 33917.4.1 函数定义表达式 34017.4.2 表构造表达式 34117.4.3 运算符表达式 34317.4.4 名字和表访问表达式 34517.4.5 函数调用表达式 34617.5 生成函数原型 34717.6 使用编译器 34917.7 测试本章代码 35017.8 本章小结 350第四部分 Lua标准库第18章 辅助API和基础库 35318.1 Lua标准库介绍 35318.2 辅助API 35518.2.1 增强版方法 35718.2.2 加载方法 35818.2.3 参数检查方法 35918.2.4 标准库开启方法 36018.3 基础库 36118.3.1 基础库介绍 36218.3.2 基础库实现 36218.4 测试本章代码 36518.5 本章小结 366第19章 工具库 36719.1 数学库 36719.2 表库 36919.3 字符串库 37219.4 UTF-8库 37419.5 OS库 37619.6 本章小结 379第20章 包和模块 38120.1 包和模块介绍 38120.2 实现包库 38620.3 测试本章代码 39120.4 本章小结 392第21章 协程 39321.1 协程介绍 39321.2 协程API 39621.2.1 支持线程类型 39621.2.2 支持协程操作 39821.3 实现协程库 40021.4 测试本章代码 40321.5 本章小结 404附录A Lua虚拟机指令集 405附录B Lua语法EBNF描述 407后记 409 上一篇: C++性能优化指南 [美]柯尔特-甘瑟尔罗斯 下一篇: Android进阶解密