规划已建立,参考源码已落地。
官方 Lua 5.5.0 源码已经拉到本仓库:
references/lua-5.5.0/
本地副本来自官方发布包:
该正式版的发布日期是:
- 2025-12-15
这个项目的目标不是“做一个像 Lua 的解释器”,而是“用 C# 重新实现 Lua 5.5,并把它当作学习材料”。
既然目标是重新实现,而且最终希望尽量兼容官方 Lua 5.5 能接受的源码,那只看手册是不够的。
本地保留官方源码的意义主要有这些:
- 补齐手册里没有完全展开的解析细节
- 理清编译阶段的降级规则
- 对照字节码编码方式
- 查运行时边角行为
- 对照标准库的细节
- 在语义有歧义时提供可核对的依据
官方 C 源码是参考实现,不是逐行翻译模板。
建议工作方式如下:
- 先看手册,确认用户可见语义
- 再看对应的 C 源码,确认具体行为和边界条件
- 在 C# 里设计更清楚、更适合维护的抽象
- 用测试把行为钉住
下面这些文件是后续实现时最常会对照的部分:
references/lua-5.5.0/src/llex.c词法分析行为references/lua-5.5.0/src/lparser.c语法分析和作用域处理references/lua-5.5.0/src/lcode.c代码生成references/lua-5.5.0/src/lopcodes.h指令布局和字段定义references/lua-5.5.0/src/lopcodes.c指令元数据references/lua-5.5.0/src/lundump.c二进制块加载references/lua-5.5.0/src/ldump.c二进制块写出references/lua-5.5.0/src/lvm.c虚拟机执行行为references/lua-5.5.0/src/ltable.c表结构和访问行为references/lua-5.5.0/src/lstring.c字符串处理references/lua-5.5.0/src/ltm.c元方法行为references/lua-5.5.0/src/lbaselib.c基础库references/lua-5.5.0/src/lstrlib.c字符串库references/lua-5.5.0/src/ltablib.c表库references/lua-5.5.0/src/lmathlib.c数学库references/lua-5.5.0/src/lutf8lib.cutf8库
即使已经把官方源码放到本地,实现时仍然坚持下面这些原则:
- 以语义对齐为目标,而不是逐行照搬 C 文件
- 结合 C# 的表达能力设计更清楚的抽象
- 优先沉淀测试,再固化边界行为
- 让结构可读、可学、可维护
兼容性目标是:
- 官方 Lua 5.5 能接受的 Lua 源码,我们的编译器和运行时也应该尽量接受并正确执行
这里说的是 Lua 语言和标准行为层面的兼容。
如果手册写得比较抽象,但官方 C 源码体现了更具体的行为,那么在实现之前或实现过程中,应该先把这个行为落成测试。
测试才是我们后续维护时真正可执行的契约。
既然官方源码已经在本地,下一步就应该进入运行时模型设计,先把这些核心概念定义清楚:
LuaValueLuaStateLuaStackCallFrame- 闭包与函数抽象