プログラムの実行
一般的な概念
コード
トレーシング実行時コンパイル(トレーシングじっこうじコンパイル、トレーシングJIT、英: Tracing just-in-time compilation)は、プログラムの実行を最適化するために、実行時(runtime)に仮想マシンが用いる技術の一つ。頻繁に実行される演算の並びを記録し、それをネイティブコードにコンパイルしてから実行する。通常の実行時コンパイラ(just-in-time compiler、JIT)はメソッド毎にこれを行っており、この点が異なる。 JITコンパイルは実行時にプログラムの一部を機械語にコンパイルすることでプログラムを高速に実行させる技術である。コンパイル対象の範囲によってJITコンパイラを分類すると、メソッド単位を基本とするJITコンパイラは一度に一つのメソッドを機械語に変換するが、トレーシングJITは頻繁に実行されるループをコンパイル対象の単位としている。トレーシングJITは、プログラムの実行時間の大半はプログラムの一部のループ(ホットループ)の実行に費やされており、かつそのループが再び実行される場合はたいてい前回と同様の実行パスを経る、という仮定に基づいている。通常、トレーシングJIT機能を有する仮想マシンは代替となる実行環境モードであるインタプリタやメソッドコンパイラも具備する。 トレーシング実行時コンパイラは実行時に以下のステップを経る:第一に、ループに関するプロファイリング情報を収集する。次にホットループを特定した後、トレーシング実行モードに移行し、そのループを実行するのに用いられたすべての演算を記録する。記録された演算列はトレース(trace)と呼ばれる。その後トレースは最適化され機械語にコンパイルされる。再びそのループが実行される際はオリジナルのコードではなくコンパイル済みのトレースを実行する。 以下で各ステップを詳細に説明する。 プロファイリングの目的はホットループを特定することである。よく使われる方法は、すべてのループについて繰り返し回数を数えることである。この数がある特定のしきい値を超えた場合、そのループはホットループとみなされ、トレーシングモードが有効化される。 トレーシングフェーズ下ではループの実行は通常通りだが、加えてすべての実行された演算がトレースに記録される。記録される演算はたいていは中間言語として保存される。ループ内からの関数コールも追跡され、場合によってはトレース内にインライン展開される。トレーシングはループが終了するかスタート点にジャンプするまで継続される。 トレースが記録できるのは、ある1つの実行パス条件のみであり、その後の実行がこの記録された実行パスとは異なる条件で実行される場合も考えられる。条件が同じかどうかを判定するためにガード命令がトレースに挿入される場合がある。if 文は挿入される場所の一例である。ガードは仮定していた条件が成り立っているかどうかを判定する。条件が成り立っていなければトレースは中止させられる。 トレーシングは実行時において行われるため実行時情報を含むことができる(例、実行時型情報)。この情報は最適化においてコードの品質を上げるのに使うことができる。 トレースは制御フローのない一列の実行パスでしかないため最適化は容易である。以下は典型的な最適化例である:
概要
技術詳細
プロファイリングフェーズ
トレーシングフェーズ
最適化とコード生成フェーズ
共通部分式除去
Size:23 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)』
担当:undef