動的コンパイル

動的コンパイル（どうてきコンパイル、英: Dynamic compilation）とは、
プログラミング言語の実装で用いられる、プログラムの性能を実行時に向上させるための手法である。この技術はSelf プログラミング言語を起源とており、これを用いる最もよく知られた言語は Java である。動的コンパイルはランタイムにのみ知ることができる情報による最適化を可能にする。

通例動的コンパイルを用いる実行環境は、プログラムを開始後最初の数分間は低速で実行し、その後コンパイルと再コンパイルが完了すると、高速に実行する。このように開始直後パフォーマンスが低いことにより、動的コンパイルが好ましくない状況も存在する。また動的コンパイルの大半の実装では、初回のコンパイル時に実行可能な最適化も実行時に更なるコンパイルが行われるまで遅延させるため、不要にプログラムの動作を遅延させてしまうことがある。ジャストインタイムコンパイル (JITコンパイル) は、動的コンパイルの形態の一つである。

密接な関連のある技術として、増分コンパイルがある。増分コンパイラは、POP-2、POP-11、MaclispなどのLispの一部、またMLプログラミング言語の少なくとも一つのバージョン (Poplog)
で用いられている。

増分コンパイルでは、対応するプログラミングのコンパイラが実行時環境の一部となっている必要がある。それゆえ、ソースコードは、端末や、ファイル、あるいは動作中のプログラムによって作成されるデータ構造からいつでも読み取り可能で、機械語コードや関数に変換ができ（同じ関数を置き換えることもできる）、即座にプログラムから利用可能になる。対話的な開発やテストの際のコンパイル速度への要求から、コンパイルされたコードは通常の「バッチ型コンパイラ」ほどの強い最適化は行われない。しかし、増分的にコンパイルされたプログラムは同じプログラムのインタプリタ版よりは高速に動作する。増分コンパイルはインタプリタ言語とコンパイル言語の双方の利点を備えている。移植性をもたらすため、一般的に増分コンパイラの動作は二段階に分かれることが望ましい。最初のコンパイルで何らかのプラットフォーム非依存の中間コードを生成し、次にこれをホストマシンの機械語コードにコンパイルする。上述の動的コンパイルとは異なり、増分コンパイルはプログラムが最初に動作した後に更なる最適化が行われることはない。

関連項目
トランスメタのプロセッサは、x86 コードを VLIW コードに動的にコンパイルする。
Dynamic recompilation

外部リンク
The UW Dynamic Compilation Project
Architecture Emulation through Dynamic Compilation
SCIRun
Article "Dynamic Compilation, Reflection, & Customizable Apps" by David B. Scofield and Eric Bergman-Terrell
Article "High-performance XML: Dynamic XPath expressions compilation" by Daniel Cazzulino
Article "A Survey of Adaptive Optimization in Virtual Machines" by Matthew R. Arnold, Stephen Fink, David P. Grove, Michael Hind, and Peter F. Sweeney

コンパイラ