2012-10-11 66 views
6

我在寫一些可以讀取string.dump()函數產生的字節碼的Lua代碼。我假設(因爲它允許一些優化和較少的編碼),所有OP_JMP指令在用於if語句時都會向前增加指令指針。他們可以在技術上向後跳躍,因爲他們使用sBx值(可能是負值)。我只對標準Lua 5.1實現中的if語句的字節碼感興趣。'if'語句的Lua字節碼可以向後跳轉嗎?

我用chunkspy(awesome tool 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有負值或知道它們總是正值嗎?

+2

'luac -p -l'也給你一個字節碼列表。 – lhf

回答

5

簡短回答:IF語句不能產生負的JMP(在任何優化的編譯器上,獨立於語言)。 Lua的OP_JMP可以是負的for循環和goto語句(http://lua-users.org/wiki/GotoStatement

龍答: 這是因爲,一個落後JUMP只會被任何編譯器是否需要重複某些代碼,它已經轉化產生的事實( for,while循環..)。如果它在「新」IF語句上執行,它將始終將有條件的JMP和生成的代碼/字節碼作爲下一個指令。

另一方面,「奇怪的」編譯器可能會產生負IF跳轉。但是這沒有意義。爲了讓一個負的IF JMP到某個位置,必須已經跳過了過去的位置(通過一個肯定的JMP),所以它無法在執行速度方面優化代碼。

+0

謝謝,這是非常有用的知道! – Ryan