自己动手实现Lua 虚拟机 编译器和标准库pdf

图书网 2022年2月6日22:21:32
评论
999

自己动手实现Lua 虚拟机 编译器和标准库 作者:张秀宏

自己动手实现Lua 虚拟机 编译器和标准库 出版社:机械工业出版社

自己动手实现Lua 虚拟机 编译器和标准库 内容简介

本书是一本面向Lua程序员和脚本语言爱好者的语言自制指南和实战宝典。作者融合自己丰富的工程实践经验,详细阐述Lua语言的核心语法和实现原理,深入探讨Lua虚拟机、编译器和标准库,并给出了实际可以编译执行的代码。助你从零基础开始编程实现Lua语言,彻底理解脚本语言工作原理。全书分为3个部分,共21章。部分主要讨论LuaAPI和虚拟机实现,包括二进制chunk格式、Lua虚拟机指令集、元编程、错误处理等。第二部分主要讨论Lua语法和编译器实现,包括词法分析、语法分析、代码优化、代码生成等。第三部分主要讨论Lua辅助API和标准库实现,包括基础库、实用工具库、包和模块、协程等。

自己动手实现Lua 虚拟机 编译器和标准库 目录

前言

第一部分 准备

第1章 准备工作 3

1.1 准备开发环境 3

1.1.1 操作系统 3

1.1.2 安装Lua 4

1.1.3 安装Go 4

1.2 准备目录结构 4

1.3 本章小结 6

第二部分 Lua虚拟机和Lua API

第2章 二进制chunk 9

2.1 什么是二进制chunk 10

2.2 luac命令介绍 11

2.2.1 编译Lua源文件 11

2.2.2 查看二进制chunk 13

2.3 二进制chunk格式 15

2.3.1 数据类型 16

2.3.2 总体结构 17

2.3.3 头部 18

2.3.4 函数原型 22

2.4 解析二进制chunk 27

2.4.1 读取基本数据类型 28

2.4.2 检查头部 29

2.4.3 读取函数原型 30

2.5 测试本章代码 33

2.6 本章小结 36

第3章 指令集 37

3.1 指令集介绍 37

3.2 指令编码格式 38

3.2.1 编码模式 38

3.2.2 操作码 39

3.2.3 操作数 40

3.2.4 指令表 41

3.3 指令解码 42

3.4 测试本章代码 44

3.5 本章小结 47

第4章 Lua API 49

4.1 Lua API介绍 49

4.2 Lua栈 51

4.2.1 Lua数据类型和值 51

4.2.2 栈索引 54

4.2.3 定义luaStack结构体 54

4.3 Lua State 57

4.3.1 定义LuaState接口 57

4.3.2 定义luaState结构体 58

4.3.3 基础栈操纵方法 59

4.3.4 Push方法 64

4.3.5 Access方法 65

4.4 测试本章代码 69

4.5 本章小结 70

第5章 Lua运算符 71

5.1 Lua运算符介绍 71

5.2 自动类型转换 75

5.3 扩展LuaState接口 79

5.3.1 Arith()方法 80

5.3.2 Compare()方法 83

5.3.3 Len()方法 85

5.3.4 Concat()方法 86

5.4 测试本章代码 87

5.5 本章小结 88

第6章 虚拟机雏形 89

6.1 添加LuaVM接口 89

6.1.1 定义LuaVM接口 91

6.1.2 改造luaState结构体 92

6.1.3 实现LuaVM接口 93

6.2 实现Lua虚拟机指令 94

6.2.1 移动和跳转指令 94

6.2.2 加载指令 96

6.2.3 算术运算指令 101

6.2.4 长度和拼接指令 103

6.2.5 比较指令 106

6.2.6 逻辑运算指令 107

6.2.7 for循环指令 110

6.3 指令分派 113

6.4 测试本章代码 115

6.5 本章小结 118

第7章 表 119

7.1 表介绍 119

7.2 表内部实现 121

7.3 表相关API 125

7.3.1 Get方法 126

7.3.2 Set方法 129

