前言
Lua作为游戏开发的吃饭语言,写了2、3年的lua,一行源码没看过,只能当个工具人,勉强维持生活。机缘巧合听了公司一个lua table源码解析的分享,感觉还蛮有意思,决定开始看一下lua源码,看懂这个我们开发使用的吃饭语言。【主要是闲了】
该专栏其实就是云风 的 Lua源码赏析 读书笔记。
1.1 目录
下载到lua-5.2.1的源代码后,会发现源代码文件。全部放在src子目录下。这些文件根据实现功能的不同,可以分为四部分。
1. 虚拟机运转的核心功能
- lapi.c Lua API。实现大量的Lua C API(lua_ *函数)。
- lctype.c 标准库中ctype相关实现
- ldebug.c 调试接口。
- ldo.c Lua的堆栈和调用结构。处理函数调用(luaD_call / luaD_pcall),扩展堆栈,协程处理,...
- lfunc.c 函数原型及闭包管理
- lgc.c 垃圾回收
- lmem.c 内存管理接口【luaM_realloc / luaM_growaux_】
- lobject.c 对象操作的一些函数。包括数据类型<->字符串转换,原始相等性测试(luaO_rawequalObj)和日志基础2(luaO_log2)
- lopcodes.c 虚拟机的字节码定义
- lstate.c 全局状态机。包括用于打开和关闭Lua状态(lua_newstate / lua_close)和线程(luaE_newthread / luaE_freethread)的函数。
- lstring.c 字符串池
- ltable.c 表类型的相关操作。Lua表(哈希)
- ltm.c 标记方法。实现从对象访问元方法。
- lvm.c 虚拟机。执行字节码(luaV_execute)。还公开了lapi.c使用的一些功能(例如luaV_concat)。
- lzio.c 通用的缓冲输入流接口
2. 源代码解析以及预编译字节码
- lcode.c Lua的代码生成器。由lparser.c使用
- ldump.c 保存预编译的Lua块。实现luaU_dump,将功能对象转储为预编译的块字符串。
- llex.c 词法分析器。由lparser.c使用。
- lparser.c 解析器
- lundump.c 加载预编译的Lua块
3. 内嵌库
- lauxlib.c 库编写用到的辅助函数库
- lbaselib.c 基础库
- lbitlib.c 位操作库
- lcorolib.c 协程库
- ldblib.c Debug库
- linit.c 内嵌库的初始化
- liolib.c IO 库
- lmathlib.c 数学库
- loadlib.c 动态扩展库管理
- loslib.c OS 库
- lstrlib.c 字符串库
- ltablib.c 表处理库
4. 可执行的解析器,字节码编译器
- lua.c Lua独立解释器
- luac.c Lua编译器(将字节码保存到文件中;还列出字节码)
1.3 编码约定
外部符号的前缀指示其来自的模块:
luaA_-lapi.c
luaB_-lbaselib.c
luaC_-lgc.c 垃圾回收部分
luaD_-ldo.c 函数的运行流程:函数调用及返回
luaE_-lstate.c 虚拟机的当前状态
luaF_-lfunc.c function实现
luaG_-ldebug.c
luaH_-ltable.c table实现
luaI_-lauxlib.c
luaK_-lcode.c
luaL_-lauxlib.c / h,linit.c(公共函数)
luaM_-lmem.c 内存管理
luaO_-lobject.c 不同的数据类型
luaP_-lopcodes.c 虚拟机的行为是由一组 opcode 控制的
luaS_-lstring.c string实现
luaT_-ltm.c 元表
luaU_-lundump.c
luaV_-lvm.c 虚拟机对 opcode 的解析和运作
luaX_-llex.c
luaY_-lparser.c
luaZ_-lzio.c 带缓冲的流处理
lua_-lapi.c / h + luaconf.h,debug.c
luai_-luaconf.h
luaopen_-luaconf.h +库(lbaselib.c,ldblib.c,liolib.c,lmathlib.c,
loadlib.c,loslib.c,lstrlib.c,ltablib.c)
1.7 阅读源代码的次序
- 首先、阅读外围的库是如何实现功能扩展的,
- 然后、阅读 Lua 的具体实现。
- 之后、可以开始了解 Lua VM 的实现。
- 接下来就是分别理解函数调用、返回,string,metatable,table实现
- debug模块是一个额外的设施、
- 最后是parse 等等编译相关的部分。
- 垃圾收集将是最难的部分,可能会花掉最多的时间去理解细节。Lua GC 的源码剖析