美文网首页
lua学习之路

lua学习之路

作者: qianlihu | 来源:发表于2017-09-18 20:13 被阅读141次

以前学习过lua,也尝试在项目中使用过,这门语言很符合我的技术审美,所以打算深入进去,这门语言有以下几个特点

  1. 很方便的和c交互,lua的cAPI调用逻辑简单,效率高。很方便使用
  2. 这是一个很小的语言,依赖少,标准库小,整个语言的实现代码不过两万多行,很方便学习。
  3. 在游戏领域,大有lua+c替代C++的趋势。

我不写游戏,也不会。但在我看来,游戏项目代码量,逻辑,复杂度都是远超一般项目的,lua+c的方案也会得到更大的推广。

这里主要记录一下lua的对象系统。

lua有nil、boolean、number、string、userdata、function、thread、table 8 种数据类型。代码实现时,定义了如下结构

typedef union Value{
  GCObject *gc;
  int b;        // for boolean
  lua_CFunction f;
  lua_Integer i;
  lua_Number n;
}Value;

typedef struct lua_TValue{
  Value value__;
  int tt;
}TValue;

其中TValue的定义分为两个部分,其中tt存放数据类型,value__存放各种数据。value__又可以分为两部分,可gc的数据类型使用union放在一起,剩下的是不可gc的数据。

这是c语言实现面向对象的一种方式。对外部而言,TValue是基类,真正处理数据时,根据tt存储的数据类型来决定使用Value的哪个数据部分。

对于可gc部分,则稍显复杂一些。
我们来看一下gc部分

union GCUnion{
  GCObject gc;
  struct TString t;
  strucct Udata u;
  union Closure cl;
  struct Table h;
  struct Proto p;
  struct lua_State th;
};

#define cast_u(o)  cast(union GCUnion *,(o))
...
//根据TValue取得表数据。
#define gco2t(o)   cast_u(o)->h     //为方便理解做了适当简化
#define hvalue(o) gco2t(o->value__).gc)//为方便理解做了适当简化

转化过程其实是 TValue --取出子结构 -->GCObject --向上强转-->GCUnion -->具体数据类型。当然其中用了小技巧,即GCObject必须始终位于数据的头部,否在向上强转会失败

typedef struct GCObject{
  GCObject *next;
  lu_byte  tt;
  lu_byte marked
}GCObject;

在这里next指针用于将数据串联起来,tt用于存放数据类型,marked用与gc算法的实现,存储gc的颜色值。

相关文章

  • Lua学习之路

    打印hello world 复杂一点的语法 交互模式 终端模式下命令 lua变量和块 lua table 算数运算...

  • lua学习之路

    以前学习过lua,也尝试在项目中使用过,这门语言很符合我的技术审美,所以打算深入进去,这门语言有以下几个特点 很方...

  • redisgo操作LUA脚本

    LUA脚本基础学习:LUA脚本--菜鸟教程[https://www.runoob.com/lua/lua-tuto...

  • 【译】从 JS 学习 Lua

    原文:Learning Lua/From JS 从 JS 学习 Lua 对 JavaScript 已经了解,想学习...

  • Lua 基本语法

    Lua 学习起来非常简单,我们可以创建第一个 Lua 程序! 第一个 Lua 程序 交互式编程 Lua 提供了交互...

  • 2017.5.25

    lua学习总结:数据结构: 使用Lua实现链表(单向链表和双向链表),队列 使用Lua保存图,用table保存,每...

  • 我的技术栈思路

    后端和架构师之路: 平台: linux/Unix语言:C/C++/Java/Shell/Python/Go/Lua...

  • lua相关学习资料收集

    lua官网:http://www.lua.org/home.htmllua学习网站:http://www.runo...

  • Lua学习

    Lua 学习 元表 setmetatable(table,metatable): 对指定table设置元表(met...

  • Lua学习

    关于luac文件:预编译并非意味着执行更快速,因为Lua中的单元总会在执行前被编译为字节码。luac只不过允许这些...

网友评论

      本文标题:lua学习之路

      本文链接:https://www.haomeiwen.com/subject/mhjylxtx.html