首页 > 解决方案 > 动态类型语言的编译器如何处理非局部变量的变化?

问题描述

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

local myVar = "h";

local function printer()
    print(myVar)
end;

printer();

myVar = 7;

printer();

那么,这个的输出是h在一个新的行上,7

由于语言的动态类型,我想由于数据类型的变化,变量必须在内存中重新分配。继续这个假设,myVar必须在脚本的不同部分引用不同的地方。如果是这样的话,对我来说必须有两个版本的编译是有意义的printer:一个是更改前的,一个是更改后的。

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

那么,是否为每个可能运行的不同版本编译了一个函数?是否使用指针跟踪变量位置更改?还是这里正在进行其他过程?

标签: luacompilation

解决方案


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

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

任何超出保存对象所需的内存都是对象的一部分而不是变量的一部分。

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


推荐阅读