Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 动态类型语言的编译器如何处理非局部变量的更改?_Lua_Compilation - Fatal编程技术网

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

Lua 动态类型语言的编译器如何处理非局部变量的更改?,lua,compilation,Lua,Compilation,以下面的Lua代码为例(我使用它是因为Lua在被解释之前被编译成字节码): 这个的输出是h,然后在新行上是7 由于语言的动态类型,我认为由于数据类型的变化,必须在内存中重新分配变量。从这个假设出发,myVar必须引用脚本不同部分的不同位置。如果是这样的话,我认为必须编译两个版本的printer:一个是变更前版本,一个是变更后版本 我还考虑到每个变量可能都有一些分配给它的内存位置,并且可以检查给定的内存位置,以找到当前分配给变量值的位置。如果是这种情况,我假设像表这样的引用类型在引用位置存储了一个

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

这个的输出是
h
,然后在新行上是
7

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

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

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

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

对象占用内存;变量仅仅是对象的持有者。变量可以容纳任何对象;当您调用
myvar
(无论在何处)时,它会转到
myvar
保存其对象并检索该对象的位置。执行
myvar=
操作时,它会转到
myvar
保存其对象的位置,并将保存的对象切换为

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


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

为清楚起见,
myVar
是主函数中的局部变量。在
打印机中
将其绑定为“”。唯一的全局设置是
print
。“全局”变量与您的问题无关@NicalBolas的答案适用于所有变量,包括那些绑定为上限值的变量。你是对的:谢谢你的更正。
local myVar = "h";

local function printer()
    print(myVar)
end;

printer();

myVar = 7;

printer();