2012-10-11 8 views
6

私は、バイトコードを読むことができるLuaコードをstring.dump()関数で作成しています。私は、いくつかの最適化とより少ないコーディングを可能にするため、すべてのOP_JMP命令がif文のために使用されたときに命令ポインタを転送することを前提としています。技術的には、sBx値(負でもよい)を使用するため、後方にジャンプすることができます。私は標準のLua 5.1実装のif文のバイトコードにのみ興味があります。'if'文が後方にジャンプするLuaバイトコードはありますか?

私はchunkspy(awesome tool btw)を使用して、いくつかのサンプルのバイトコードを調べました。ここで

があれば、基本的な文です:私はLua source codeで答えを探してみましたが、それだけで終わった

[08] jmp 4; to [13] 
[12] jmp 11; to [24] 
[16] jmp 4; to [21] 
[20] jmp 3; to [24] 

a, b = 1, 2 
if a == b then 
    print '=' 
elseif a < b then 
    print '<' 
else 
    print '>' 
end 

それは否定されているいずれも4つのジャンプを生成します混乱している(私はそれをつかむ時間を費やしていたなら、私はそれがスーパーエレガントなコードだと確信している)。

luaのOP_JMP命令がsBxに対して負の値を持つ「if」ステートメントのケースを知っているか、または常に正の値であるかを知っていますか?

+2

'luac -p -l'はバイトコードのリストを提供します。 – lhf

答えて

5

短い答え:IFステートメントは負のJMPを生成できません(最適化されたコンパイラでは、langauageに依存しません)。 これは、それがすでに翻訳された特定のコードを繰り返す必要がある場合、後方JUMPのみ任意のコンパイラによって生成されるという事実によるものである(:LuaのOP_JMPは、ループ文とgoto文(http://lua-users.org/wiki/GotoStatement

ロング回答について陰性であることができfor、whileループ..)。 "新しい" IFステートメントを実行すると、条件付きJMPとその結果のコード/バイトコードが次のインストラクションとして常に置かれます。

"奇妙な"コンパイラは、負のIFジャンプを生成する可能性があります。しかし、それは理にかなっていません。特定の場所に負のIF JMPを持たせるには、過去のその場所を(正のJMPによって)スキップしていなければならないため、実行速度に関して最適化されたコードは使用できません。

+0

ありがとう、それは知っていると非常に便利です! – Ryan

関連する問題