6

string.dump() 関数によって生成されたバイトコードを読み取ることができる Lua コードをいくつか書いています。すべての OP_JMP 命令は、if ステートメントに使用されたときに命令ポインターを前方に増加させると想定しています (最適化をいくつか行い、コーディングを減らすことができるため)。sBx 値 (負になる可能性があります) を使用するため、技術的には逆方向にジャンプできます。標準の Lua 5.1 実装の if ステートメントのバイトコードにのみ関心があります。

いくつかのサンプルのバイトコードを調べるために、 chunkspy (素晴らしいツール)を使用しました。

以下は、基本的な if ステートメントです。

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

4 つのジャンプが生成されますが、いずれも負ではありません。

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

Luaのソース コードで答えを探してみましたが、混乱するだけでした (時間をかけて理解すれば、非常にエレガントなコードだと確信しています)。

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

4

1 に答える 1

5

簡単な答え: IF ステートメントは負の JMP を生成できません(最適化されたコンパイラでは、言語に依存しません)。Lua OP_JMP は、ループおよび goto ステートメントに対して負になることがあります ( http://lua-users.org/wiki/GotoStatement )

長い回答: これは、既に変換された特定のコード (for、while ループなど) を繰り返す必要がある場合にのみ、コンパイラによって後方 JUMP が生成されるという事実によるものです。「新しい」IFステートメントを踏む場合、常に条件付きJMPと結果のコード/バイトコードを次の命令として配置します。

一方、「奇妙な」コンパイラは、負の IF ジャンプを生成する可能性があります。しかし、それでは意味がありません。特定の場所への負の IF JMP を使用するには、過去にその場所を (正の JMP によって) スキップしている必要があるため、実行速度の点でコードを最適化することはできません。

于 2012-10-12T18:24:33.960 に答える