lua - 动态类型语言的编译器如何处理非局部变量的变化?
问题描述
采用以下 Lua 代码(我之所以使用它,是因为 Lua 在被解释之前被编译为字节码):
local myVar = "h";
local function printer()
print(myVar)
end;
printer();
myVar = 7;
printer();
那么,这个的输出是h
在一个新的行上,7
。
由于语言的动态类型,我想由于数据类型的变化,变量必须在内存中重新分配。继续这个假设,myVar
必须在脚本的不同部分引用不同的地方。如果是这样的话,对我来说必须有两个版本的编译是有意义的printer
:一个是更改前的,一个是更改后的。
我还考虑到每个变量可能都分配了一些内存位置,并且可以检查给定的内存位置以找到当前分配的变量值的位置。如果是这种情况,我想像表这样的引用类型在引用位置(双重引用)存储了一个引用?
那么,是否为每个可能运行的不同版本编译了一个函数?是否使用指针跟踪变量位置更改?还是这里正在进行其他过程?
解决方案
由于语言的动态类型,我想由于数据类型的变化,变量必须在内存中重新分配。
对象占用内存;变量只是对象的持有者。变量可以保存任何对象;当您调用myvar
(无论在哪里)时,它会转到myvar
保存其对象的位置并检索它。当您这样做时myvar = <something>
,它会转到myvar
持有其对象的位置并将持有的对象切换为<something>
。
任何超出保存对象所需的内存都是对象的一部分,而不是变量的一部分。
特别是对于 Lua,局部变量 likemyvar
是特定 Lua 堆栈上的特定位置。可以将对象存储到该位置,并且可以从中检索对象。无论您从哪里读取数据,位置都是相同的,假设您位于创建局部变量的 Lua 代码的同一实例中。
推荐阅读
- kubernetes - Kubernetes:仅将 Fluentd 安装到命名空间
- html - 悬停镀铬标签时如何避免截断正文标题名称
- android - 重命名包和应用程序 ID Android 后是否需要更改 keyStore jks 文件
- java - 在 Java 中替换嵌套 While 循环的替代方法
- c# - Linq Left Join 或类似的
- arrays - 为什么代码假设是假的,但事实证明是真的
- python - 如何对特定区域进行直方图均衡
- swift - 为什么我的简单 SWIFT 简单视图是黑色的?
- python - 调试多线程 Python 应用程序时,如何阻止 VS Code 从一个线程跳转到另一个线程?
- c# - 在 Azure Service Fabric 中启动有状态服务时加载和使用数据