# 10 `dis` -- Pythonバイトコードの逆アセンブラ

`dis`モジュールはPythonバイトコードを逆アセンブルしてバイトコードの解析を助けます。Pythonアセンブラがないため、このモジュールがPythonアセンブリ言語を定義しています。このモジュールが入力として受け取るPythonバイトコードはファイル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`( | [bytesource])

  bytesourceオブジェクトを逆アセンブルします。bytesourceはモジュール、クラス、関数、あるいはコードオブジェクトのいずれかを示します。モジュールに対しては、すべての関数を逆アセンブルします。クラスに対しては、すべてのメソッドを逆アセンブルします。単一のコードシーケンスに対しては、バイトコード命令ごとに一行をプリントします。オブジェクトが与えられない場合は、最後のトレースバックを逆アセンブルします。

`distb`( | [tb])

  トレースバックのスタックの先頭の関数を逆アセンブルします。Noneが渡された場合は最後のトレースバックを使います。例外を引き起こした命令が表示されます。

`disassemble`( | code[, lasti])

  コードオブジェクトを逆アセンブルします。lastiが与えられた場合は、最後の命令を示します。出力は次のようなカラムに分割されます:

  1. 各行の最初の命令に対する行番号。
  2. 現在の命令。"`-->`"として示されます。
  3. ラベル付けされた命令。"`»`"とともに表示されます。
  4. the address of the instruction,
  5. 命令のアドレス。
  6. 演算コード名。
  7. 演算パラメータ。
  8. 括弧の中のパラメータのインタプリテーション。

  パラメータインタープリテーションはローカルおよびグルーバル変数名、定数値、分岐目標、そして比較演算子を認識します。

`disco`( | code[, lasti])

  disassembleの別名。よりタイプしやすく、以前のPythonリリースと互換性があります。

`opname`
  演算名。一連のバイトコードを使ってインデキシングできます。

`opmap`
  バイトコードからオペレーション名へのマッピング辞書。

`cmp_op`
  すべての比較演算名。

`hasconst`
  定数パラメータを持つ一連のバイトコード。

`hasfree`
  自由変数にアクセスする一連のバイトコード。

`hasname`
  名前によって属性にアクセスする一連のバイトコード。

`hasjrel`
  相対ジャンプターゲットをもつ一連のバイトコード。

`hasjabs`
  絶対ジャンプターゲットをもつ一連のバイトコード。

`haslocal`
  ローカル変数にアクセスする一連のバイトコード。

`hascompare`
  ブール演算の一連のバイトコード。