初めてのPython(2章)

Pythonの実行モデルは以下のようになっている。

  1. インタプリタソースコードバイトコードに変換
  2. バイトコードVMで実行

上のモデルはCPython(ANSI Cによる実装)のもの。
Pythonにはその他にもバリエーションがある(*1)。

(*1) Wikipedia Python

バイトコード

ソースコード機械語の中間に位置するコードで、プラットフォームに依存しない。
ソースコードと比べて、実行速度が速い。

コードに変更が無ければ、コンパイルは1回のみで、次回以降は.pycファイルを直接読み込んで使用する。
コンパイルは対象となるソースコード全ファイルに行われるが、.pycとして保存されるのはインポートされるファイルのみ
トップレベルソースのバイトコードは保存されない(実行中はメモリ内に存在)

Python Virtual Machine

Pythonのプログラムを実行するプログラム。
ランタイムエンジンで、入力として与えられたバイトコードを1行ずつ実行する。

CPython

オリジナルのPythonで、一般的にPythonといえばこれ。

Jython

コンパイルするとJavaバイトコードに変換し、JavaのVirtual Machineで実行するモデルを採用している。
CPythonと比べて実行速度や堅牢性は劣る。
Pythonのコードで書いてJavaアプリを作成することができ、Javaのフロントエンドを作るために使用される。

IronPython

実行モデルはバイトコード/実行環境が .NET 対応になったもの
.NET環境に依存するため、移植性はなくなるが、.NET Framework のライブラリなどを使える。

実行最適化

機械語を使って実行速度を上げるやり方。
ソース理解を目的とした今の自分だと使うことはないだろうなぁ。

実行中にバイトコード機械語に変換するPsyco(Just In Timeコンパイラ)、その後継のPyPy(*2)、
ソースコードC++のソースに変換し、C++コンパイラを通して機械語にして実行するShedskin C++トランスレータなどがある
(*2) Wikipedia Psyco

フローズンバイナリ

バイトコードとPVMをひとまとめにしたもので、プログラムをパッケージングし提供する時に使う。
実行最適化同様、今の自分は使わないだろう。

作成時に使うツールは、

  • freeze(最初に作られた)
  • py2exe(windows向けexeを作る)
  • PyInstaller(Linux/UNIXでも使えるものを作る)