3.20.1 バイトコード命令

パイソンコンパイラは、一般的に以下のようなバイトコード命令を作ります。

STOP_CODE
コードの終わりをコンパイラに示します。これは、インタプリタでは使われません。

POP_TOP
スタックの先頭アイテム(TOS)を取り除きます。

ROT_TWO
スタックの先頭と2番目のアイテムを交換します。

ROT_THREE
スタックの2番目と3番目のアイテムを1つ引き上げ、1番目のアイテムを3番目にします。

DUP_TOP
スタックの先頭アイテムのリファレンスをコピーします。

Unaryオペレーションは、スタックの先頭アイテムを受け取り、オペレーションを実行し、結果をスタックの最後にセットします。

UNARY_POSITIVE
TOS = +TOSを実行します。

UNARY_NEG
TOS = -TOSを実行します。

UNARY_NOT
TOS = not TOSを実行します。

UNARY_CONVERT
TOS = `TOS`を実行します。

UNARY_INVERT
TOS = TOSを実行します。

Binaryオペレーションは、スタックの先頭アイテム(TOS)と2番目のアイテム(TOS1)をスタックから取り除きます。オペレーションを実行し、結果をスタックの最後にセットします。

BINARY_POWER
TOS = TOS1 ** TOSを実行します。

BINARY_MULTIPLY
TOS = TOS1 * TOSを実行します。

BINARY_DIVIDE
TOS = TOS1 / TOSを実行します。

BINARY_MODULO
TOS = TOS1 % TOSを実行します。

BINARY_ADD
TOS = TOS1 + TOSを実行します。

BINARY_SUBTRACT
TOS = TOS1 - TOSを実行します。

BINARY_SUBSCR
TOS = TOS1[TOS]を実行します。

BINARY_LSHIFT
TOS = TOS1 << TOSを実行します。

BINARY_RSHIFT
TOS = TOS1 >> TOSを実行します。

BINARY_AND
TOS = TOS1 and TOSを実行します。

BINARY_XOR
TOS = TOS1 ^ TOSを実行します。

BINARY_OR
TOS = TOS1 or TOSを実行します。

sliceオプコードは、パラメーターを3つまで受け取ります。

SLICE+0
TOS = TOS[:]を実行します。

SLICE+1
TOS = TOS1[TOS:]を実行します。

SLICE+2
TOS = TOS1[:TOS1]を実行します。

SLICE+3
TOS = TOS2[TOS1:TOS]を実行します。

Slice assignment needs even an additional parameter. どの文も、スタックに何も追加しません。

STORE_SLICE+0
TOS[:] = TOS1を実行します。

STORE_SLICE+1
TOS1[TOS:] = TOS2を実行します。

STORE_SLICE+2
TOS1[:TOS] = TOS2を実行します。

STORE_SLICE+3
TOS2[TOS1:TOS] = TOS3を実行します。

DELETE_SLICE+0
del TOS[:]を実行します。

DELETE_SLICE+1
del TOS1[TOS:]を実行します。

DELETE_SLICE+2
del TOS1[:TOS]を実行します。

DELETE_SLICE+3
del TOS2[TOS1:TOS]を実行します。

STORE_SUBSCR
TOS1[TOS] = TOS2を実行します。

DELETE_SUBSCR
del TOS1[TOS]を実行します。

PRINT_EXPR
対話型モードでは、expression文を実行します。TOSは、スタックから取り除かれ、表示されます。対話型モードでないときは、expression文はPOP_STACKで終了します。

PRINT_ITEM
TOSを表示します。print文の各アイテムごとに、この命令が1つあります。

PRINT_NEWLINE
sys.stdoutに新しい行を表示します。もし文がコンマで終わっていなければ、プリント文の最後のオペレーションとして作られます。

BREAK_LOOP
break文によってループを終了します。

LOAD_LOCALS
Pushes a reference to the locals of the current scope on the stack. This is used in the code for a class definition: After the class body is evaluated, the locals are passed to the class definition.

RETURN_VALUE
関数の呼び出し先に、TOSを返します。

EXEC_STMT
exec TOS2,TOS1,TOSを実行します。コンパイラは、足りないパラメーターをNoneでうめます。

POP_BLOCK
ブロックスタックから1ブロック取り除きます。フレームごとに、ネスト化したループやtry節のようなブロックのスタックがあります。

END_FINALLY
最終ブロックを終了します。The interpreter recalls whether the exception has to be re-raised, or whether the function returns, and continues with the outer-next block.

BUILD_CLASS
新しいクラスオブジェクトを作成します。TOSはメソッドのディクショナリで、TOS1は基本クラスの名前のタプルで、TOS2はクラス名です。

以下の全てのopcodesは引き数を必要とします。An argument is two bytes, with the more significant byte last.

