Wiki 的这一部分允许任何人记录、解释、发布问题或对 Lua 源码进行评论。您可以链接到 [1] 或粘贴相关的代码。注意:请说明您正在讨论的源码版本(例如 5.1.1),以便在 Lua 的未来版本发布时不会产生混淆。最好是讨论的内容基于或更新到 Lua 的最新版本。
源码评论
概述
模块结构
下面概述了 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)的函数
- lmem.c - 内存管理器接口。它实现了 luaM_realloc / luaM_growaux_,它们包装了内存分配函数。
这些模块实现了基本数据类型
- lstate.c - 全局状态。包括用于打开和关闭 Lua 状态(lua_newstate/lua_close)和线程(luaE_newthread / luaE_freethread)的函数。
- lobject.c - 一些关于 Lua 对象的通用函数。包括数据类型 <-> 字符串转换、原始相等性测试(luaO_rawequalObj)和以 2 为底的对数(luaO_log2)
- lstring.c - 字符串表(保存 Lua 处理的所有字符串)
这些模块处理解析和代码生成
- lcode.c - Lua 代码生成器。由 lparser.c 使用
- llex.c - 词法分析器。由 lparser.c 使用。
- lundump.c - 加载预编译的 Lua 代码块。实现 luaU_undump,用于加载预编译的代码块。还提供 luaU_header(由 luaU_undump 内部使用)用于解析函数头。
- ldump.c - 保存预编译的 Lua 代码块。实现 luaU_dump,用于将函数对象转储为预编译的代码块字符串。
这些模块处理 Lua 字节码的执行
- lopcodes.c - Lua 虚拟机的操作码。定义所有操作码的名称和信息(通过表 luaP_opnames 和 luaP_opmodes)。
- lvm.c - Lua 虚拟机。执行字节码(luaV_execute)。还公开了一些由 lapi.c 使用的函数(例如 luaV_concat)。
- ldo.c - Lua 的堆栈和调用结构。处理函数调用(luaD_call / luaD_pcall)、扩展堆栈、协程处理等。
这些模块实现标准库
这些模块定义 C API
- lapi.c - Lua API。实现大部分 Lua C API(lua_* 函数)。
- linit.c - 实现 luaL_openlibs 用于从 C 加载上述模块
这些模块实现 lua 和 luac 程序
- print.c - 定义 "PrintFunction?" 函数,用于打印函数中的字节码(由 luac.c "-l" 选项使用)
- luac.c - Lua 编译器(将字节码保存到文件;还可以列出字节码)
(5.1.3)
代码约定
外部符号的前缀表示它来自的模块
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_ - lauxlib.c/h, linit.c (public functions)
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 + luaconf.h, debug.c
luai_ - luaconf.h
luaopen_ - luaconf.h + libraries (lbaselib.c, ldblib.c, liolib.c, lmathlib.c,
loadlib.c, loslib.c, lstrlib.c, ltablib.c)
(5.1.3)
src/Makefile
在 src/Makefile (5.1.1) 中,mingw 目标比较特殊,因为它只构建 lua(而不是 luac)。也可以添加一个 mingw-cygwin 目标。有关解决方案,请参阅 BuildingLua 中的 mingw 说明。
在 src/luaconf.h (5.1.1) 中,LUA_PATH_DEFAULT
同时引用 LUA_LDIR
和 LUA_CDIR
,但 LUA_CPATH_DEFAULT
只引用这两个中的 LUA_CDIR
。 RiciLake 建议这可能是出于安全考虑,因为 C 模块比 Lua 模块需要更高的信任度。
src/luaconf.h
在 src/luaconf.h (5.1.1) 中,有一个 LUA_CDIR"loadall.dll"
,这在 [3] [4] 中有讨论。
src/lgc.h 和 lgc.c(垃圾收集器)
请参阅 GarbageCollection 和 EmergencyGarbageCollector 中的描述。
sec/ltable.h 和 ltable.c(表格)
请参阅 LuaSourceTable
src/lmathlib.c
这在 BindingCodeToLua 中有所描述。
注意:行“#define lmathlib_c”(以及其他库中的类似行)仅用于 luaconf.h 中的条件语句(由 lhf 指出)。
此页面的评论
关于此页面目的的说明:一些用户表示 Lua 源代码应该有更好的文档,特别是像这里所做的那样,允许任何人参与其中。这也与一个建议有关,即对 Lua API 中的每个函数进行更像维基的注释,就像下面网站所做的那样。这可能需要一个新的维基部分,可能命名为 LuaDoc?、DocLua?,或者像 DocLuaTostring? 这样的单个页面,如果内容足够多的话。
我强烈反对使用维基作为这种方式的媒介,原因有很多,主要原因是它无法很好地扩展。我建议将 Lua 上游源代码的原始副本检入源代码控制存储库,并允许人们直接在源代码上检入注释(例如,您可以在特定函数、结构成员等上添加注释)。这样,就有可能将注释(通过合并)移植到未来的 Lua 版本中。--JohnBelmonte
- -- 这是在与 Rici、Lhf 和 Steinwookie 讨论后得出的结论。我认为大家理解的是,这份文档不一定需要像通常的“doxygen”那样,在函数/参数/行级别上进行文档化,并对每个函数进行详细说明。相反,Lhf 建议这份文档可以采用更像“文学编程”的格式。这并不完全是罕见的。例如,有一些书籍解释了 Linux 内核源代码,在 Lua 中也有像“No-frills Intro to Lua 5.1 VM”这样的东西。大家也认为这份文档或任何内容进入核心代码的可能性很低,或者至少目前还没有承诺这样做。--DavidManura
- 这些论点似乎与 wiki 不适合作为这种文档的媒介无关。当 Lua 6、7、8 等版本发布时,文件集及其内容会发生变化,那么会发生什么?--John
- -- LuaPowerPatches 也存在着许多类似的担忧。wiki 可以更方便/开放。Lua 源代码受到严格控制,是一个缓慢移动的目标(例如,针对小型 Lua 核心的补丁很少)。关于源代码的问题也可以在这里发布。保持 wiki 内容与不同 Lua 版本同步会影响 wiki 上的大多数页面,这一直是一个问题,但解决方案是简单地在 wiki 内容中注明它适用于哪个版本的 Lua。--DavidManura
另请参阅
RecentChanges · preferences
edit · history
最后编辑于 2023 年 8 月 14 日下午 11:15 GMT (diff)