Lua源码分析(1)


Lua源码分析(1) -- 简介收藏

新一篇: Lua源码分析(2) -- 对象表示 | 旧一篇: Ruby 在 VC Express 2005 下的编译

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>  本文是我在阅读Lua源代码时的一些心得笔记, Lua的版本是5.1.1. 将主要关注Lua解释器的结构, 以及部分重要算法, 并不针对每个细节进行说明. 希望本系列文章, 能够总体上说明Lua的实现的脉络, 在需要的时候能够进一步分析源码对Lua并做适当的定制.

将按以下顺序来说明Lua的实现:

首先, 将讨论Lua基本对象(空, 布尔, 数值, 字符串, 表, 函数, 线程, 用户数据)的实现.

在了解了基本对象的实现之后, 将分析Lua虚拟机的指令系统; 以及虚拟机的实现, 即回答Lua指令(字节码)是如何得到执行的.

然后, 会对Lua的词法分析, 语法分析和指令生成做分析, 介绍Lua源代码到字节码的生成过程.

最后, 将做为分别的专题, 讨论一些特别的基本对象的实现特点(字符串与表, 函数与闭包, 协程 coroutine与线程), 垃圾收集的实现等等.

自己是第一次写这样的文章,恐怕还会多有疏漏.

发表于 @ 2007年03月25日 11:52:00|评论(2<script type="text/javascript">AddFeedbackCountStack("1540418")</script>)|编辑

新一篇: Lua源码分析(2) -- 对象表示 | 旧一篇: Ruby 在 VC Express 2005 下的编译


 Lua源码分析(2) -- 对象表示收藏

新一篇: Lua源码分析(3) -- 虚拟机 | 旧一篇: Lua源码分析(1) -- 简介

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

Lua是动态类型的语言, 即是说类型附着于值而不变量[1]. Lua的八种基本类型空, 布尔, 数值, 字符串, 表, 函数和用户数据. 所有类似的值都是虚拟机的第一类值. Lua 解释器将其表示成为标签联合(tagged union). 如下面代码示例所示:

lobject.h : 56
/*
** Union of all Lua values
*/
typedef union {
    GCObject *gc;
    void *p;
    lua_Number n;
    int b;
} Value;


/*
** Tagged Values
*/

#define TValuefields Value value; int tt

typedef struct lua_TValue {
    TValuefields;
} TValue;

lstate.h : 132

/*
** Union of all collectable objects
*/

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 */
};

lobject.h : 39
/*
** Common Header for all collectable objects (in macro form, to be
** included in other objects)
*/
#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked


/*
** Common header in struct form
*/
typedef struct GCheader {
    CommonHeader;
} GCheader;

首先看到的一个TValue结构,它是由一个Value类型的字段value和int类型字段tt组成,它由于一个宏定义出来.很显然,这里的tt就是用于表示这个值的类型,这也是之前所说的,Lua的类型是附着于值上的原因.

接 下来,再打量打量Value的定义,它被定义为union.这样做的目的是让这一个类型可以表示多个类型.从这个定义中可以看出这样一点:Lua的值可以 分成两类,第一类是可以被垃圾回收机制回收的对象,它们统一使用GCObject的指针来表示;另一类是原始类型,直接使用C语言的类型来表示相应类型, 如:用void *来表示lightuesrdata, 用lua_Number来表示数值,用int来表示boolean.这里需要注意的是lua_Number是在如下两个文件定义出来的.由于Lua是易于 嵌入的语言,在某些特定的环境下,所有数值都用双精度浮点来表示并不合适,因此,在Lua的配置文件上使用宏来定义数值类型.这使得要改变Lua的数值类 型变得非常简单.

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值