elua解析器开源文档第二章:2.2、lua解析器代码
目录
2.2、lua解析器代码
在上一节我们讲到了C标准库的重新实现。只要讲到了为什么要重新实现C标准库,既然csdk开发包中既然已经存在了newlib为什么还要在elua软件包中还要重新再写一遍这两个问题。
那么费这么大劲搞着玩意,那么这个C标准库到底是给谁用的呢?
它的使用对象,那自然是elua解析器了,那么本小节我们就一起来捋一遍lua解析器的代码。
lua解析器位于elua/lua
文件夹下,其代码结构如下图所示。
lua解析器代码我这里将其分为三个大块,它们分别是虚拟机核心功能部分、源代码解析和预编译部分以及内嵌库部分。
注意:这是我个人对它源码的结构进行的划分,目的是方便理解,不是官方的定义,官方有没有这个结构的划分我也不清楚。
2.2.1、Lua内核
lua内核顾名思义那就是lua的核心代码,负责的是lua虚拟机的运行、调度、内存管理、输入输出设备监视以及全局状态机的管理等功能。这些都是最基本的功能,虚拟机能够运行起来靠的就是内核在后面起作用。没有内核你搞那些乱七八招的东西没有意义。
lua内核中的各个文件具体是干什么的,在下表也有说明。
源文件 | 功能 |
---|---|
lvm.c | Lua虚拟机 |
ltm.c | 元方法 |
ldebug.c | 调试接口 |
lzio.c | 通用输入流接口 |
lstate.c | 全局状态机 管理全局信息 |
ldo.c | Lua的堆栈和调用结构 |
lfunc.c | 函数原型及闭包管理 |
lobject.c | 对象操作函数 |
lgc.c | 垃圾回收机制 |
lapi.c | Lua API |
lmem.c | 内存管理接口 |
lopcodes.c | 虚拟机字节码定义 |
lua.c | lua的可执行入口 main函数 |
lstring.c | 字符串表(保留Lua处理的所有字符串) |
ltable.c | Lua表(哈希) |
2.2.2、Lua解析和预编译
Lua语言是一个解释性语言,它不是直接就能运行的。运行时需要将文件系统中的lua文件读取出来,然后需要将lua语句翻译成对应的c指令才能运行。那么这个解析功能就需要一个单独的模块来负责,它由内核控制主要负责lua脚本的词法分析、解析、编译等这些功能。
源文件 | 功能 |
---|---|
lparser.c | Lua的解析器 |
luac.c | Lua编译器(将字节码保存到文件;也列出字节码) |
ldump.c | 保存预编译的Lua块 |
lundump.c | 加载预编译的Lua块 |
llex.c | Lua的词法分析器 |
lcode.c | Lua的代码生成器 |
2.2.3、一些库函数
除了让lua虚拟机能够运行起来,还要给它内置一写操作库函数。让它用起来更方便、更简单。要有化繁为简的本领,让用户使用起来更不易出错,这也是脚本语言的特色。
下表中列出了lua解析器内部一些内置库的实现文件,主要是基础库、数学运算库、操作系统库、table库以及调试库。
源文件 | 功能 |
---|---|
loadlib.c | Lua的动态库加载器 |
liolib.c | 标准I /O(和系统)库 |
loslib.c | 标准操作系统库(这应该是协程) |
lauxlib.c | 用于构建Lua库的辅助功能 |
linit.c | 初始化lua.c的库 |
ltablib.c | 用于表操作的库 |
ldblib.c | 从Lua到其调试API的接口 |
lmathlib.c | 标准数学运算库 |
lbaselib.c | 基础库 |
lstrlib.c | 用于字符串操作和模式匹配的标准库 |
print.c | 打印字节码 |