【読んだもの】Pythonは逐一解釈されるのか、それともコンパイルされるのか?(答えはどちらも)イエスだ。

Ned Batchelder: Is Python interpreted or compiled? Yes.

人々はコンパイル言語かインタプリタ(逐一解釈)言語か、という二分法にこだわる傾向があるが、現代の言語処理系はそんなに単純じゃないよね、という話。

ここで「コンパイル」はソースコード機械語(CPU命令セットの集まり)に変換すること、「インタプリタ」はソースから一度に一行読み込んではプログラムを実行するモノ。この単純な定義のもとタイトルのような質問が行われる、とされている。

Pythonにおいてはソースコードバイトコードに変換される。バイトコードの見かけはCPU命令セットのようだが、実際の実行は仮想マシンVM)によって行われるという点で異なる(仮想マシンはOS全体の機能をエミュレートせず、単純化したCPU命令実行環境を与えていると考えられる)。

Pythonではdisモジュールを使うとバイトコードを眺めることができる。byterunというPythonで書かれたバイトコードを実行するVMが存在する。これは教育目的だがソースを読んでみると面白いかもしれない。)

バイトコードに変換する言語といえばJavaがある。Javaコンパイル言語、Pythonインタプリタ言語と区別されるのはなにゆえか。Pythonではバイトコードへの変換は暗黙的に行われ、ユーザーがコンパイラを直接呼び出すことはなく、.py拡張子のファイルが単純に実行される。Javaはユーザーが明示的にコンパイラを呼び出し、ソースコードをクラスファイルにコンパイルする。

あとPythonの特徴としてREPLがあるというのがある。これは「コンパイルされる」言語にはあまりない特徴である。REPLでも暗黙的にバイトコードへの変換・実行が行われており、この暗黙性がPythonを「インタプリタ」たらしめている。

ただしJavaやCのような「コンパイルされる」言語がREPLを持てないのかというとそんなことはない。Javaはもともとバイトコードに変換する方法を取っていたが、いまはJust-In-Time(JIT)な手法で実行時に機械語コンパイルできる。このように考えると、コンパイル言語とインタプリタ言語の区別というのはもろいものであるように感じられる。

一つ留意すべきことは、プログラムがどのように実行されるかというのは、単に実装の話であって、プログラミング言語の特徴ではないということだ。上記Pythonに関する話はCPythonについてであり、たとえばPyPyのようなJITコンパイルされる方式の言語処理系も存在するわけである。

というわけでPythonが逐一解釈されるのかコンパイルされるのか?という疑問については、どちらもイエス。ただし世界はもっと複雑なものなのだ…という結論に落ち着く。