lua学习之路

以前学习过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的颜色值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,834评论 0 17
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,065评论 18 399
  • 1. 写在前面 很多时候我们都需要借助一些脚本语言来为我们实现一些动态的配置,那么就会涉及到如何让脚本语言跟原生语...
    杰嗒嗒的阿杰阅读 8,719评论 9 31
  • 1 闺蜜前几天忽然问我说 “丹丹,你的朋友圈打开怎么什么都没有?” 我说设置成了只能显示最近3天的状态, 这几天什...
    Annald阅读 2,361评论 0 0
  • 毛概课上,我趴在课桌上昏昏欲睡,阿照从后面踢我的板凳。我扭过头剜给她一个愤怒的眼神,她笑嘻嘻地朝我勾手示意我靠近一...
    江北不吃米阅读 8,939评论 237 134