PyPyのしくみ(仮)

前回:PyPyを試してみた - 超ウィザード級ハッカーのたのしみ

PyPyを試してみたら、爆速だった。この謎を解明すべく論文を読んでみた。あまり理解できないのだが、現状理解できたところまでメモする。頭が整理できていないので、まとまっていない。


PyPyは以下の2つのコンポーネントから成り立っている。

インタープリタPythonインタープリタで、RPython(Restricted Python)という機能が制限されたPythonで書かれている。つまり、PythonPythonを実行するというよくわからないことをしていて、それがPyPyの目的である。

トランスレータJITコンパイラを搭載したRPythonのインタープリタである。RPythonで他の動的言語インタープリタを書けば、トランスレータで高速実行できる。

つまり、Pythonコード -> RPythonコード -> JITコンパイラという順にPython言語を低レベルに落として行っている。

しかし、それだとJavaでできたPythonインタープリタJPythonJythonより速い理由がよくわからなくなる。JPythonJythonも、Pythonコード -> Javaバイトコード -> JITコンパイラ(JVM)と言う風に順に低レベルに落としていって実行しているはずだ。

おそらく、PythonコードからJavaバイトコードの乖離が大きいのが問題で、JavaからだとPythonコードの型の推測はできない。PyPyはRPythonという型が推測しやすいけど、型がないという微妙な形の中間言語を介していることで、JITコンパイラの最適化をうまいことうまいことやっているのがすごいのだろう。

RPythonを実行する際の、型推測が工夫されているので非常に高速なのだと思われるが、具体的な手法はまだ理解できていない。

参考