可以用“if”语句的Lua字节码向后跳转吗?

时间:2012-10-11 03:04:07

标签: lua bytecode

我正在编写一些可以读取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 source code中寻找答案,但它最终让人感到困惑(如果我花时间去处理它,我确定它是超级优雅的代码)。

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

1 个答案:

答案 0 :(得分:5)

简短回答:IF语句无法产生负面JMP (在任何优化的编译器上,与langauage无关)。对于循环和goto语句(http://lua-users.org/wiki/GotoStatement

,Lua OP_JMP可能是负数

长答案: 这是因为如果需要重复已经翻译的某些代码(for,while循环...),则只有任何编译器才会生成后向JUMP。如果它采取了新的&#34; IF语句总是将条件JMP和结果代码/字节码作为下一个指令。

另一方面a&#34;奇怪&#34;编译器可以产生负IF跳转。但这没有意义。为了将IF JMP放到某个位置,过去必须已经跳过了那个位置(通过正JMP),所以它不能在执行速度方面优化代码。