Lua是一个小巧的脚本语言。也被广泛应用,比如游戏开发。引擎用c++,经常变动的业务层用lua实现。做了几年的lua应用开发。最近想研究一下lua的具体实现,深入的了解lua。
lua版本:5.3.5
Lua特性:
- 可移植性
- 良好的嵌入性
- 非常小的尺寸
- 高效,速度快
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 函数 CClosure,LClosure
#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;
};