什么是 Lua
Lua 是一种简单而强大的脚本语言,适用于游戏开发、嵌入式系统和脚本编写等领域。它以其灵活性和可扩展性而闻名。
Lua 语言具有清晰的语法和直观的语义,易于学习和使用。
它支持面向过程和函数式编程范式,并具备动态类型和自动内存管理的特性。
Lua 还提供了强大的协程支持,使并发编程变得简单。
Lua 的轻量级设计使其在资源受限的环境中表现出色。
此外,Lua 还具备与其他语言(如C/C++)的良好互操作性,可以轻松嵌入到不同的应用中。
获取 Lua
Lua 的源代码可以在 官方网站 下载,目前的最新版本是 Lua 5.4.6。
如果你不想自己编译 Lua,那么可以去官方维护的 Source Forge 下载二进制分发。
当然,因为 Lua 是纯 ANSI C 编写的,所以你可以很轻易地使用任何一种 C 语言编译器与 Makefile 一起编译一份 Lua 二进制。
Lua 系统概览
Lua 源代码文件下每个 .c
文件都是一个 Lua 编译单元,每个单元各自实现一部分 Lua 的功能,整个 Lua 一共有 33 个编译单元,主要功能分别如图:
(长图注意,点 这里 跳转到图片底部)
看起来非常复杂对吧(
所以我们需要先按照 Lua 的实现系统先将这些单元进行划分,得到如下一张新的图:
(长图注意,点 这里 跳转到图片底部)
至此,我们可以将 Lua 系统大致拆分为 5 个模块。
除了这 5 大模块,我们还可以进一步细分模块以更好地进行代码阅读:
(长图注意,点 这里 跳转到图片底部)
那么一个基础的大纲基本上也就形成了,当然这还不够,因为编译单元之间仍会出现互相引用的情况,从一个只有 C 标准头文件引用的系统开始阅读往往是最好的,因为不需要其他 Lua 相关的前置知识,所以我们还需要一张依赖图:
(长图注意,点 这里 跳转到图片底部)
虽然这张依赖图也是又臭又长,且看起来似乎还有循环依赖的关系,但是它为我们揭示了真正的阅读顺序,即从左到右的 拓扑排序。
由于 C 源文件对于头文件之间是单向依赖,因此 C 源文件之间不会产生循环依赖,而头文件之间则可能产生循环依赖,因此我们应该先阅读头文件,然后再阅读源文件。
根据拓扑序,我们可以得到如下的头文件阅读顺序:
- ljumptab.h
- lopnames.h
- lprefix.h
- luaconf.h
- lua.h
- lualib.h
- llimits.h
- lctype.h
- lauxlib.h
- lopcodes.h
- lobject.h
- lmem.h
- lua.hpp
- ltable.h
- lfunc.h
- lzio.h
- lundump.h
- lparser.h
- llex.h
- lcode.h
同时,由于循环依赖的存在,部分头文件是不能纳入拓扑排序的,因此,根据依赖数量,对循环依赖项进行排序,得到如下补充顺序:
- lapi.h
- ldebug.h
- ldo.h
- lgc.h
- lstate.h
- ltm.h
- lstring.h
- lvm.h
在阅读完头文件之后,再阅读源文件就可以事半功倍了,源文件阅读顺序就作为下一阶段进行展示。