• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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;

};

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua操作中文字符串之截取和长度竖排显示发布时间:2022-07-22
下一篇:
Lua admin后台开发 (2) admin库的后台页面介绍发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap