32.12。 dis —Pythonバイトコードの逆アセンブラ
ソースコード: :source: `Lib / dis.py`
dis モジュールは、CPython bytecode を逆アセンブルすることで分析をサポートします。 このモジュールが入力として受け取るCPythonバイトコードは、ファイルInclude/opcode.h
で定義され、コンパイラーとインタープリターによって使用されます。
例:関数myfunc()
が与えられた場合:
def myfunc(alist):
return len(alist)
次のコマンドを使用して、myfunc()
の逆アセンブリを取得できます。
>>> dis.dis(myfunc)
2 0 LOAD_GLOBAL 0 (len)
3 LOAD_FAST 0 (alist)
6 CALL_FUNCTION 1
9 RETURN_VALUE
(「2」は行番号です)。
dis モジュールは、次の関数と定数を定義します。
- dis.dis([bytesource])
- bytesource オブジェクトを逆アセンブルします。 bytesource は、モジュール、クラス、メソッド、関数、またはコードオブジェクトのいずれかを示すことができます。 モジュールの場合、すべての関数を分解します。 クラスの場合、すべてのメソッドを分解します。 単一のコードシーケンスの場合、バイトコード命令ごとに1行を出力します。 オブジェクトが指定されていない場合は、最後のトレースバックを逆アセンブルします。
- dis.distb([tb])
- 何も渡されなかった場合は最後のトレースバックを使用して、トレースバックのスタックの最上位関数を逆アセンブルします。 例外の原因となった命令が表示されます。
- dis.disassemble(code[, lasti])
コードオブジェクトを逆アセンブルし、 lasti が指定されている場合は最後の命令を示します。 出力は次の列に分割されます。
各行の最初の命令の行番号
-->
として示される現在の命令、>>
で示される、ラベル付きの命令、命令のアドレス、
操作コード名、
動作パラメータ、および
括弧内のパラメーターの解釈。
パラメータの解釈は、ローカルおよびグローバル変数名、定数値、分岐ターゲット、および比較演算子を認識します。
- dis.disco(code[, lasti])
- disassemble()の同義語。 入力する方が便利で、以前のPythonリリースとの互換性のために保持されています。
- dis.findlinestarts(code)
- このジェネレーター関数は、コードオブジェクト code の
co_firstlineno
およびco_lnotab
属性を使用して、ソースコードの行の始まりであるオフセットを見つけます。 それらは(offset, lineno)
ペアとして生成されます。
- dis.findlabels(code)
- ジャンプターゲットであるコードオブジェクト code 内のすべてのオフセットを検出し、これらのオフセットのリストを返します。
- dis.opname
- バイトコードを使用して索引付け可能な操作名のシーケンス。
- dis.opmap
- オペレーション名をバイトコードにマッピングする辞書。
- dis.cmp_op
- すべての比較操作名のシーケンス。
- dis.hasconst
- 定数にアクセスするバイトコードのシーケンス。
- dis.hasfree
- 自由変数にアクセスするバイトコードのシーケンス。
- dis.hasname
- 名前で属性にアクセスするバイトコードのシーケンス。
- dis.hasjrel
- 相対ジャンプターゲットを持つバイトコードのシーケンス。
- dis.hasjabs
- 絶対ジャンプターゲットを持つバイトコードのシーケンス。
- dis.haslocal
- ローカル変数にアクセスするバイトコードのシーケンス。
- dis.hascompare
- ブール演算のバイトコードのシーケンス。
32.12.1。 Pythonバイトコード命令
Pythonコンパイラは現在、次のバイトコード命令を生成します。
単項演算はスタックの最上位になり、演算を適用して、結果をスタックにプッシュバックします。
二項演算は、スタックの最上位(TOS)と2番目に上位のスタック項目(TOS1)をスタックから削除します。 それらは操作を実行し、結果をスタックに戻します。
インプレース操作は、TOSとTOS1を削除し、結果をスタックにプッシュバックするという点でバイナリ操作に似ていますが、TOS1がサポートしている場合、操作はインプレースで実行され、結果のTOSは次のようになります(ただし、 )オリジナルのTOS1。
スライスオペコードは最大3つのパラメータを取ります。
スライスの割り当てには、追加のパラメーターも必要です。 他のステートメントと同様に、彼らはスタックに何も置きません。
その他のオペコード。
次のすべてのオペコードは引数を想定しています。 引数は2バイトで、より重要なバイトが最後になります。