在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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; };
|
请发表评论