目录
点击这里查看所有博文
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 |
打印字节码 |
|
请发表评论