gpt4 book ai didi

lua - 'if' 语句的 Lua 字节码可以向后跳转吗?

转载 作者:行者123 更新时间:2023-12-04 15:13:47 62 4
gpt4 key购买 nike

我正在编写一些 Lua 代码,可以读取 string.dump() 函数生成的字节码。我假设(因为它允许进行一些优化和更少的编码)所有 OP_JMP 指令在用于 if 语句时都会向前增加指令指针。他们可以在技术上向后跳,因为他们使用 sBx 值(可以是负值)。我只对标准 Lua 5.1 实现中 if 语句的字节码感兴趣。

我用过 chunkspy (顺便说一句,很棒的工具),查看一些示例的字节码。

这是一个基本的 if 语句:

a, b = 1, 2
if a == b then
print '='
elseif a < b then
print '<'
else
print '>'
end

它产生四次跳跃,没有一个是负的:
[08] jmp 4; to [13]
[12] jmp 11; to [24]
[16] jmp 4; to [21]
[20] jmp 3; to [24]

我试着在 Lua source code 中寻找答案,但它最终令人困惑(如果我花时间掌握它,我相信它是 super 优雅的代码)。

有没有人知道“if”语句的情况,其中 lua 的 OP_JMP 指令对 sBx 具有负值,或者知道它们是否总是正值?

最佳答案

简短回答:IF 语句不能产生负的 JMP (在任何优化的编译器上,与语言无关)。 Lua OP_JMP 可以为循环和 goto 语句的负数(http://lua-users.org/wiki/GotoStatement)

长答案:
这是因为后向 JUMP 只有在任何编译器需要重复它已经翻译的某些代码时才会生成(for、while 循环......)。如果它踩到“新的”IF 语句,它将始终将条件 JMP 和生成的代码/字节码作为下一个指令。

另一方面,“奇怪的”编译器会产生负 IF 跳转。但这没有意义。为了对某个位置使用负 IF JMP,过去必须已经跳过了那个位置(通过正 JMP),因此无法在执行速度方面优化代码。

关于lua - 'if' 语句的 Lua 字节码可以向后跳转吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12831557/

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