- 浏览: 235061 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
saiyaren:
你对hiphop的深入程度到了什么程度了?想和你进行探讨一下
facebook hiphop php vm 实现概述 -
eric_weitm:
lj3362569 写道可以再讲具体点么?还有现有的hipho ...
facebook hiphop php vm 实现概述 -
lj3362569:
可以再讲具体点么?还有现有的hiphop不支持哪些功能?
facebook hiphop php vm 实现概述
lua 源代码解析
源代码版本:lua-5.2.0
一、概览
1、lua脚本中暴露的库相关
lbaselib.c - 基础函数库(方便使用lua内部的功能)
lbitlib.c - 位运算库
lcorolib.c - 协程库
lstrlib.c - 字符串库,提供通用字符串处理功能
lstring.c - 字符串表(保存所有由Lua操作的字符串集合)
lmathlib.c - 数学库
loslib.c - 操作系统相关库,时间、环境、语言、执行程序等
liolib.c - 输入输出库
loadlib.c - 模块库(实现require函数,package函数)
ldblib.c - 调试库
ldebug.c - 调试接口:包含访问调试钩子的函数(lua_sethook/lua_gethook/lua_gethookcount),访问运行时堆栈信息的函数(lua_getstatck/lua_getlocal/lua_setlocal),检查字节码函数(luaG_checkopenop/luaG_checkcode),和抛出错误的函数(luaG_typeerror/luaG_concaterror/luaG_aritherror/luaG_ordererror/luaG_errormsg/luaG_runerror)
lapi.c - Lua的API.实现Lua C API(lua_*函数)集合
lauxlib.c - 定义所有的luaL_*函数集
2、lua runtime的数据结构相关
lfunc.c - 包装原型和闭包的辅助函数
ltable.c - Lua表实现(哈希)
lobject.c - 一些针对Lua对象的通用函数。包括数据类型到字符串转换函数,纯数据相等测试函数(luaO_rawequalObj),和日志基础2(luaO_log2)
ltm.c - 标记原语方法。实现对象访问原语方法(metathods)
3、编译前端
llex.c - 词法分析器,被lparser.c使用,接口LUAI_FUNC void luaX_next (LexState *ls);
lparser.c - Lua语法检查器,接口 Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, Dyndata *dyd, const char *name, int firstchar);
lundump.c - 加载预编译后的Lua代码块,函数luaU_undump,加载一个预编译后的代码块;luaU_header(被luaU_undump使用的内部函数),用来检查函数头部。
ldump.c - 保存预编译后的Lua代码块。函数luaU_dump,使用预编译后的代码字符串展示一个函数;
lcode.c - Lua的代码生成器。被lparser.c使用,static int luaK_code (FuncState *fs, Instruction i) 用于写入一条指令
顺序:lex--parse--code--dump
4、虚拟机、运行时相关
lopcodes.c - Lua虚拟机的操作码。定义所有操作符的名称和信息(使用luaP_opnames和luaP_opmodes两个表保存)
lvm.c - Lua虚拟机。执行字节码(luaV_execute)。也暴漏一些lapi.c可能用到的函数(例如:luaV_concat)
ldo.c - Lua的栈和调用结构。控制函数调用(luaD_call/luaD_pcall),栈增长,协同代码的同步
lstate.c - 全局上下文信息即 符号表(函数表、变量表、线程等). 包括打开和关闭LUA上线文的函数(lua_newstate/lua_close)和lua线程函数(luaE_newthread/luaE_freethread)
lmem.c - 内存管理的接口.通过封装内存分配函数,实现了luaM_realloc / luaM_growaux_两个函数.
lgc.c - 垃圾回收器(内存管理)
5、外部封装
lua.c - Lua独立解释器
luac.c - Lua编译器(保存字节码到一个文件,也可以列出字节码)
6、其他
lzio.c - 一个通用的带缓冲区的输入流接口
linit.c - 实现luaL_openlibs方法,便于在C语言中加载上述模块
lctype.c 判断类型
二、主流程
第一阶段:main---load----词法、语法解析、parser内会生成需要的指令集
第二阶段:docall----虚拟机内的luaV_execute
三、runtime的实现
1、vc中的一个典型调用栈信息如下:
> lua1.exe!luaV_execute(lua_State * L=0x00035c28) Line 521 C
lua1.exe!luaD_call(lua_State * L=0x00035c28, lua_TValue * func=0x00035e00, int nResults=-1, int allowyield=0) Line 393 + 0x9 bytes C
lua1.exe!f_call(lua_State * L=0x00035c28, void * ud=0x0013f4a0) Line 920 + 0x18 bytes C
lua1.exe!luaD_rawrunprotected(lua_State * L=0x00035c28, void (lua_State *, void *)* f=0x00424a60, void * ud=0x0013f4a0) Line 133 + 0x1f bytes C
lua1.exe!luaD_pcall(lua_State * L=0x00035c28, void (lua_State *, void *)* func=0x00424a60, void * u=0x0013f4a0, int old_top=40, int ef=32) Line 591 + 0x11 bytes C
lua1.exe!lua_pcallk(lua_State * L=0x00035c28, int nargs=0, int nresults=-1, int errfunc=3, int ctx=0, int (lua_State *)* k=0x00000000) Line 946 + 0x20 bytes C
lua1.exe!docall(lua_State * L=0x00035c28, int narg=0, int nres=-1) Line 179 + 0x19 bytes C
lua1.exe!handle_script(lua_State * L=0x00035c28, char * * argv=0x00035ba0, int n=1) Line 341 + 0xf bytes C
lua1.exe!pmain(lua_State * L=0x00035c28) Line 469 + 0x17 bytes C
lua1.exe!luaD_precall(lua_State * L=0x00035c28, lua_TValue * func=0x00035de0, int nresults=1) Line 317 + 0x9 bytes C
lua1.exe!luaD_call(lua_State * L=0x00035c28, lua_TValue * func=0x00035de0, int nResults=1, int allowyield=0) Line 392 + 0x11 bytes C
lua1.exe!f_call(lua_State * L=0x00035c28, void * ud=0x0013fe48) Line 920 + 0x18 bytes C
lua1.exe!luaD_rawrunprotected(lua_State * L=0x00035c28, void (lua_State *, void *)* f=0x00424a60, void * ud=0x0013fe48) Line 133 + 0x1f bytes C
lua1.exe!luaD_pcall(lua_State * L=0x00035c28, void (lua_State *, void *)* func=0x00424a60, void * u=0x0013fe48, int old_top=8, int ef=0) Line 591 + 0x11 bytes C
lua1.exe!lua_pcallk(lua_State * L=0x00035c28, int nargs=2, int nresults=1, int errfunc=0, int ctx=0, int (lua_State *)* k=0x00000000) Line 946 + 0x20 bytes C
lua1.exe!main(int argc=2, char * * argv=0x00035ba0) Line 495 + 0x13 bytes C
2、基本交互逻辑
vm循环取出一个一个的Instruction,之后一个巨大的switch来解释这个Instruction(lua 5.2是基于寄存器的指令集),即经典的fetch---execute循环。
特殊的指令:
1》函数调用指令:遇到函数调用时(lua中调用),要用c代码模拟出硬件执行代码时的栈结构。
基本上每次增加一个活动记录时要设置好相应的闭包信息和执行环境,设置好相应的符号表,做好参数的检查,必要时GC一下
2》协程指令 :每次有create调用时就新建一个lua_state,全局栈维护这些stack信息
resume时 luaB_coresume---auxresume---lua_resume---luaB_yield
lua1.exe!lua_yieldk(lua_State * L=0x0003e698, int nresults=1, int ctx=0, int (lua_State *)* k=0x00000000) Line 556 C
lua1.exe!luaB_yield(lua_State * L=0x0003e698) Line 99 + 0x1a bytes C
lua1.exe!luaD_precall(lua_State * L=0x0003e698, lua_TValue * func=0x0003f3f8, int nresults=-1) Line 317 + 0x9 bytes C
lua1.exe!luaV_execute(lua_State * L=0x0003e698) Line 744 + 0x34 bytes C
lua1.exe!resume(lua_State * L=0x0003e698, void * ud=0x0003f3d8) Line 496 + 0x9 bytes C
lua1.exe!luaD_rawrunprotected(lua_State * L=0x0003e698, void (lua_State *, void *)* f=0x004348d0, void * ud=0x0003f3d8) Line 133 + 0x1f bytes C
lua1.exe!lua_resume(lua_State * L=0x0003e698, lua_State * from=0x00035c28, int nargs=2) Line 531 + 0x1d bytes C
> lua1.exe!auxresume(lua_State * L=0x00035c28, lua_State * co=0x0003e698, int narg=2) Line 31 + 0x11 bytes C
lua1.exe!luaB_coresume(lua_State * L=0x00035c28) Line 53 + 0x1d bytes C
四、解释器
1、main函数
line484: lua.c
lua_newstate:全局和线程栈状态的初始化
lua_State *L = luaL_newstate(); // 创建全局的运行时信息
lua_pushcfunction(L, &pmain); // 创建当前栈顶的函数闭包
lua_pushinteger(L, argc); // 参数入栈
lua_pushlightuserdata(L, argv); /* 2nd argument */
status = lua_pcall(L, 2, 1, 0); // 运行时执行一个lua函数
result = lua_toboolean(L, -1); /* get result */
finalreport(L, status);
lua_close(L); // 释放内存等扫尾工作
2、lua_pcall详情
1》参数检查
2》luaD_pcall --------luaD_rawrunprotected---f_call----luaD_call---luaD_precall---pmain
luaL_checkversion(L); // 验证虚拟机
lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */
luaL_openlibs(L); // 初始化内置库 loadedlibs是默认打开的功能表
lua_gc(L, LUA_GCRESTART, 0);
handle_script -------执行主脚本
luaL_loadfile------docall(一堆的栈操作)----luaV_execute:lvm.c // 虚拟机的执行引擎
源代码版本:lua-5.2.0
一、概览
1、lua脚本中暴露的库相关
lbaselib.c - 基础函数库(方便使用lua内部的功能)
lbitlib.c - 位运算库
lcorolib.c - 协程库
lstrlib.c - 字符串库,提供通用字符串处理功能
lstring.c - 字符串表(保存所有由Lua操作的字符串集合)
lmathlib.c - 数学库
loslib.c - 操作系统相关库,时间、环境、语言、执行程序等
liolib.c - 输入输出库
loadlib.c - 模块库(实现require函数,package函数)
ldblib.c - 调试库
ldebug.c - 调试接口:包含访问调试钩子的函数(lua_sethook/lua_gethook/lua_gethookcount),访问运行时堆栈信息的函数(lua_getstatck/lua_getlocal/lua_setlocal),检查字节码函数(luaG_checkopenop/luaG_checkcode),和抛出错误的函数(luaG_typeerror/luaG_concaterror/luaG_aritherror/luaG_ordererror/luaG_errormsg/luaG_runerror)
lapi.c - Lua的API.实现Lua C API(lua_*函数)集合
lauxlib.c - 定义所有的luaL_*函数集
2、lua runtime的数据结构相关
lfunc.c - 包装原型和闭包的辅助函数
ltable.c - Lua表实现(哈希)
lobject.c - 一些针对Lua对象的通用函数。包括数据类型到字符串转换函数,纯数据相等测试函数(luaO_rawequalObj),和日志基础2(luaO_log2)
ltm.c - 标记原语方法。实现对象访问原语方法(metathods)
3、编译前端
llex.c - 词法分析器,被lparser.c使用,接口LUAI_FUNC void luaX_next (LexState *ls);
lparser.c - Lua语法检查器,接口 Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, Dyndata *dyd, const char *name, int firstchar);
lundump.c - 加载预编译后的Lua代码块,函数luaU_undump,加载一个预编译后的代码块;luaU_header(被luaU_undump使用的内部函数),用来检查函数头部。
ldump.c - 保存预编译后的Lua代码块。函数luaU_dump,使用预编译后的代码字符串展示一个函数;
lcode.c - Lua的代码生成器。被lparser.c使用,static int luaK_code (FuncState *fs, Instruction i) 用于写入一条指令
顺序:lex--parse--code--dump
4、虚拟机、运行时相关
lopcodes.c - Lua虚拟机的操作码。定义所有操作符的名称和信息(使用luaP_opnames和luaP_opmodes两个表保存)
lvm.c - Lua虚拟机。执行字节码(luaV_execute)。也暴漏一些lapi.c可能用到的函数(例如:luaV_concat)
ldo.c - Lua的栈和调用结构。控制函数调用(luaD_call/luaD_pcall),栈增长,协同代码的同步
lstate.c - 全局上下文信息即 符号表(函数表、变量表、线程等). 包括打开和关闭LUA上线文的函数(lua_newstate/lua_close)和lua线程函数(luaE_newthread/luaE_freethread)
lmem.c - 内存管理的接口.通过封装内存分配函数,实现了luaM_realloc / luaM_growaux_两个函数.
lgc.c - 垃圾回收器(内存管理)
5、外部封装
lua.c - Lua独立解释器
luac.c - Lua编译器(保存字节码到一个文件,也可以列出字节码)
6、其他
lzio.c - 一个通用的带缓冲区的输入流接口
linit.c - 实现luaL_openlibs方法,便于在C语言中加载上述模块
lctype.c 判断类型
二、主流程
第一阶段:main---load----词法、语法解析、parser内会生成需要的指令集
第二阶段:docall----虚拟机内的luaV_execute
三、runtime的实现
1、vc中的一个典型调用栈信息如下:
> lua1.exe!luaV_execute(lua_State * L=0x00035c28) Line 521 C
lua1.exe!luaD_call(lua_State * L=0x00035c28, lua_TValue * func=0x00035e00, int nResults=-1, int allowyield=0) Line 393 + 0x9 bytes C
lua1.exe!f_call(lua_State * L=0x00035c28, void * ud=0x0013f4a0) Line 920 + 0x18 bytes C
lua1.exe!luaD_rawrunprotected(lua_State * L=0x00035c28, void (lua_State *, void *)* f=0x00424a60, void * ud=0x0013f4a0) Line 133 + 0x1f bytes C
lua1.exe!luaD_pcall(lua_State * L=0x00035c28, void (lua_State *, void *)* func=0x00424a60, void * u=0x0013f4a0, int old_top=40, int ef=32) Line 591 + 0x11 bytes C
lua1.exe!lua_pcallk(lua_State * L=0x00035c28, int nargs=0, int nresults=-1, int errfunc=3, int ctx=0, int (lua_State *)* k=0x00000000) Line 946 + 0x20 bytes C
lua1.exe!docall(lua_State * L=0x00035c28, int narg=0, int nres=-1) Line 179 + 0x19 bytes C
lua1.exe!handle_script(lua_State * L=0x00035c28, char * * argv=0x00035ba0, int n=1) Line 341 + 0xf bytes C
lua1.exe!pmain(lua_State * L=0x00035c28) Line 469 + 0x17 bytes C
lua1.exe!luaD_precall(lua_State * L=0x00035c28, lua_TValue * func=0x00035de0, int nresults=1) Line 317 + 0x9 bytes C
lua1.exe!luaD_call(lua_State * L=0x00035c28, lua_TValue * func=0x00035de0, int nResults=1, int allowyield=0) Line 392 + 0x11 bytes C
lua1.exe!f_call(lua_State * L=0x00035c28, void * ud=0x0013fe48) Line 920 + 0x18 bytes C
lua1.exe!luaD_rawrunprotected(lua_State * L=0x00035c28, void (lua_State *, void *)* f=0x00424a60, void * ud=0x0013fe48) Line 133 + 0x1f bytes C
lua1.exe!luaD_pcall(lua_State * L=0x00035c28, void (lua_State *, void *)* func=0x00424a60, void * u=0x0013fe48, int old_top=8, int ef=0) Line 591 + 0x11 bytes C
lua1.exe!lua_pcallk(lua_State * L=0x00035c28, int nargs=2, int nresults=1, int errfunc=0, int ctx=0, int (lua_State *)* k=0x00000000) Line 946 + 0x20 bytes C
lua1.exe!main(int argc=2, char * * argv=0x00035ba0) Line 495 + 0x13 bytes C
2、基本交互逻辑
vm循环取出一个一个的Instruction,之后一个巨大的switch来解释这个Instruction(lua 5.2是基于寄存器的指令集),即经典的fetch---execute循环。
特殊的指令:
1》函数调用指令:遇到函数调用时(lua中调用),要用c代码模拟出硬件执行代码时的栈结构。
基本上每次增加一个活动记录时要设置好相应的闭包信息和执行环境,设置好相应的符号表,做好参数的检查,必要时GC一下
2》协程指令 :每次有create调用时就新建一个lua_state,全局栈维护这些stack信息
resume时 luaB_coresume---auxresume---lua_resume---luaB_yield
lua1.exe!lua_yieldk(lua_State * L=0x0003e698, int nresults=1, int ctx=0, int (lua_State *)* k=0x00000000) Line 556 C
lua1.exe!luaB_yield(lua_State * L=0x0003e698) Line 99 + 0x1a bytes C
lua1.exe!luaD_precall(lua_State * L=0x0003e698, lua_TValue * func=0x0003f3f8, int nresults=-1) Line 317 + 0x9 bytes C
lua1.exe!luaV_execute(lua_State * L=0x0003e698) Line 744 + 0x34 bytes C
lua1.exe!resume(lua_State * L=0x0003e698, void * ud=0x0003f3d8) Line 496 + 0x9 bytes C
lua1.exe!luaD_rawrunprotected(lua_State * L=0x0003e698, void (lua_State *, void *)* f=0x004348d0, void * ud=0x0003f3d8) Line 133 + 0x1f bytes C
lua1.exe!lua_resume(lua_State * L=0x0003e698, lua_State * from=0x00035c28, int nargs=2) Line 531 + 0x1d bytes C
> lua1.exe!auxresume(lua_State * L=0x00035c28, lua_State * co=0x0003e698, int narg=2) Line 31 + 0x11 bytes C
lua1.exe!luaB_coresume(lua_State * L=0x00035c28) Line 53 + 0x1d bytes C
四、解释器
1、main函数
line484: lua.c
lua_newstate:全局和线程栈状态的初始化
lua_State *L = luaL_newstate(); // 创建全局的运行时信息
lua_pushcfunction(L, &pmain); // 创建当前栈顶的函数闭包
lua_pushinteger(L, argc); // 参数入栈
lua_pushlightuserdata(L, argv); /* 2nd argument */
status = lua_pcall(L, 2, 1, 0); // 运行时执行一个lua函数
result = lua_toboolean(L, -1); /* get result */
finalreport(L, status);
lua_close(L); // 释放内存等扫尾工作
2、lua_pcall详情
1》参数检查
2》luaD_pcall --------luaD_rawrunprotected---f_call----luaD_call---luaD_precall---pmain
luaL_checkversion(L); // 验证虚拟机
lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */
luaL_openlibs(L); // 初始化内置库 loadedlibs是默认打开的功能表
lua_gc(L, LUA_GCRESTART, 0);
handle_script -------执行主脚本
luaL_loadfile------docall(一堆的栈操作)----luaV_execute:lvm.c // 虚拟机的执行引擎
发表评论
-
camunda 源代码解析(一)
2020-03-06 17:53 2570壹 基本概念 一、任 ... -
spring cloud gateway 分析一 主流程和层次
2020-02-14 19:27 489一、debug的调用栈如下: DispatcherHand ... -
B端产品学习笔记
2018-12-01 22:25 764B端产品学习笔记 一、B端产品分类:协作办公 即时通讯 企 ... -
大数据、数据仓库和ETL
2018-07-27 20:50 4336一、背景 大量原来线下的业务电子化之后,产生了 ... -
单机与分布式的组件差异
2018-07-25 15:51 664一、单机程序 1、用内存进程队列实现解耦合和异步 ... -
大数据数据仓库 《大数据之路:阿里巴巴大数据实践》 读书笔记
2018-07-17 18:11 818一、基本概念 1 ... -
ElasticSearch 三 建立索引快的原因
2018-07-09 18:02 789https://blog.csdn.net/u010994 ... -
ElasticSearch 二 查询快的原因
2018-07-09 17:25 2400https://www.jianshu.com/p/ ... -
ElasticSearch 一 基本概念
2018-07-09 17:22 4651、Indices 索引,类似于mysql的Database ... -
后端技术的演化
2018-01-05 18:04 514一、应用分类: 数据库交易类、数据处理(大数据、机器学习、 ... -
pandas 小技巧
2018-01-05 17:34 5431、筛选数据 complaints[['Complaint ... -
区块链技术概览
2017-12-05 16:47 1345区块链技术概览 一、 ... -
区块链技术概览
2017-12-05 16:44 23写道 区块链技术概览 ... -
c++以太坊编译
2017-12-04 16:22 657c++以太坊编译 https://github.com/ ... -
编译solc
2017-12-01 17:27 3607git clone https://github.com/ ... -
深度学习思考和理解 一 统计学和信息论
2017-09-18 11:00 8331、世界是不确定的,所有的函数表达式y=f(x) 只在理论中 ... -
基于camunda的工作流开发
2017-07-11 09:21 14708一、定义 工作流(Wor ... -
数据挖掘概览
2017-06-30 17:22 522数据、信息、知识、智 ... -
服务端相关技术总结
2017-06-16 10:38 385服务端相关技术总结 在实际产品中,主要涉及到的计算 ... -
django源代码解析
2017-06-08 11:12 860一、wsgi: webserver与app ...
相关推荐
Lua源代码分析顺序
MarpaX-Languages-Lua-Parser:Lua源代码解析器
它分析源代码中的 Lua 文件并输出编码器和解码器。 BS 代表 Bit Stream 或 Bull Shit,取决于你的心情。 用法 $ lua bstree.lua <input.lua>+ 此命令将分析所有给定的 Lua 文件并输出两个文件: bsenc.lua...
主要是Lua源代码压缩程序,但还包括一些静态分析工具以及通用的Lua词法分析器和解析器。 当前,minifier执行: 剥离所有注释和空格 将所有局部变量真正语义重命名为简化形式 将源减少到最小间距,仅在实际需要的...
这是Lua的源代码,在一个文件中。 Lua的作者Roberto Ierusalimschy在2019年3月22日提交了一个名为onelua.c的文件( )。它非常漂亮。 为了方便学习/运输/安装Lua,我对文件进行了预编译,并对其进行了格式化以供...
lua源码欣赏 lua源代码分析,来之云风!
纯lua代码解析html标签,解析代码只有200多行,效率极高,提供lua显示html控件,html目前支持文本多彩文本,图片,输入控件,画板,可自定义布局,所有支持的标签都支持背景色,透明等。 完美支持脚本 但是仅限于...
LUA语言的源代码, 原本是编译成动态库的, 如果需要编程执行程序, 需要将文件 luac.c一起编译, 并且设置编译选项为执行程序.
Lua 5.3.6和Lua 5.4.2的修改后的源代码已针对性能进行了调整。 最佳化 调整的编译器标志(Lua 5.3.6和Lua 5.4.2): 设置优化级别3(-O3) 启用链接时间优化(-flto) 启用本地计算机支持的所有指令子集(-march...
遵循标准Modbus协议的调试工具(含源代码),很方面的一款工具。基础串口的。
1. 反编译:可以将Lua脚本文件(.lua)反编译为可阅读的源代码,帮助开发者理解脚本的逻辑和结构。 2. 编辑:提供了一个简单的代码编辑器,方便开发者对反编译后的源代码进行修改和调试。 3. 重新编译:可以将修改...
Roblox最性感的Lua C分析器源代码; 由Nashii撰写。 学分 奥斯汀-签名扫描器; ElKoax给了我。 手性-Retcheck绕过; ringarang,用于对其进行修改以得到普遍支持。 Nashii-编写其余的源代码。 如何编译此源代码 在...
云风写的Lua源码欣赏,基于lua5.2版本源代码解析,对于初初学习lua语言的有很不错的帮助
Lua源码剖析,Lua虚拟机的机制分析,硕士论文
c++调用lua脚本程序代码,工程为vs2013直接打开直接用。csdn博客上有详细的学习步骤和解析,这里的是开发学习过程的所有源代码和项目文件
学习lua-nginx模块 目录 阶段 init_worker_by_lua access_by_lua content_by_lua filter_by_lua log_by_lua api ngx.ctx ngx.var.VARIABLES ngx.sleep 其他 其他
EmperorC是一个工具包(包括库,GUI前端和命令行工具),用于解析和分析用Lua脚本语言编写的C源代码。 该库的文件位于emperor_c目录中,它依赖于3rd目录中包含的两个Lua库: ,Lua的模式匹配库 ,一个lua json...
lexer将Lua源代码转换为令牌。 parser将这些标记转换为字节码。 exp_desc和token是类型定义。 vm是最大的模块。 它处理实际评估lua代码和Rust API。 vm本身拥有解释器的核心功能。 frame处理评估字节码。 lua...
本PDF是云风大神对Lua的源代码进行了详尽地分析,对想深入学习Lua编程的人来说无疑是一大利器!