7.4 表相关指令 131

7.4.1 NEWTABLE 131

7.4.2 GETTABLE 133

7.4.3 SETTABLE 135

7.4.4 SETLIST 136

7.5 测试本章代码 138

7.6 本章小结 140

第8章 函数调用 141

8.1 函数调用介绍 141

8.2 函数调用栈 143

8.2.1 调用帧实现 144

8.2.2 调用栈实现 145

8.3 函数调用API 147

8.3.1 Load() 148

8.3.2 Call() 149

8.4 函数调用指令 152

8.4.1 CLOSURE 152

8.4.2 CALL 153

8.4.3 RETURN 157

8.4.4 VARARG 158

8.4.5 TAILCALL 159

8.4.6 SELF 160

8.4.7 扩展LuaVM接口 162

8.4.8 改进SETLIST指令 163

8.5 测试本章代码 164

8.6 本章小结 166

第9章 Go函数调用 167

9.1 Go函数登场 167

9.1.1 添加Go函数类型 168

9.1.2 扩展Lua API 169

9.1.3 调用Go函数 170

9.2 Lua注册表 172

9.2.1 添加注册表 172

9.2.2 操作注册表 173

9.3 全局环境 175

9.3.1 使用API操作全局环境 175

9.3.2 在Lua里访问全局环境 178

9.4 测试本章代码 179

9.5 本章小结 181

第10章 闭包和Upvalue 183

10.1 闭包和Upvalue介绍 183

10.1.1 背景知识 183

10.1.2 Upvalue介绍 185

10.1.3 全局变量 187

10.2 Upvalue底层支持 189

10.2.1 修改closure结构体 189

10.2.2 Lua闭包支持 191

10.2.3 Go闭包支持 192

10.3 Upvalue相关指令 195

10.3.1 GETUPVAL 195

10.3.2 SETUPVAL 196

10.3.3 GETTABUP 197

10.3.4 SETTABUP 199

10.3.5 JMP 200

10.4 测试本章代码 202

10.5 本章小结 203

第11章 元编程 205

11.1 元表和元方法介绍 205

11.1.1 元表 206

11.1.2 元方法 206

11.2 支持元表 207

11.3 调用元方法 208

11.3.1 算术元方法 209

11.3.2 长度元方法 211

11.3.3 拼接元方法 211

11.3.4 比较元方法 212

11.3.5 索引元方法 214

11.3.6 函数调用元方法 216

11.4 扩展Lua API 217

11.4.1 GetMetatable() 218

11.4.2 SetMetatable() 218

11.5 测试本章代码 219

11.6 本章小结 222

第12章 迭代器 223

12.1 迭代器介绍 223

12.2 next()函数 226

12.2.1 修改luaTable结构体 227

12.2.2 扩展Lua API 228

12.2.3 实现next()函数 229

12.3 通用for循环指令 229

12.4 测试本章代码 232

12.5 本章小结 234

第13章 异常和错误处理 235

13.1 异常和错误处理介绍 235

13.2 异常和错误处理API 237

13.2.1 Error() 238

13.2.2 PCall() 239

13.3 error()和pcall()函数 240

13.4 测试本章代码 241

13.5 本章小结 242

第三部分 Lua语法和编译器

第14章 词法分析 245

14.1 编译器介绍 245

14.2 Lua词法介绍 247

14.3 实现词法分析器 251

14.3.1 定义Token类型 252

14.3.2 空白字符 254

14.3.3 注释 256

14.3.4 分隔符和运算符 256

14.3.5 长字符串字面量 258

14.3.6 短字符串字面量 259

14.3.7 数字字面量 262

14.3.8 标识符和关键字 263

14.4 LookAhead()和其他方法 264

14.5 测试本章代码 265

14.6 本章小结 267

第15章 抽象语法树 269

15.1 抽象语法树介绍 269

15.2 Chunk和块 270

15.3 语句 272

15.3.1 简单语句 273

15.3.2 while和repeat语句 273

15.3.3 if语句 274

15.3.4 数值for循环语句 275

