Lua数据结构 — lua_State(六)

作者:罗日健

前面各种Lua的数据类型基本都说得差不多了,剩下最后一个数据类型:lua_State,我们可以认为是”脚本上下文”,主要是包括当前脚本环境的运行状态信息,还会有gc相关的信息。

Lua这门语言考虑了多线程的情况,在脚本空间中能够开多个线程相关脚本上下文,而大家会共用一个全局脚本状态数据,如下:

全局数据global_state的数据结构如下:

global_state主要是用于GC的数据链表,下面简要说明几个:

  1. stringtable strt:这个是在TString那章说到的全局字符串哈希表
  2. TValue lregistry:对应LUAREGISTRYINDEX的全局table.
  3. TString *tmname[TM_N]:元方法的名称字符串。
  4. Table *mt[NUM_TAGS]:基本类型的元表,这是Lua5.0的特性。

mt成员在作者介绍文章中说到:

在上面代码中,我们看到a支持一个tostring的方法,a是数值类型,我们可以为数值类型添加任意的方法。Lua文章中说到一个用途,就是对于unicode和gbk的字符串的len方法能自己实现。

其它成员就不一一介绍了,下面来介绍与线程相关的脚本上下文lua_State:

我们看到,luaState也带有CommonHeader头,在第一章中也提到了GCObject中有luaState th这个成员,由此可见lua_State也会是被回收的对象之一。

考虑回一个线程中的脚本上下文,我们再来逐个分析每个成员:

  • lu_byte status:线程脚本的状态,线程可选状态如下:

  • StkId top:指向当前线程栈的栈顶指针,typedef TValue *StkId
  • StkId base:指向当前函数运行的相对基位置,具体可参考第四章的闭包
  • globalState *lG:指向全局状态的指针
  • CallInfo *ci:当前线程运行的函数调用信息
  • const Instruction *savedpc:函数调用前,记录上一个函数的pc位置
  • StkId stack_last:栈的实际最后一个位置(栈的长度是动态增长的)
  • StkId stack:栈底
  • CallInfo *end_ci:指向函数调用栈的栈顶
  • CallInfo *base_ci:指向函数调用栈的栈底
  • int stacksize:栈的大小
  • int size_ci:函数调用栈的大小
  • unsigned short nCcalls:当前C函数的调用的深度
  • unsigned short baseCcalls:用于记录每个线程状态的C函数调用深度的辅助成员
  • lu_byte hookmask:支持哪些hook能力,有下列可选的

  • lu_byte allowhook:是否允许hook
  • int basehookcount:用户设置的执行指令数(LUA_MASKCOUNT下有效)
  • int hookcount:运行时,跑了多少条指令(LUA_MASKCOUNT下有效)
  • lua_Hook:用户注册的hook回调函数
  • TValue l_gt:当前线程的全局的环境表
  • TValue env:当前运行的环境表
  • GCObject *openupval、gclist:用于gc,详细将会在GC一章细说
  • struct lua_longjmp *errorJmp:发生错误的长跳转位置,用于记录当函数发生错误时跳转出去的位置。

 

本系列总结:

整个系列文章回答了我们对Lua中最基本的一个问题:“一个Lua变量究竟是什么?”。由此我们深入并引申出各种知识,在脚本中我们觉得弱类型变量用起来很痛快,而其实它的内部实现其实是如此的复杂。

对于实现一门脚本语言,必须实现的是解释器、虚拟机、上下文数据3大部分:

上下文数据这一层是脚本最基础,最底层的东西,它决定了这门脚本究竟能做什么。抛开解释器和虚拟机,我们依然可以单纯地通过C接口,在C++这一层就能操作脚本的上下文数据。

有空再研究一下Lua的GC,解释器等等。

 

时间: 2024-09-29 06:18:22

Lua数据结构 — lua_State(六)的相关文章

Lua数据结构 — 闭包(四)

作者:罗日健 前面几篇文章已经说明了Lua里面很常用的几个数据结构,这次要分享的也是常用的数据结构之一 – 函数的结构.函数在Lua里也是一种变量,但是它却很特殊,能存储执行语句和被执行,本章主要描述Lua是怎么实现这种函数的. 在脚本世界里,相信闭包这个词大家也不陌生,闭包是由函数与其相关引用环境组成的实体.可能有点抽象,下面详细说明: 一. 闭包的组成 闭包主要由以下2个元素组成: 函数原型:上图意在表明是一段可执行代码.在Lua中可以是lua_CFunction,也可以是lua自身的虚拟机

