PR

最初の実行でバイナリ・コードに変換

図7●適応型コンパイラの概念。
実行時にボトルネックとなっている部分を見つけ出し,そこをインラインに展開してコンパイルする。これにより,メソッド呼び出しのオーバヘッドを減らすとともに,より効果的な最適化を実現できる

 次の課題が仮想マシンの実装方式である。初期のJava仮想マシンの性能を見ればわかるように,中間言語方式を採用しても性能はそれほど高くはない。そこでJavaや.NET Frameworkで採用しているのが,JIT(ジャスト・イン・タイム)コンパイラという方式である。最初にプログラムを実行する時点で,ホスト環境のCPUに合ったバイナリ・コードに変換する。こうすることにより,あらかじめコンパイルしておく場合の約半分程度の性能にまで引き上げている。

 JITコンパイラは当初,スタティックにコンパイルしたプログラムの約8割程度の性能が出ると期待されていた。しかしそこまで到達するのはなかなか難しい。そこで考案されたのが適応コンパイル(Adaptive compilation)という技術である。米Sun Microsystems社が盛り込んだ「Hot Spot」技術がこれにあたる。

 オブジェクト指向言語の場合,C言語などに比べてメソッド呼び出しが頻繁に発生する。データをオブジェクトとして独立性を高めたために,データを変えるのにいちいちおうかがいをたてなければならないからだ。メソッド呼び出し(関数呼び出しと言い換えても構わない)があるとバイナリ・レベルではサブルーチン・コールのコードになり,最適化処理はその前後で途絶えてしまう。つまり,最適化を施せるのは,メソッド呼び出しとメソッド呼び出しの間なのである。このことが,オブジェクト指向言語における最適化の難しさだ。

 一方JITコンパイラは,実行時にコンパイルを実行するので,スタティックなコンパイルではできない最適化が可能になる。実行時にどのルーチンを実行しているかを監視しておき,頻繁に呼び出される部分(この部分を“Hot Spot”と呼ぶ)をサブルーチン呼び出しの形でコード化するのではなく,インラインに(同じ場所に続けて直線的に)コードを展開する(図7[拡大表示])。これによりまずサブルーチン・コールのオーバヘッドを小さくする。さらに展開した状態で最適化をかけることにより,性能の向上も期待できる。

 ただしこの方式から明らかなように,最適化してくれない部分に関してはむしろオーバヘッドが大きくなる。クライアント用アプリケーションなど,操作によって処理がまちまちになる部分に関しては,あまり効果が期待できない。このためSunは当初,Hot Spot技術をサーバ用のJava仮想マシンにのみ実装してきた。Java2 Platform,Standard Edition 1.3からクライアント用にも使われるようになった。

「Javaでもスクリプトを書けるって,聞いたことがあります」
「Webアプリケーション開発用に,JavaServer Pages(JSP)というのがあるよ。これも最後はJavaの実行モデルに落ち着くんだけどね。書き手からするとスクリプトだね」
「スクリプトって,いろいろあるんですね」
「そうだね。個人的には,日本発のスクリプト言語Rubyがどこまで広がるか,期待してるんだ」

(北郷 達郎、八木 玲子)