15.3.5 通用for循环语句 275

15.3.6 局部变量声明语句 276

15.3.7 赋值语句 277

15.3.8 非局部函数定义语句 278

15.3.9 局部函数定义语句 279

15.4 表达式 280

15.4.1 简单表达式 280

15.4.2 运算符表达式 281

15.4.3 表构造表达式 281

15.4.4 函数定义表达式 282

15.4.5 前缀表达式 283

15.4.6 圆括号表达式 284

15.4.7 表访问表达式 284

15.4.8 函数调用表达式 285

15.5 本章小结 286

第16章 语法分析 287

16.1 语法分析介绍 287

16.1.1 歧义 288

16.1.2 前瞻和回溯 289

16.1.3 解析方式 290

16.2 解析块 290

16.3 解析语句 293

16.3.1 简单语句 294

16.3.2 if语句 296

16.3.3 for循环语句 297

16.3.4 局部变量声明和函数定义语句 299

16.3.5 赋值和函数调用语句 300

16.3.6 非局部函数定义语句 302

16.4 解析表达式 303

16.4.1 运算符表达式 304

16.4.2 非运算符表达式 306

16.4.3 函数定义表达式 307

16.4.4 表构造表达式 308

16.4.5 前缀表达式 310

16.4.6 圆括号表达式 311

16.4.7 函数调用表达式 312

16.4.8 表达式优化 313

16.5 测试本章代码 315

16.6 本章小结 316

第17章 代码生成 317

17.1 定义funcInfo结构体 317

17.1.1 常量表 318

17.1.2 寄存器分配 319

17.1.3 局部变量表 320

17.1.4 Break表 323

17.1.5 Upvalue表 324

17.1.6 字节码 325

17.1.7 其他信息 327

17.2 编译块 327

17.3 编译语句 329

17.3.1 简单语句 330

17.3.2 while和repeat语句 331

17.3.3 if语句 333

17.3.4 for循环语句 334

17.3.5 局部变量声明语句 335

17.3.6 赋值语句 337

17.4 编译表达式 339

17.4.1 函数定义表达式 340

17.4.2 表构造表达式 341

17.4.3 运算符表达式 343

17.4.4 名字和表访问表达式 345

17.4.5 函数调用表达式 346

17.5 生成函数原型 347

17.6 使用编译器 349

17.7 测试本章代码 350

17.8 本章小结 350

第四部分 Lua标准库

第18章 辅助API和基础库 353

18.1 Lua标准库介绍 353

18.2 辅助API 355

18.2.1 增强版方法 357

18.2.2 加载方法 358

18.2.3 参数检查方法 359

18.2.4 标准库开启方法 360

18.3 基础库 361

18.3.1 基础库介绍 362

18.3.2 基础库实现 362

18.4 测试本章代码 365

18.5 本章小结 366

第19章 工具库 367

19.1 数学库 367

19.2 表库 369

19.3 字符串库 372

19.4 UTF-8库 374

19.5 OS库 376

19.6 本章小结 379

第20章 包和模块 381

20.1 包和模块介绍 381

20.2 实现包库 386

20.3 测试本章代码 391

20.4 本章小结 392

第21章 协程 393

21.1 协程介绍 393

21.2 协程API 396

21.2.1 支持线程类型 396

21.2.2 支持协程操作 398

21.3 实现协程库 400

21.4 测试本章代码 403

21.5 本章小结 404

附录A Lua虚拟机指令集 405

附录B Lua语法EBNF描述 407

后记 409

图书网:自己动手实现Lua 虚拟机 编译器和标准库pdf

继续阅读

→→→→→→→→→→→→→→→→→→→→查找获取

心理健康

欲望的博弈:如何用正念摆脱上瘾pdf

欲望的博弈 作者:贾德森·布鲁尔(Judson Brewer) 美国 欲望的博弈 出版社:机械工业出版社 欲望的博弈 内容简介: 让你上瘾的不止有香烟和手机,还有思考和爱情。自我控制领域的思想领袖、马...
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: