可能游戏圈的朋友对lua会更熟悉些,灵活、高效、跨平台、易用等诸多优点决定了这门语言将会得到更广泛的应用,而不只局限于游戏,已经有许多的技术大牛对这门语言做过许多的分析,这其中就包括云风,关于lua的更多介绍,可以查看官网,以及各种搜索引擎。本文旨在对lua虚拟机进行简单的分析,包含的内容有虚拟机中一部分基本的数据结构。
在应用的角度来看,lua有以下几种数据类型:nil、布尔类型、[light]UserData、Number、字符串、表、函数、线程(不同于操作系统的线程),而所有这些类型的表示,都需要一个被称为TValue的类型支撑,如下:
#define numfield /* no such field; numbers are the entire struct */
typedef int (*lua_CFunction) (lua_State *L); // 先看成普通的C函数指针吧
union Value {
GCObject *gc; /* collectable objects */ // 这期先不管这个,当成指针来看就ok了
void *p; /* light userdata */
int b; /* booleans */
lua_CFunction f; /* light C functions */
numfield /* numbers */
};
#define TValuefields \
union { struct { int tt__; Value v__; } i; double d__; } u
struct lua_TValue {
TValuefields;
};
typedef struct lua_TValue TValue;
看起来有点绕,对吧?基础的数据类型TValue其实就是一个4字节的union,外加一个类型tt__,或者表示成一个double类型,至于类型tt__,上面已经介绍过有那么几种类型,而关于各种具体类型对应的id,如下:
#define LUA_TNONE (-1) // 好吧,把这个也当成空类型吧
#define LUA_TNIL 0
#define LUA_TBOOLEAN 1
#define LUA_TLIGHTUSERDATA 2
#define LUA_TNUMBER 3
#define LUA_TSTRING 4
#define LUA_TTABLE 5
#define LUA_TFUNCTION 6
#define LUA_TUSERDATA 7
#define LUA_TTHREAD 8