动态类型语言的编译器如何处理非局部变量的更改?

时间:2019-01-05 20:46:55

标签: lua compilation

采用以下Lua代码(之所以使用它是因为Lua在被解释之前已编译为字节码):

local myVar = "h";

local function printer()
    print(myVar)
end;

printer();

myVar = 7;

printer();

此输出为h,然后在新行上为7

由于语言是动态键入的,我想由于数据类型的变化,必须在内存中重新分配变量。继续此假设,myVar必须引用脚本不同部分的不同位置。如果真是这样,我认为必须编译两个printer版本:一个更改前和一个更改后。

我还认为,每个变量都可以分配一些内存位置,并且可以检查给定的内存位置以找到变量值的当前分配位置。如果是这种情况,我想像表这样的引用类型会将引用存储到引用位置(双引用)吗?

那么,是否针对每个可能运行的不同版本编译了函数?是否使用指针跟踪变量位置的变化?还是在进行其他处理?

1 个答案:

答案 0 :(得分:5)

  

由于语言是动态键入的,我想由于数据类型的变化,必须将变量重新分配到内存中。

对象占用内存;变量只是对象的 holders 。变量可以容纳任何对象;当您调用myvar(无论它在哪里)时,它将转到myvar保留其对象并检索它的位置。当您执行myvar = <something>时,它将转到myvar持有其对象的位置,并将持有的对象切换为<something>

除持有对象所需的内存之外,任何内存都是 object 的一部分,而不是变量的一部分。

特别是对于Lua,像myvar这样的局部变量是特定Lua堆栈上的特定位置。可以将一个对象存储到该位置,并可以从中检索该对象。假设您处于创建本地变量的Lua代码的同一实例中,则无论您从何处读取数据,位置都相同。