您的位置:首页 > 编程语言 > Lua

lua2.1 全局变量和局部变量(完善中)

2010-05-01 10:26 387 查看
变量是lua2.1中的基石,由于各变量的作用的不同,我们一般分为全局变量和局部变量,在lua2.1中也有这两种变量,但是在其内部的

具体实现的却很难让人理解,本文主要来探讨lua2.1中全局变量和局部变量的具体实现细节。

与以往的分析不同,这次我们先来个实例。

b = 1;

function func1(c)

local d, d1;

local e;

e = 1;

a = 1;

return a;

end

上面的lua语句得到的指令如下:

CODE

1 ADJUST 1

3 ADJUST 3

5 ADJUST 4

6 PUSH1

7 STORELOCAL3

8 PUSH1

9 STOREGLOBAL 55

12 PUSHGLOBAL 55

16 RETCODE 4

18 ADJUST 1

20 RETCODE 1

CODE

0 PUSH1

1 STOREGLOBAL 50

4 RETCODE0

我们之后这个函数func1分析下来一共有四个局部变量,第一个局部变量是在分析func的参数的时候得到的,伴随这个变量的确定还有

一条指令是ADJUST 1来调整栈顶使得参数数量为1;第二和第三个局部变量是在分析语句local d, d1的时候确定的,我们现在可以先

断定一个local关键字会带来一调ADJUST指令,那么时会有指令ADJUST 3。第四个和前面两个一样。那么接着的a是局部变量吗?显然

不是,因为它分析的结果是PUSH1 STOREGLOBAL 55,说明它是全局变量。好了,到目前为止我们知道有两种情况可以使的一个变量

成为局部变量,第一个是形参,第二个是被关键字local修饰过的变量。其它的八九不离十是全局变量。

下面我们考虑几种情况:

情况1:使用一个已有的全局变量的名字作为局部变量

b = 1;

function func1(c)

local b;

b = 2;

end

指令:

CODE

1 ADJUST 1

3 ADJUST 2

4 PUSH2

5 STORELOCAL1

7 ADJUST 1

9 RETCODE 1

CODE

0 PUSH1

1 STOREGLOBAL 50

4 RETCODE0

通过指令我们知道函数func1执行过后并不会修改全局变量b的值。

情况2:将全局变量作为参数传入的时候

b = 1;

function func1(c)

c = 2;

end

func1(b);

CODE

1 ADJUST 1

2 PUSH2

3 STORELOCAL0

5 RETCODE 1

指令:

CODE

0 PUSH1

1 STOREGLOBAL 50

4 PUSHGLOBAL 52

7 PUSHGLOBAL 50

10 CALLFUNC 1 0

13 RETCODE0

通过指令我们知道func1使用的只是b的拷贝,所以函数中对参数c的修改并不能对b的值造成影响,

另外一个原因是,如果想修改一个全局变量,那么你必须使用STOREGLOBAL之类的指令才行,

STORELOCAL系列的指令只会修改栈上的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: