v8エンジンと他の環境の、コンパイルの周り比較

node.jsにも使われているv8エンジンの速さの秘密は、主にコンパイル周りにあるらしい。
そもそもコンパイルの流れなどがよくわかっていなかったので調べてみた。
(対象の言語は自分の身近なもの+興味あるもの)

PHP

インタプリタ

一行ずつ、「解釈」→「中間コード生成」→「実行」。
※実行時には機械語で実行されるが、インタプリタの生成物では無い。
アクセラレータを導入すれば、中間コードはキャッシュするので速度の向上が見込める。

C言語

コンパイル

実行前にコンパイルし、「機械語」を生成。
実行時、ソースコードや中間コードへの処理も無いため、実行速度が速い。
メジャーなプログラミング言語系では基本的に最速。

Java

コンパイル(中間コード生成)で、インタプリタ実行 or JIT

実行前に「中間コード」を生成しておき、実行時にはVMがそれを実行。
中間コードはマシンに依存しないものなので、違うマシンに配布してもそのマシンのVMで実行可能。
処理系により、インタプリタでの実行、またはJITでの実行どちらも(または設定で変更)がある。

v8エンジン

■適応型コンパイル

JITインタプリタの利点を良いところ取りの「適応型コンパイル」。
JITのデメリットとなる「実行開始時のコンパイル時間」中は、
インタプリタを実行し、バックグラウンドで「JIT」的な処理を行う。
また、「JIT」の対象となるソースコードは一部のボトルネックとなりえるコードに絞ることで、
余分な最適化も行わない。



結局どの言語や環境でも、いろんな処理系があるようなので一概にはこれがあてはまるわけではないが、おおむねこんな感じらしい。