RPythonとPyPyとJITについてのメモ

始めに

これはインターネットアーカイブのためのメモです。

中身

Pythonインタプリタ by Pythonを記述する。 そうすると、RPythonのプログラムが書けるようになる。 RPythonでPythonインタプリタを作成することができる。 できたものは、「RPythonによるPythonインタプリタ……で、それはPythonで書かれている」ということになる。これ全体をFという関数とする。 そうすると、Fに対してPythonコードとinputを持ってくれば実行ができる。

ここもう少し一般化して、RPythonのインタプリタ by Pythonの役割を考える。

例えば、RPythonによるhoge言語インタプリタを持ってくるとする。 そうすると、RPythonのインタプリタ by Pythonに対して、RPythonによるhoge言語インタプリタと、hoge言語プログラム、inputを以てくれば、outputが得られる。 ここで関数の部分適用を考える。 つまり、RPythonのインタプリタ by Pythonに対して、RPythonによるhoge言語インタプリタを与えた状態を考える。 残り必要なのは、hoge言語プログラムとinputであり、これはちょうどコンパイラの動作と同じである。 (コンパイラも、hoge言語プログラムを与えてできたものに、入力を与えれば実行される。) つまり、RPythonのインタプリタ by Pythonというのはインタプリタ by RPythonを与えれば、コンパイラを生成してくれる何かになる。 ただ、実際はRPythonのインタプリタ by Pythonというのは、hoge言語プログラムだけ部分適用みたいなことをできないので、実際はインタプリタ生成みたいなものである。

PyPyとJITの話に移る。 Python処理系をRPythonで記述することを考える。(これがPyPyの実態ともいえる?) RPythonで書かれた処理系のプログラムは、順番にPythonプログラムと入力をちょっとずつ受け取って評価するみたいな処理になるはずである。 ここでRPythonのインタプリタ by Pythonが役に立つ。RPythonのインタプリタ by Pythonに対して、JITコンパイルの機能を与える。そうすると、Python処理系をRPythonで記述し、RPythonのインタプリタ by Python上で動かせば自動的にJITコンパイルの機能が備わることになる。 (RPythonのインタプリタ by Pythonにとっては、RPythonプログラムと入力としか見えない。) これの何がうれしいかというと、 PythonJITコンパイルを考える必要がなくなりRPythonのJITをすればよい。 RPythonはどこででも動く。 処理系を書く側はRPythonでインタプリタを書けば自動的にJITコンパイルの機能を持てる。 ということがある。

まとめ

PyPyは、RPythonで書かれたPython処理系だよ。 RPythonはPythonのsubsetでインタプリタを記述する言語であり、RPythonの処理系にはJITの機能があるよ。

参考

これが良い。 Motivating JIT Compiler Generation — RPython Documentation

これもよい。 Partial Evaluation, Futamura Projection And Their Applications · GitHub

これは図がよくわからない。 RPythonについて軽く | κeenのHappy Hacκing Blog