JITコンパイラとは
JITコンパイラとは、Just-In-Time Compilerの略で実行時コンパイラとも呼ばれる。JITコンパイラとは、その名のとおり、ソースコードを事前にコンパイルするのではなく、プログラムが実行される際にコンパイルするためのコンパイラである。
JITコンパイラは、JVMや.Netフレームワークなどに搭載されておりJavaやC#、Visual Basicなどでシステム開発を行う場合には、その動作を理解しておくことが望ましい。また、最近ではNumbaなどPython用のJITコンパイラライブラリなども登場している。
JITコンパイラ登場の背景
JITコンパイラの目的は、アプリケーションの性能(速度)を向上させることである。話を先に進める前に、なぜ、JITコンパイラが登場したのかということに触れておきたい。
Javaを例に挙げると、言語としての思想の一つに、一度作成したコードをプラットフォームに依存せず使いまわしたい。というものがある。従来のコンパイラでは、ソースコードからバイナリコード(機械語)を生成していたが、これはプラットフォームへの依存度が高く、別のプラットフォームで利用するためには、その環境用のコンパイラで再度コンパイルしなおす必要があった。
図. バイナリコードはプラットフォームが変わったら再コンパイルが必要
そのため、Javaではソースコードから直接バイナリコードを生成することはせず、バイトコードと呼ばれる中間コードを生成する。バイトコードはJVMという仮想マシン上に読み込まれ、JVMがプラットフォームの違いを吸収することで異なるプラットフォーム上で同一のバイトコードを利用することが可能となった。
また、MicrosoftのC#やVisual Basic .NET(VB7以降)においてもMSILコードという中間コードを生成し、.Netフレームワーク上で中間コードを解析して実行することでプラットフォームの違いを吸収している。
図. 中間コードとフレームワークでプラットフォームの違いを吸収
例として、Javaにおいては開発者はソースコードからバイトコードを生成し、バイトコードを配布する。バイトコードの利用者はJVMがプラットフォームの違いを吸収してくれるため、実行するプラットフォームを意識せずにバイトコードを利用することができる。
図. JavaではJVMがプラットフォームの違いを吸収している
こうしてプラットフォーム毎にソースコードをコンパイルしなおす手間はなくなったが、中間コードは実行時にフレームワークによって都度解析されながら実行されるため、事前コンパイルと比較して繰り返し処理などの実行には時間がかかるという問題があった。
この問題を解消するために登場したのがJITコンパイラである。JITコンパイラはJVMや.Netフレームワークなどフレームワークの機構に搭載され、複雑な処理を実行時にコンパイルすることで速度を向上させることを可能とした。
JITコンパイラのメリット
JITコンパイラのメリットは、これまで見てきたように中間コードを実行時にコンパイルすることによる性能の向上である。
中間コードとして一部をコンパイル済みであるは言え、全てを事前コンパイルされたバイナリコードと比較するとJITコンパイラは速度が遅い場合も有るが、JITコンパイラならではの利点としてプラットフォームにおける実行の情報をもとにコンパイル方法の最適化が可能な点である。
例えば、DBレコードの件数分だけ繰り返し処理を行う、という場合のコンパイル方式はレコードが数件しか存在しない場合と数百万件単位で存在する場合で異なる。こうしたシステムの状況に応じてコンパイル方式を変え、最適な実行形式をとることができるという点も、JITコンパイラのメリットである。
[Java HotSpot VM]
コードによっては、JITコンパイラによってコンパイルするよりも、逐次実行したほうが処理が速い場合がある。繰り返し処理が登場しないプログラムなどがその例だ。
Sun JDK(現在はOracle JDK)/OpenJDKで提供されているHotSpotという技術は、そうした条件を鑑みて逐次実行する箇所とコンパイルする箇所を判断する技術である。HotSpotは、バイトコードの中から繰り返し処理やコンパイルしたほうが性能が向上する部分を見つけだし、その部分だけをバイナリコードに変換してくれる。
HotSpotにより、バイトコードを動的に最適化し、さらに高速な実行を可能としている。
図. HotSpot技術によりJITコンパイラを利用するか、インタープリタで処理するか選択
Oracle JRockitやIBM J9といった技術も、HotSpotと同様の機能を提供している。
まとめ
- JITコンパイラは実行時に中間コードをバイナリコード(機械語)に変換するためのもの
- JITコンパイラの目的はプログラム実行を高速化すること
- HotSpotなどバイトコードを動的に最適化して実行するための技術も存在する
関連記事:
コメントを残す