Lua学习---lua源代码的分析顺序

Recommended reading order:
    lmathlib.c, lstrlib.c: get familiar with the external C API. Don't bother with the pattern matcher though. Just the easy functions.
    lapi.c: Check how the API is implemented internally. Only skim this to get a feeling for the code. Cross-reference to lua.h and luaconf.h as needed.
    lobject.h: tagged values and object representation. skim through this first. you'll want to keep a window with this file open all the time.
    lstate.h: state objects. ditto.
    lopcodes.h: bytecode instruction format and opcode definitions. easy.
    lvm.c: scroll down to luaV_execute, the main interpreter loop. see how all of the instructions are implemented. skip the details for now. reread later.
    ldo.c: calls, stacks, exceptions, coroutines. tough read.
    lstring.c: string interning. cute, huh?
    ltable.c: hash tables and arrays. tricky code.
    ltm.c: metamethod handling, reread all of lvm.c now.
    You may want to reread lapi.c now.
    ldebug.c: surprise waiting for you. abstract interpretation is used to find object names for tracebacks. does bytecode verification, too.
    lparser.c, lcode.c: recursive descent parser, targetting a register-based VM. start from chunk() and work your way through. read the expression parser and the code generator parts last.
    lgc.c: incremental garbage collector. take your time.
    Read all the other files as you see references to them. Don't let your stack


英文比较简单,我就不翻译了。
今天已经读了 lmathlib.c, lstrlib.c, lapi.c这三个文件。

对于lmathlib.c和lstrllib.c 这个两个文件主要是熟悉如何扩展Lua,一般使用过Lua的人都对这个会有所了解。只是简单的读一读、熟悉代码风格,不用花太多时间(我只看了20分钟)

lapi.c这里就开始有点难度了, 主要是你这里有一些平时没有接触过的东西。阅读这个文件可以结合手册中第三章C API来进行。

由于lapi.c涉及到很多的宏和结构,建议装一个vim + ctags或Visual studio 2010做cross references。

以下是一些关于lapi.c笔记:


TValue:由Value 和tt 组成, tt为类型标识,等于LUA_TNIL的呢个 Value是一个联合体,
根据tt的值不同使用不同的值,lua中所有的值、对象,都是由这个结构储存。以下是Value联合体的定义:
typedef union {
  GCObject *gc;
  void *p;
  lua_Number n;
  int b;
} Value;

GCObject:里面的内容比较复杂,从字面上理解是指就是gc会收集的对象,
可以理解为Lua中的基本对象。包括Thread,Table,UserData,String都是存储在这个对象。

void* p:就是指针 对应的内容就是api中的lightuserdata,这个可以从lua_pushlightuserdata
和lua_touserdata中得到证明。由此,可以知道lightuserdata和number, integer有相同的行为

index2adr函数:将栈索引转换成StkId,伪索引(GLOBAL Index, REGISTRY Index等)
也是在这里处理。几乎所有API都需要调用这个。

StkId:字面意思为栈ID,实际为TValue*,使用地址作为一标识。可以想象,
lua_State中的栈是一个TValue数组。
阅读lapi.c的时间也不需要太长,不需要太深入,遇到与虚拟机有关的函数,直接step over就可以了。







--------------------------------------------------------------------------------------------------------

Lua 源代码阅读(2)
作者:future0906 发布时间:May 16, 2011 分类:

这次的分析主要是lobject.h文件和lstate.h文件。
lobject.h充满了关于lua 对象如何在C中实现的线索。如果你对这十分好奇,可以详细读一下。
lstate.h 中重要结构体有三个lua_State,global_State和GCObject。

Lua中用到大量C的联合体和结构体组合来巧妙的组织代码。
GCheader 结构体 是所有GC可以收集的对象的基础属性。这里类似于C++中的多态(所有的Lua对象在C里面都是用这个结构体存储)。


GCheader {
    CommonHeader;
}
GCObject结构体,TString, Udata, Closure, Table, Proto, UpVal, lua_State,都包含一个CommonHeader


union GCObject {
  GCheader gch;
  union TString ts;
  union Udata u;
  union Closure cl;
  struct Table h;
  struct Proto p;
  struct UpVal uv;
  struct lua_State th;  /* thread */
};
这是一个非常重要的技巧,可以用C来实现多态。
另外,可以留意到的是,上述GCObject包含的类型在加上基本类型(NIL, BOOLEAN, LIGHTUSERDATA, NUMBER)Lua中的所有类型。
TString:从字面上就是字符串
Udata: 用户数据
Closure: 闭包数据(如何实现?)
Table: 表格
UpVal: 函数外局部变量
lua_State: lua状态对象

所有的对象值都保存为TValue结构体


typedef struct lua_TValue {
  TValuefields;
} TValue;
#define TValuefields    Value value; int tt
根据tt的值不同value会有不同的含义,这个算多态的表现

这就是LUA基本类型的编号,与 CommonHeader中的tt对应


#define LUA_TNONE        (-1)
#define LUA_TNIL        0
#define LUA_TBOOLEAN        1
#define LUA_TLIGHTUSERDATA    2
#define LUA_TNUMBER        3
#define LUA_TSTRING        4
#define LUA_TTABLE        5
#define LUA_TFUNCTION        6
#define LUA_TUSERDATA        7
#define LUA_TTHREAD        8

每个Lua虚拟机实例都包含一个global_state和一个lua_State
global_state对于C API来说是不可见,每个lua_State都有一个指向global_state的指针
global_state包含gc信息等。和global_state一起创建的lua_State称为MainThread。
lua_State中的stack由stack_init初始化(申请内存等),可以由luaE_newthread和f_luaopen调用,初始栈的大小为20*2 +5





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值