gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:14:39 25 4
gpt4 key购买 nike

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

local myVar = "h";

local function printer()
print(myVar)
end;

printer();

myVar = 7;

printer();

此输出是 h,然后换行,7

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

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

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

最佳答案

Due to the dynamic typing of the language, I imagine the variable must be re-allocated in memory due to the change in data type.

对象占用内存;变量只是对象的持有者。变量可以包含任何对象;当你调用 myvar (无论它在哪里),它会到达 myvar 所在的位置持有它的对象并检索它。当你做 myvar = <something> , 它会到达 myvar 的位置持有它的对象并将持有的对象切换为<something> .

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

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

关于lua - 动态类型语言的编译器如何处理非局部变量的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54056101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com