Lua是一个小巧的脚本语言。也被广泛应用,比如游戏开发。引擎用c++,经常变动的业务层用lua实现。做了几年的lua应用开发。最近想研究一下lua的具体实现,深入的了解lua。

lua版本:5.3.5

Lua特性:

  1. 可移植性
  2. 良好的嵌入性
  3. 非常小的尺寸
  4. 高效,速度快

Lua源码大体分为个部分:虚拟机核心、内嵌库以及解释器、编译器

Lua 虚拟机工作流程

1. Lua代码进行词法分析、语法分 析等,最终生成字节码

2.这些字节码装载到虚拟机中执行

 

Lua中的数据类型

Lua是一门动态类型的脚本语言,这意味着同一个变量可以在不同时刻指向不同类型的数据

基本的数据类型有                                    类型                                            对应数据结构

#define LUA_TNONE   (-1)                        无类型                                                 

#define LUA_TNIL    0                                   空类型                                                 

#define LUA_TBOOLEAN    1                      布尔类型                                            

#define LUA_TLIGHTUSERDATA  2         指针                                                      void*

#define LUA_TNUMBER   3                         数据                                                      lua_Number

#define LUA_TSTRING   4                            字符串                                                  TString

#define LUA_TTABLE    5                                                                                        Table

#define LUA_TFUNCTION   6                      函数                                                      CClosureLClosure

#define LUA_TUSERDATA   7                     指针                                                      void*

#define LUA_TTHREAD   8                          Lua虚拟机,协程                                lua_State

 

Lua中用lua_TValue来保存所有的数据类型

typedef union Value {

  GCObject *gc;        可回收对象

  void *p;             自定义类型

  int b;           布尔类型

  lua_CFunction f;  c函数

  lua_Integer i;     整数

  lua_Number n;    浮点数

} Value;

 

#define TValuefields  Value value_; int tt_

typedef struct lua_TValue {

  TValuefields;

} TValue;

展开之后:

typedef struct lua_TValue {

  Value value_;

 int tt_    类型标记

} TValue;

 

有些数据类型需要进行垃圾回收,lua中用iscollectable宏判断类型是否需要垃圾回收。

#define iscollectable(o)  (rttype(o) & BIT_ISCOLLECTABLE)

相关宏:#define BIT_ISCOLLECTABLE  (1 << 6)

#define rttype(o) ((o)->tt_)

由此可见,tt_的第六位用于标记类型是否需要进行垃圾回收。

 

可进行垃圾回收的类型:GCObject

可回收对象的通用类型

typedef struct GCObject GCObject;

可回收对象的通用头部

#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked

可回收对象的通用类型只包含通用头部

struct GCObject {

  CommonHeader;

};

 

展开为:

struct GCObject {

  GCObject *next;    指向下一个gc对象

 lu_byte tt;         对象类型

 lu_byte marked      gc标记

;

};

 

表示所有可回收对象的联合体

union GCUnion {

  GCObject gc;

  struct TString ts;

  struct Udata u;

  union Closure cl;

  struct Table h;

  struct Proto p;

  struct lua_State th;

};

 

lua源码分析:lua的数据类型

相关文章: