6

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

我使用chunkspy(btw 很棒的工具)来查看一些样本的字节码。

这是一个基本的 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 源代码中寻找答案,但结果令人困惑(如果我花时间掌握它,我相信它是超级优雅的代码)。

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

4

1 回答 1

5

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

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

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

于 2012-10-12T18:24:33.960 回答