3.20 標準モジュール dis

 

disモジュールは、バイトコードを逆アセンブルすることで、バイトコードの解析をサポートします。 パイソンアセンブラがないので、このモジュールがパイソンのアセンブラ言語を定義します。このモジュールが入力として受け取るバイトコードは、"Include/opcode.h"ファイル中で定義されていて、コンパイラやインタープリタで使用されます。

例: 関数myfuncを定義します。

def myfunc(alist):
    return len(alist)

myfunc()を逆アセンブルすると、次のようなコマンドを得ることができます。

>>> dis.dis(myfunc)
          0 SET_LINENO          1

          3 SET_LINENO          2
          6 LOAD_GLOBAL         0 (len)
          9 LOAD_FAST           0 (alist)
         12 CALL_FUNCTION       1
         15 RETURN_VALUE   
         16 LOAD_CONST          0 (None)
         19 RETURN_VALUE

disモジュールは、以下のような関数を定義します。

dis ([bytesource])
bytesourceオブジェクトを逆アセンブルします。bytesourceは、クラス、メソッド、関数、コードオブジェクトのいづれかを示しています。クラスの場合は、全てのメソッドを逆アセンブルします。 たった1個のコードシーケンスの場合は、バイトコード命令ごとに1行表示します。オブジェクトが指定されてない場合は、最後のトレースバックを逆アセンブルします。

distb ([tb])
トレースバックのスタックの先頭の関数を逆アセンブルします。最後のトレースバックが使われ、noneがあればパスされます。例外を引き起こす命令は、表示されます。

disassemble (code[, lasti])
コードオブジェクト(lastiが与えられた場合は最後の命令を表すコードオブジェクト)を逆アセンブルします。出力は以下のようなカラムに分けられます。

1.
"->"で指し示している、現在の命令
2.
">>"が付いた、ラベル付きの命令
3.
命令のアドレス
4.
オペレ−ションコード名
5.
オペレーションパラメーター
6.
カッコ内にパラメータの説明

パラメーターの説明は、ローカル変数名とグローバル変数名、定数値、branch targets、比較演算子を評価します。

disco (code[, lasti])
disassembleと同じです。タイプしたり、以前リリースされたパイソンと互換性を保つのに、より便利です。

opname
バイトコードを使って指し示すことができるオペレーション名のシーケンス

cmp_op
全ての比較演算の名前のシーケンス

hasconst
定数パラメータを持つバイトコードのシーケンス

hasname
名前で属性にアクセスするバイトコードのシーケンス

hasjrel
相対的なジャンプターゲットを持つバイトコードのシーケンス

hasjabs
絶対的なジャンプターゲットを持つバイトコードのシーケンス

haslocal
ローカル変数にアクセスするバイトコードのシーケンス

hascompare
論理演算のバイトコードのシーケンス


guido@python.org