Lua数据结构 — Udata(五)

作者:罗日健 Udata负责存储userdata的数据,这部分其实很简单,但是为了保证系列文章的完整性,还是写一篇出来补全. 下面是Udata的数据结构: 意义: CommonHeader:和与TValue中的GCHeader能对应起来的部分 metatable:userdata的元表,和table的元表一样的 env:创建userdata时,会把当前执行语句的curenv赋给userdata的env,可修改 len:使用userdata的时候绑定对象申请的空间大小 和TString类似,用户绑

Lua数据结构 — TValue(一)

作者:罗日健 数据结构的设计,在一定程度上奠定了整个系统的设计,所以决定写一个对Lua主要数据结构的分析文章,本来打算写一篇就好了,但是每个数据类型其实都有点复杂,一篇的话篇幅太长,所以就拆开几篇来写了. 为什么是从TValue说起,TValue是实现Lua弱数据类型的主要数据结构,不但在脚本中的值使用了TValue,连Lua的实现中,很多数据结构也依赖于TValue,TValue一定程度上贯穿了整个Lua.先说一下Lua里面的数据类型:(lua.h :69) 从上面的定义中可以看到,Lua的值

Lua数据结构 — TString(二)

作者:罗日健 存储lua里面的字符串的TString数据结构:(lobject.h 196-207) 其它结构中也会有L_Umaxalign dummy这个东西,来看看L_Umaxaliagn: 从字面意思上就是保证内存能与最大长度的类型进行对齐,事实上也是做这件事,这里感觉lua想给各种不同设备做一种嵌入式脚本,这里要保证与最大的长度对齐能保证CPU运行高效不会罢工. tsv才是TString的主要数据结构: CommonHeader:这个是和GCObject能对应起来的GCheader re

Lua数据结构 — Table(三)

作者: 罗日健 前面(一).(二)里面其实已经把一些常用的数据类型(数值.布尔.字符串)说明了,这次要描述的是Table,Table在Lua里是一种常用的数据类型,是Lua里的精髓之一,其效率必须得到保证,而实现这种支持任意类型key和value的Table也是较为复杂的. 一, Table的设计思想: 1, 首先,讲一下Lua要设计的Table是怎么样子的: Lua就是想做这种支持任意类型的key和任意类型val的table,并且要高效和节约内存. 2, 基本的实现(基于链表的实现): 基于链

Lua之Lua数据结构-TTLSA(6)(转) good

一. tabletable是lua唯一的数据结构.table 是 lua 中最重要的数据类型. table 类似于 python 中的字典.table 只能通过构造式来创建.其他语言提供的其他数据结构如array.list等等,lua都是通过table来实现的.table非常实用,可以用在不同的情景下.最常用的方式就是把table当成其他语言的数组.实例1:   1 2 3 4 mytable = {} for index = 1, 100 do     mytable[index] = mat

Lua数据结构的学习笔记

一. table table是lua唯一的数据结构.table 是 lua 中最重要的数据类型. table 类似于 python 中的字典.table 只能通过构造式来创建.其他语言提供的其他数据结构如array.list等等,lua都是通过table来实现的.table非常实用,可以用在不同的情景下.最常用的方式就是把table当成其他语言的数组. 实例1:  代码如下 复制代码 mytable = {} for index = 1, 100 do     mytable[index] =

Lua编程示例(六): C语言调用Lua函数_Lua

C++端: #include "stdafx.h" lua_State *L; void load_lua(lua_State **L,char *filename){ *L=luaL_newstate(); luaL_openlibs(*L); if(luaL_loadfile(*L,filename) || lua_pcall(*L,0,0,0)){ luaL_error(*L,"load file error! %s",lua_tostring(*L,-1))

数据结构教程 第六课 线性表的顺序表示和实现

本课主题: 线性表的顺序表示和实现 教学目的: 掌握线性表的顺序表示和实现方法 教学重点: 线性表的顺序表示和实现方法 教学难点: 线性表的顺序存储的实现方法 授课内容: 复习 1.存储结构 逻辑结构   "数据结构"定义中的"关系"指数据间的逻辑关系,故也称数据结构为逻辑结构. 存储结构   数据结构在计算机中的表示称为物理结构.又称存储结构. 顺序存储结构 链式存储结构 2.线性表的类型定义 一.线性表的顺序表示 用一组地址连续的存储单元依次存储线性表的数据元素