我正在阅读 Lua 的源代码,惊讶地发现它被实现为生成一些奇怪的指令(例如 GETUPVAL、FORLOOP 等)。然后这些操作码由虚拟机执行。这样做有什么好处(与纯基于 AST 的解释器相比?)
谢谢。
我正在阅读 Lua 的源代码,惊讶地发现它被实现为生成一些奇怪的指令(例如 GETUPVAL、FORLOOP 等)。然后这些操作码由虚拟机执行。这样做有什么好处(与纯基于 AST 的解释器相比?)
谢谢。
使用虚拟机是一种古老的语言实现技术,至少可以追溯到 UCSD Pascal、BCPL 和 Smalltalk。大多数脚本语言现在都使用虚拟机。有些使用通用虚拟机。Lua 使用一种特殊用途的虚拟机来反映语言的语义。因此,专门的操作码。Lua 通过将 5.0 版迁移到基于寄存器的虚拟机,而不是传统的基于堆栈的虚拟机,确实在这一领域引入了新奇事物。
有关字节码解释器和抽象语法树解释器的一般比较,请参阅Wikipedia:Interpreter。
Lua从诞生起就一直使用虚拟机,在Lua 5.0中引入了基于寄存器的虚拟机(这是第一个被广泛使用的基于寄存器的虚拟机)。 Lua的演变,由Lua的作者撰写,提供了大量关于该主题的资源。
Lua 的作者写的另一篇论文,Lua 5.0 的实现提供了很多关于实现的细节,第 7 章虚拟机对你特别有帮助,这篇论文也是阅读 Lua 源代码的一个很好的参考。