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也会是被回收的对象之一。

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

本系列总结:

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

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

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

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

来自: http://blog.aliyun.com/795?spm=0.0.0.0.JJQP5w