Lua源码阅读:目录及模块结构

Lua源码阅读的第一期,主要内容:系列内容计划以及目录。

Lua源码阅读:

本篇转载于LuaSource

目录

lua.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main (int argc, char **argv) {
int status, result;
lua_State *L = luaL_newstate(); /* create state */
if (L == NULL) {
l_message(argv[0], "cannot create state: not enough memory");
return EXIT_FAILURE;
}
lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */
lua_pushinteger(L, argc); /* 1st argument */
lua_pushlightuserdata(L, argv); /* 2nd argument */
status = lua_pcall(L, 2, 1, 0); /* do the call */
result = lua_toboolean(L, -1); /* get result */
report(L, status);
lua_close(L);
return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
}

模块结构

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)

参考:

  1. Lua源码阅读笔记
  2. Lua有关的论文The Lua Architecture从各个方面论述了Lua的实现
  3. Lua VM指令在文档A No-Frills Introduction to Lua 5.1 VM Instructions
  4. Yueliang项目(用Lua实现Lua VM),其中的大量的源码注释,可以帮助理解相关的C代码
  5. LuaAnnotate - C代码注释,注释单独存放在外部文件中,用某些文本工具可以将注释嵌入显示在代码中
  6. stevedonovan.github.com/lua-5.1.4 包含LuaAnnotate注释的源码
  7. 可在http://www.lua.org/source/网站上浏览Lua源码