lua基础的关键点

本文深入探讨了Lua虚拟机的结构,包括global_State和lua_State的管理,以及lua_newstate函数的工作流程。此外,还介绍了Lua的关键点,如字符串连接、转换操作、表的特性、内存管理、函数特性和闭包。通过对这些概念的解析,读者能更好地理解Lua的运行机制和编程特点。
摘要由CSDN通过智能技术生成

(一)lua虚拟机

Lua体积很小,往往使用静态链接嵌入到程序内部,在发布应用时不需要附带任何的运行时支持。

通过luaL_newstate 创建Lua虚拟机时,第一块申请的内存将用来存储global_State(全局状态机)和lua_State(主线程)实例。为了避免内存碎片的产生,同时减少内存分配和释放的次数,Lua采用了一个小技巧:利用一个LG结构,把分配lua_State和global_State的行为关联在一起。这个LG结构是在C文件内部定义,而不存在公开的H文件中,仅供该C代码文件使用,因此这种依赖数据结构内存布局的用法负作用不大。
global_State
一个lua虚拟机中只有一个, 它管理着lua中全局唯一的信息, 主要是以下功能
1. 内存分配策略及其参数, 在调用lua_newstate的时候配置它们. 也可以通过lua_getallocf和lua_setallocf随时获取和修改它
2. 字符串的hashtable, lua中所有的字符串都会在该hashtable中注册.
3. gc相关的信息. 内存使用统计量.
4. panic, 当无保护调用发生时, 会调用该函数, 默认是null, 可以通过lua_atpanic配置.
5. 注册表, 注意, 注册表是一个全局唯一的table.
6. 记录lua中元方法名称 和 基本类型的元表[注意, lua中table和userdata每个实例可以拥有自己的独特的元表--记录在table和userdata的mt字段, 其他类型是每个类型共享一个元表--就是记录在这里].
7. upvalue链表.
8. 主lua_State, 一个lua虚拟机中, 可以有多个lua_State, lua_newstate会创建出一个lua_State, 并邦定到global_state的主lua_State上.
global_State主要是管理lua虚拟机的全局环境.
lua_State
1. 要注意的是, 和nil, string, table一样, lua_State也是lua中的一种基本类型, lua中的表示是TValue {value = lua_State, tt = LUA_TTHREAD}
2. lua_State的成员和功能
    a. 栈的管理, 包括管理整个栈和当前函数使用的栈的情况.
    b. CallInfo的管理, 包括管理整个CallInfo数组和当前函数的CallInfo.
    c. hook相关的, 包括hookmask, hookcount, hook函数等.
    d. 全局表l_gt, 注意这个变量的命名, 很好的表现了它其实只是在本lua_State范围内是全局唯一的的, 和注册表不同, 注册表是lua虚拟机范围内是全局唯一的.
    e. gc的一些管理和当前栈中upvalue的管理.
    f. 错误处理的支持.
3. 从lua_State的成员可以看出来, lua_State最主要的功能就是函数调用以及和c的通信.
lua_State主要是管理一个lua虚拟机的执行环境, 一个lua虚拟机可以有多个执行环境.
lua_newstate函数的流程
经过上面的分析, 可以看出newstate = [new 一个 global_state] + [new 一个 lua_State], 现在看一下它的流程, 很简单
1. 新建一个global_state和一个lua_State.
2. 初始化, 包括给g_s创建注册表, g_s中各个类型的元表的默认值全部置为0.
3. 给l_s创建全局表, 预分配l_s的CallInfo和stack空间.
4. 其中涉及到了内存分配统统使用lua_newstate传进来的内存分配器分配.

2. 创建新lua执行环境
lua_State *luaE_newthread (lua_State *L)
创建一个新的lua_State, 预分配CallInfo和stack空间, 并共享l_gt表, 注意, 虽然每个lua_State都有自己的l_gt, 但是这里是却将新建的lua_State的l_gt都指向主lua_State的l_gt.
注意, lua_State是lua运行的基础[CallInfo]和与c通信的基础[stack], 在新的lua_State上操作不会影响到原来的lua_State:), 这个是协程实现的基础. 这里顺便提一下协程, 这里先引一段lua创始人的话:" 我们不信任基于抢占式内存共享的多线程技术. 在 HOPL 论文中, 我们写道: "我们仍然认为, 如果在连 a=a+1 都没有确定结果的语言中, 无人可以写出正确的程序." 我们可以通过去掉抢占式这一点, 或是不共享内存, 就可以回避这个问题."协程的基础就是"去掉抢占式, 但共享内存", 这里的共享是在lua虚拟机的层面上的, 而不是通常意义上的share memory, 这里的共享内存直接就指的是不同线程[lua_State]之间, 共享lua_State.l_gt全局表, 全局表可以作为不同协程之间的通信环境, 当然也可以用lua_xmove函数, 协程的事先说到这里.
一个和多lua_State相关的函数是: 在同一个lua虚拟机里传递不同lua_State的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值