STORE_NAME    namei
name = TOSを実行します。. namei is the index of name in the attribute co_names of the code object. コンパイラは、STORE_LOCALや可能ならSTORE_GLOBALを使おうとします。

DELETE_NAME    namei
del nameを実行します。nameiはlコードオブジェクトのco_names属性のインデックスです。

UNPACK_TUPLE    count
Unpacks TOS into count individual values, which are put onto the stack right-to-left.

UNPACK_LIST    count
Unpacks TOS into count individual values.

STORE_ATTR    namei
TOS.name = TOS1を実行します。nameiは、co_namesの名前のインデックスです。

DELETE_ATTR    namei
del TOS.nameを実行します。nameiは、co_namesのインデックスとして使用されます。

STORE_GLOBAL    namei
グローバルとして名前をセットするSTORE_NAMEとして処理されます。

DELETE_GLOBAL    namei
グローバル名を削除するDELETE_NAMEとして処理されます。

LOAD_CONST    consti
スタックに、"co_consts[consti]"をプッシュします。

LOAD_NAME    namei
スタックに、"co_names[namei]"に関連した値をプッシュします。

BUILD_TUPLE    count
Creates a tuple consuming count items from the stack, and pushes the resulting tuple onto the stack.

BUILD_LIST    count
リストを作成するBUILD_TUPLEとして処理されます。

BUILD_MAP    zero
スタックに空のディクショナリオブジェクトをプッシュします。引き数は無視され、コンパイラによって0にセットされます。

LOAD_ATTR    namei
TOSをgetattr(TOS,co_names[namei]で置き換えます。

COMPARE_OP    opname
論理演算を行います。オペレーション名は、cmp_op[opname]です。

IMPORT_NAME    namei
co_names[namei]モジュールをインポートします。モジュールオブジェクトは、スタックにプッシュされます。現在のネームスペースは影響を受けません。 : for a proper import statement, a subsequent STORE_FAST instruction modifies the name space.

IMPORT_FROM    namei
Imports the attribute co_names[namei]. インポートするモジュールは、TOSにありそのまま残ります。

JUMP_FORWARD    delta
バイトコードカウンターに、deltaを追加します。

JUMP_IF_TRUE    delta
TOSがtrueなら、バイトコードカウンターに、deltaを追加します。TOSは、スタック上に残ります。

JUMP_IF_FALSE    delta
TOSがfalseなら、バイトコードカウンターに、deltaを追加します。TOSは変化しません。

JUMP_ABSOLUTE    target
バイトコードカウンターに、targetをセットします。

FOR_LOOP    delta
Iterate over a sequence. TOS is the current index, TOS1 the sequence. First, the next element is computed. If the sequence is exhausted, increment byte code counter by delta. Otherwise, push the sequence, the incremented counter, and the current item onto the stack.

LOAD_GLOBAL    namei
グローバルco_names[namei]をスタック上にロードします。

SETUP_LOOP    delta
Pushes a block for a loop onto the block stack. The block spans from the current instruction with a size of delta bytes.

SETUP_EXCEPT    delta
Pushes a try block from a try-except clause onto the block stack. delta points to the first except block.

SETUP_FINALLY    delta
Pushes a try block from a try-except clause onto the block stack. delta points to the finally block.

LOAD_FAST    var_num
スタックに、ローカルco_varnames[var_num]の参照をプッシュします。

STORE_FAST    var_num
TOSをローカルco_varnames[var_num]にセットします。

DELETE_FAST    var_num
ローカルco_varnames[var_num]を削除します。

SET_LINE_NO    lineno
現在の行数を、linenoにセットします。

RAISE_VARARGS    argc
例外を発生させます。argcは、raise文へのパラメ−タ−数を表し、1〜3の値をとります。ハンドラは、TOSを例外として、TOS1をパラメーターとして、TOS2をトレースバックとして見つけます。

CALL_FUNCTION    argc
関数を呼び出します。argcのローバイトはpositional parametersの数を、ハイバイトはキーワードパラメーターの数を表します。スタック上では、オプコードは、はじめにキーワードパラメーターを見つけます。書くキーワードごとに、値はキーの上にあります。キーワードパラメータの下に、positional parametersが、最も右のパラメーターを上にして、スタック上にあります。パラメーターの下に、呼び出される関数オブジェクトがスタック上にあります。

MAKE_FUNCTION    argc
スタックに新しい関数オブジェクトをプッシュします。TOSは関数に関連したコードです。関数オブジェクトは、TOSの下にあるargcデフォルトパラメーターを持つように定義されています。

BUILD_SLICE    argc
スタックにスライスオブジェクトをプッシュします。argcは2または3です。2の場合はslice(TOS1, TOS)がプッシュされ、3の場合はslice(TOS2, TOS1, TOS)がプッシュされます。組み込み関数slice() を参照して下さい。

guido@python.org