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的数值类 型变得非常简单.