《lua源码赏析》笔记 -1

来源:互联网 发布:金税盘开票软件进不去 编辑:程序博客网 时间:2024/04/29 04:27

LUA源码笔记

这些文件根据实现的功能不同分成了 四大部分。

1>虚拟机运转的核心功能

2>源代码解析以及预编译字节码

3>内嵌库

4>可执行的解析器,字节码编译器

 

(1)LUA核心

LUA虚拟机的行为是由一连串的opcodes控制的,这些opcodes放在了lopcodes.c里面。而对这些opcodes进行编译解析的工作放在了lvm,其中的APIluaV为前缀。

虚拟机在外面的表现形式就是lua_State结构体。State有当前状态的意思,全局的State里面引用了虚拟机所有的数据。全局State使用luaE为前缀代码放在了lstate中。

函数的运行流程:函数的调用和返回放在了ldo.c中,相关的APIluaD开头。

Lua中最重要的三种数据类型function table string被存放在了 lfunc.c

Ltable.c  lstring.c 中。这三组内部API则分别以luaF luaH luaS命名。

不同的数据类型最后被统一定义成了lua Object lobject.c里面用luaO   作为前缀。

元表的处理放在了ltm.c中 用luaT做前缀。

核心系统里面还有两个挤出设施。内存管理lmem.c luaM开头,带缓冲的流处理lzio.cluaZ为前缀。

核心系统里面最复杂的部分垃圾回收部分lgc.c,luaC为前缀

Lua是一门嵌入式语言 需要和宿主系统进行交互。交互式通过C API函数来实现的,被放在了lapi.cAPI直接以lua开头 供C编写的程序库直接调用

(2)代码翻译以及预编译字节码

让代码运行起来要输入lua程序,这些程序我们读起来就是程序文本,需要通过解析得到内部数据结构(常量和opcode的组合)。这个过程是通过parser:lparser.c和词法分析llex.c来完成解析玩文本代码 还要生成虚拟机理解的数据。过程在lcode中实现,用luaK为前缀。

(3)内嵌库

本身可以完全由宿主系统注入到state,不过有很多库基本上很难不用所以可以自由加载。主动加载这些库进入lua_state是由lualib.h中的API来实现。模块化管理,require/module管理在loadlib中实现。内建库的初始化APIlinit.c中可以找到。

(4)独立解析器和字码编译器

原来的源代码一般都被编译成了动态库或者静态库被加载或链接。而现在lua更多的被做成独立开发,所以提供了一个独立的解释器,lua.c实现的这个。Luac.c实现了一个简单的字节码编译器,可以预编译文本的lua程序。

 

 

推荐阅读的顺序

1 阅读外围的库是如何实现功能扩展的,这样可以熟悉lua公开API

2 阅读API的具体实现。Lua对外暴露的API是一个对内部模块的一层封装,并未触及核心,但可以窥探核心。

3 开始了解 lua VM的实现

4 了解函数的调用 返回 string table metatable等如何实现

5 debug可以帮助理解细节

6 parser等和编译相关的部分

7 垃圾回收部分 花掉很多时间去理解细节

 

全局状态机和内存管理

可以很容易的创建出lua虚拟机对象lua_state。不同的虚拟机对象之间是线程安全的,因为所有有关虚拟机有关的线程操作都被关联到虚拟机对象中,而没有利用任何其他共享变量。

Lua要自己定义一个内存管理函数,在lua创建虚拟机的时候传入。这保证了lua的整个运行状态用户是可控的。但是很多时候,不直接使用lua_newstate这个API,而是用另一个更方便的版本luaL_newstate

后面的是利用前面的API实现的,利用C标准库中的函数实现了一个磨人的内存管理器。

//<<lua源码赏析>>17页。

原创粉丝点击