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

来源:互联网 发布:注册淘宝店铺 编辑:程序博客网 时间:2024/04/29 23:06

变量是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系列的指令只会修改栈上的数据。

 

原创粉丝点击