- lmathlib.c, lstrlib.c: get familiar with the external C API. Don‘t bother with the pattern matcher though. Just the easy functions.
- lapi.c: Check how the API is implemented internally. Only skim this to get a feeling for the code. Cross-reference to lua.h and luaconf.h as needed.
- lobject.h: tagged values and object representation. skim through this first. you‘ll want to keep a window with this file open all the time.
- lstate.h: state objects. ditto.
- lopcodes.h: bytecode instruction format and opcode definitions. easy.
- lvm.c: scroll down to luaV_execute, the main interpreter loop. see how all of the instructions are implemented. skip the details for now. reread later.
- ldo.c: calls, stacks, exceptions, coroutines. tough read.
- lstring.c: string interning. cute, huh?
- ltable.c: hash tables and arrays. tricky code.
- ltm.c: metamethod handling, reread all of lvm.c now.
- You may want to reread lapi.c now.
- ldebug.c: surprise waiting for you. abstract interpretation is used to find object names for tracebacks. does bytecode verification, too.
- lparser.c, lcode.c: recursive descent parser, targetting a register-based VM. start from chunk() and work your way through. read the expression parser and the code generator parts last.
- lgc.c: incremental garbage collector. take your time.
- Read all the other files as you see references to them. Don‘t let your stack get too deep though.
以上是LuaJIT作者推荐的 Lua源码阅读顺序.
现在写的Leo, 还只是个玩具. 如果想进一步完善他, 自认为目前还没有这种能力. 所以, 还想求助于Lua. 就算是参照Lua的内部设计, 最后做出了一个仿制品, 也未尝不可.
过去, 我一直在网上搜索有关Lua源码分析的博客. 这些博客确实让我学到了很多, 但还不够, 因为对我而言, 这些知识点并没有形成一个完整的系统. 字符串, 闭包, 虚拟机, 内存管理, 协程, ... 对这些东西的内部实现原理, 我只有片面的理解. 所以这次, 我打算把Lua的源码完整的分析一遍, 并做好笔记, 然后再继续玩我的Leo.
时间: 2024-11-18 12:38:36