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

Rya*_*yan 6 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
Run Code Online (Sandbox Code Playgroud)

它产生四次跳跃,其中没有一次是负的:

[08] jmp 4; to [13]
[12] jmp 11; to [24]
[16] jmp 4; to [21]
[20] jmp 3; to [24]
Run Code Online (Sandbox Code Playgroud)

我尝试在Lua源代码中寻找答案,但它最终让人感到困惑(我确信这是超级优雅的代码,如果我花时间去掌握它).

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

msc*_*ock 5

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

长答案:这是因为如果需要重复已经翻译过的某些代码(for,while循环......),后向JUMP只会由任何编译器生成.如果它采用"新"IF语句,它将始终将条件JMP和结果代码/字节码作为下一个指令.

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