我正在编写一些可以读取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有负值或者知道它们是否总是正值?
答案 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),所以它不能在执行速度方面优化代码。