Lua源码阅读:目录及模块结构
Lua源码阅读的第一期,主要内容:系列内容计划以及目录。
Lua源码阅读:
本篇转载于LuaSource
目录
lua.c
1 | int main (int argc, char **argv) { |
模块结构
Lua代码的模块概要介绍如下:
以下模块实现了一些实用函数:
- ldebug.c - 调试接口,包含功能有:访问调试钩子(lua_sethook、lua_gethook、lua_gethookcount);访问运行时栈(lua_getstack、lua_getlocal、lua_setlocal);检测字节码(luaG_checkopenop、luaG_checkcode);抛出错误(luaG_typeerror、luaG_concaterror、luaG_aritherror、luaG_ordererror、luaG_errormsg、luaG_runerror)
- lzio.c - 通用的输入流接口
- lmem.c - 内存管理接口。实现了luaM_realloc / luaM_growaux_ 两个函数,其中封装了内存分配函数
- lgc.c - 增量的垃圾回收器
以下模块实现了基本的数据类型:
- lstate.c - 全局状态。包括打开、关闭Lua状态机(lua_newstate / lua_close)和线程(luaE_newthread / luaE_freethread)。
- lobject.c - 一些操作Lua Object的通用函数。包括一些数据类型到字符串的互转函数,原生类型的相等性测试(luaO_rawequalObj),和以2为底的对数函数(luaO_log2)
- lstring.c - 字符串哈希表(管理了所有被Lua用到的字符串)
- lfunc.c - 一些用于操作函数原型(Proto)和闭包(Closure)的辅助函数
- ltable.c - Lua的table实现
以下模块做语法解析和代码生成:
- lcode.c - 代码生成器,被lparser.c用到
- llex.c - 词法分析器,被lparser.c用到
- lparser.c - Lua语法解析器
- lundump.c - 加载预编译的Lua代码块。实现了luaU_undump函数,此函数加载预编译的代码块。还提供了另外一个函数lua_header(被luaU_undump内部使用),用于加载代码块中的函数头信息。
- ldump.c - 保存预编译的Lua代码块。实现了luaU_dump函数,些函数导出Lua函数为二进制形式的字符串
以下模块处理Lua字节码的执行:
- lopcodes.c - 定义Lua虚拟机的操作码。定义了所有操作码的名字和操作模式等信息(通过列表luaP_opnames、luaP_opmodes定义的)
- lvm.c - Lua虚拟机(luaV_execute),可执行Lua字节码。另外还暴露了一些被lapi.c用到的函数,比如:luaV_concat
- ldo.c - 函数调用栈。处理函数调用(luaD_call、luaD_pcall),栈空间增长,协程等
- ltm.c - 元方法。实现从对象访问元方法的一些函数
以下模块实现标准库:
- lbaselib.c - 基础函数
- lstrlib.c - 字符串函数
- ltablib.c - 表函数
- lmathlib.c - 数学函数
- loslib.c - 系统函数
- liolib.c - 输入输出、文件读写
- loadlib.c - 包、模块
- ldblib.c - 调试函数
以下模块定义了C API:
- lapi.c - Lua API。实现了大部分Lua C API(lua_* 系列函数)
- lauxlib.c - 定义了luaL_*系列函数
- linit.c - 实现luaL_openlibs,这个函数中加载了所有的标准库函数
以下模块实现Lua和Luac两个程序:
- lua.c - Lua的独立解释器
- print.c - 定义了“PrintFunction”函数,它可以打印出一个函数的字节码(可在Luac中使用 -l 选项)
- luac.c - Lua编译器(可保存字节码到文件中,也可在控制台列出字节码)
命名约定
一个函数的前缀表明了它来自哪个模块
luaA_ - lapi.c
luaB_ - lbaselib.c
luaC_ - lgc.c
luaD_ - ldo.c
luaE_ - lstate.c
luaF_ - lfunc.c
luaG_ - ldebug.c
luaH_ - ltable.c
luaI_ - lauxlib.c
luaK_ - lcode.c
luaL_ - llauxlib.c/h linit.c
luaM_ - lmem.c
luaO_ - lobject.c
luaP_ - lopcodes.c
luaS_ - lstring.c
luaT_ - ltm.c
luaU_ - lundump.c
luaV_ - lvm.c
luaX_ - llex.c
luaY_ - lparser.c
luaZ_ - lzio.c
lua_ - lapi.c/h + luaconfig.h, ldebug.c
luai_ - luaconf.h
luaopen_ - luaconf.h + libraries (lbaselib.c, ldblib.c, liolib.c, lmathlib.c, loadlib.c, loslib.c, lstrlib.c, ltablib.c)
参考:
- Lua源码阅读笔记
- Lua有关的论文和The Lua Architecture从各个方面论述了Lua的实现
- Lua VM指令在文档A No-Frills Introduction to Lua 5.1 VM Instructions中
- Yueliang项目(用Lua实现Lua VM),其中的大量的源码注释,可以帮助理解相关的C代码
- LuaAnnotate - C代码注释,注释单独存放在外部文件中,用某些文本工具可以将注释嵌入显示在代码中
- stevedonovan.github.com/lua-5.1.4 包含LuaAnnotate注释的源码
- 可在http://www.lua.org/source/网站上浏览Lua源码