采用以下Lua代码(之所以使用它是因为Lua在被解释之前已编译为字节码):
local myVar = "h";
local function printer()
print(myVar)
end;
printer();
myVar = 7;
printer();
此输出为h
,然后在新行上为7
。
由于语言是动态键入的,我想由于数据类型的变化,必须在内存中重新分配变量。继续此假设,myVar
必须引用脚本不同部分的不同位置。如果真是这样,我认为必须编译两个printer
版本:一个更改前和一个更改后。
我还认为,每个变量都可以分配一些内存位置,并且可以检查给定的内存位置以找到变量值的当前分配位置。如果是这种情况,我想像表这样的引用类型会将引用存储到引用位置(双引用)吗?
那么,是否针对每个可能运行的不同版本编译了函数?是否使用指针跟踪变量位置的变化?还是在进行其他处理?
答案 0 :(得分:5)
由于语言是动态键入的,我想由于数据类型的变化,必须将变量重新分配到内存中。
对象占用内存;变量只是对象的 holders 。变量可以容纳任何对象;当您调用myvar
(无论它在哪里)时,它将转到myvar
保留其对象并检索它的位置。当您执行myvar = <something>
时,它将转到myvar
持有其对象的位置,并将持有的对象切换为<something>
。
除持有对象所需的内存之外,任何内存都是 object 的一部分,而不是变量的一部分。
特别是对于Lua,像myvar
这样的局部变量是特定Lua堆栈上的特定位置。可以将一个对象存储到该位置,并可以从中检索该对象。假设您处于创建本地变量的Lua代码的同一实例中,则无论您从何处读取数据,位置都相同。