《lua源码赏析》笔记 -1
来源:互联网 发布:金税盘开票软件进不去 编辑:程序博客网 时间:2024/04/29 04:27
LUA源码笔记
这些文件根据实现的功能不同分成了 四大部分。
1>虚拟机运转的核心功能
2>源代码解析以及预编译字节码
3>内嵌库
4>可执行的解析器,字节码编译器
(1)LUA核心
LUA虚拟机的行为是由一连串的opcodes控制的,这些opcodes放在了lopcodes.c里面。而对这些opcodes进行编译解析的工作放在了lvm中,其中的API以luaV为前缀。
虚拟机在外面的表现形式就是lua_State结构体。State有当前状态的意思,全局的State里面引用了虚拟机所有的数据。全局State使用luaE为前缀代码放在了lstate中。
函数的运行流程:函数的调用和返回放在了ldo.c中,相关的API用luaD开头。
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.c以luaZ为前缀。
核心系统里面最复杂的部分垃圾回收部分lgc.c,luaC为前缀
Lua是一门嵌入式语言 需要和宿主系统进行交互。交互式通过C API函数来实现的,被放在了lapi.c中API直接以lua开头 供C编写的程序库直接调用
(2)代码翻译以及预编译字节码
让代码运行起来要输入lua程序,这些程序我们读起来就是程序文本,需要通过解析得到内部数据结构(常量和opcode的组合)。这个过程是通过parser:lparser.c和词法分析llex.c来完成解析玩文本代码 还要生成虚拟机理解的数据。过程在lcode中实现,用luaK为前缀。
(3)内嵌库
本身可以完全由宿主系统注入到state中,不过有很多库基本上很难不用所以可以自由加载。主动加载这些库进入lua_state是由lualib.h中的API来实现。模块化管理,require/module管理在loadlib中实现。内建库的初始化API在linit.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页。
- 《lua源码赏析》笔记 -1
- 《lua源码赏析》笔记 -2
- Lua源码赏析_lexical词法分析
- 开源b3log源码赏析
- Mybatis源码赏析
- 赏析ReentrantLock源码
- Jdk源码赏析之一
- MyBatis源码赏析二-顶级接口(1)
- 古典音乐赏析笔记
- 【Programming In Lua (2E) 笔记】1:从源码安装lua
- Lua源码分析(1)
- Lua笔记1-lua是什么
- MyBatis源码赏析3-配置
- opencv SVM 的源码赏析
- std::tr1::shared_ptr源码赏析
- opencv中 MSER 源码赏析
- jQuery幻灯片效果源码赏析
- 【Android基础笔记18】Handler消息传递机制——源码赏析
- 外部主机不允许连接Mysql设置的解决
- 机器学习之利用K-均值聚类算法对未标注数据分组
- 疯狂的程序员--绝影
- 一个比较炫酷的动画
- Hbase建表ERROR: org.apache.Hadoop.hbase.MasterNotRunningException: Retried 7 times
- 《lua源码赏析》笔记 -1
- 一代币CentOS6.7安装方式总结
- toLua++ 下载地址
- IoBuildSynchronousFsdRequest创建IRP数据包_同步
- 获取docker镜像慢的解决办法
- Javascript种的常见笔记(慢慢学)
- 009 Python语法之函数总结与面向对象
-  在jsp中用法实例
- 1040: [ZJOI2008]骑士