lua2.1中主要有以下重要的数据结构:
1)全局对象表:所有的全局对象都会被放置到这个表中,在代码的实现上它就是Symbol对象的数组,对应的变量名为lua_table。在lua2.1的实现中总是尽可能地用这个数组中的索引来表示表中的对象。比如要取某个全局对象A,A的索引是i,那么对应的指令就是
PUSHGLOBAL i
2)栈:lua2.1中的虚拟机是基于栈式的,基于栈式的虚拟机的最主要的特点就是计算的结果总是被放置在栈顶,另外操作数在进行计算
之前总是先放置到栈中。
3)全局符号表:这是一个以TreeNode为节点组成的二叉查找数,节点中的key为字符串类型,节点中有一个非常重要的字段是用来保存这个key对应的对象在全局对象表中的位置。比如一个字符串“A”对应的对象是lua_table[i]。这个表在代码上对应的变量是lua_constant
4)全局字符串列表:这是一个以StringNode对象为节点组成的链表,新创建出来的字符串被放置在链表头。这个表在代码上对应的变量
是string_root。
5)全局Hash链表:这是一个以Hash结构为节点组成的链表,新创建的Hash结构被放置链表头。这个表在代码上对应的变量是listhead
注意:在lua2.1中的“关联数组(table)”都是由Hash结构实现的。
下面用一段代码来看lua2.1是如何使用上述的数据结构
a = "hello lua"
function f(b, c)
d = b + c;
d = a + d;
end
f(1, 2);
首先看语法分析阶段
a:全局变量,在lua_table中索引是x,字符串-索引对("a", x)被保存到全局符号表中;
"hello lua":字符串常量,放置到全局字符串表中,并且lua_table[x] <- "hello lua";
f:全局变量,在lua_table中的所以是y,字符串-索引对("f", y)被保存到全局符号表中;
b:局部变量,在栈中
c:局部变量,在栈中
d:全局变量,在lua_table中索引是z,字符串-索引对("d", z)被保存到全局符号表中;
运行阶段:
1、通过“f”在全局符号表中找到z
2、通过z找到lua_table[z]
3、将一个值为1的数字对象放置到栈顶
4、将一个值为2的数字对象放置到栈顶
5、将lua_table[z]放置到栈顶
6、执行栈顶的函数
7、将栈顶的三个对象弹出