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

Vor*_*Dev 3 lua compilation

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

local myVar = "h";

local function printer()
    print(myVar)
end;

printer();

myVar = 7;

printer();
Run Code Online (Sandbox Code Playgroud)

h然后,输出到新线,7.

由于语言的动态类型,我认为由于数据类型的改变,必须在内存中重新分配变量.继续这个假设,myVar必须在脚本的不同部分引用不同的地方.如果是这种情况,那么对我来说有必要printer编译两个版本:一个是预更改,一个是更改后.

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

那么,是否为可能运行的每个不同版本编译的函数?是否使用指针跟踪变量位置更改?或者是其他一些流程在这里发生?

Nic*_*las 5

由于语言的动态类型,我认为由于数据类型的改变,必须在内存中重新分配变量.

物体占用记忆; 变量只是对象的持有者.变量可以容纳任何对象; 当你调用myvar(无论在哪里)时,它会转到myvar保存其对象并检索它的位置.当你这样做时myvar = <something>,它会转到myvar保存其对象的位置并切换所保持的对象<something>.

超越持有的对象所需要的任何记忆是金的对象,而不是变量.

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