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