Archive for 七月 2012

Lua5.1.4代码分析(六)Opcode格式

了解了Lua虚拟机和栈的结构之后,在正式进入分析各种Lua的操作之前,还需要简单了解Lua Opcode的格式.

Lua的opcode格式分为三类,在lopcode.h中有定义:
enum OpMode {iABC, iABx, iAsBx}; /* basic instruction format */

Lua5.1.4代码分析(五)Lua栈

上一篇中,已经将Lua代码从分析到执行的大致流程分析了一遍,但仅有这些,还不足以了解Lua的运作机制,这里要分析一下Lua中的另外一个重要概念:栈.

Lua的栈在Lua中扮演着一个非常重要的中间层的角色.既然Lua虚拟机模拟的是CPU的运作,那么Lua栈模拟的就是内存的角色.在Lua内部,参数的传递是通过Lua栈,同时Lua与C等外部进行交互的时候也是使用的栈.这些暂时不展开讨论,先关注的是Lua栈的分配,管理和相关的数据结构.

lua虚拟机在初始化创建lua_State结构体时,会走到stack_init函数中,这个函数主要就是对Lua栈和CallInfo数组的初始化:

Lua5.1.4代码分析(四)Lua虚拟机概述

何为”虚拟机”?
在一门脚本语言中,总会有一个虚拟机,可是”虚拟机”是什么?简而言之,这里的”虚拟机”就是使用代码实现的用于模拟计算机运行的程序.
每一门脚本语言都会有自己定义的opcode(operation

Lua5.1.4代码分析(三)表类型

来看Lua的表的定义:

typedef struct Table {
  CommonHeader;
  lu_byte flags;
  lu_byte lsizenode;  /* log2 of size of `node' array */
  struct Table *metatable;
  TValue *array;  /* array part */
  Node *node;
  Node *lastfree;  /* any free position is before this position */
  GCObject *gclist;
  int sizearray;  /* size of `array' array */
}

Lua5.1.4代码分析(二)字符串类型

Lua中字符串结构体的定义是:

typedef union TString {
  L_Umaxalign dummy;  /* ensures maximum alignment for strings */
  struct {
    CommonHeader;
    lu_byte reserved;
    unsigned int hash;
    size_t len;
  } tsv;
} TString;

这里TString结构体是一个union, 最开始的L_Umaxalign

Lua5.1.4代码分析(一)Lua的通用数据类型

TValue这个结构体是Lua的通用结构体,顾名思义,它存放的是Lua的数据,既然是”通用”的,同时也说明,Lua中的所有的数据都可以使用这个结构体来表示.很容易想到,在面向对象中,这个结构体是一个基类,派生出来的都是其他的子类.如果使用C语言来模拟,就是定义出一个通用的结构体作为”父类”,然后子类的结构体中以这个父类作为结构体的第一个成员变量.比如这样:

struct Common {
   // ....
};
struct Object1 {
  struct Common com;