JIT(Just-In-Time)Compileとは?


1.概要


Just-In-Timeの名前から分かるように、プログラムのソースコードは、プログラムの実行時にマシン言語(実行時)で即時にコンパイルされ、実行される.これは、主にエンタープライズ言語でプログラムの実行速度を向上させるためのプログラム実行方式です.

2.詳細


2-1. プログラムの運転方式


プログラムは主に2つの方法で実行されます.

2-1-1. コンパイルモード


プログラムを実行する前に、ソースコードをマシンにコンパイルし、オブジェクトファイルとして作成します.プログラムを実行すると、オブジェクトファイルのマシン言語を直接実行します.
  • オブジェクトファイル:
  • ソースコードをマシンにコンパイルした結果を含むファイル
  • 例:
  • (C、C++など)

    2-1-2. インタラプトモード


    プログラムが起動すると、ソースコード(またはByteCode)をエントリポイント(Main関数または実行ファイルの最上位コード)から逐行解析します.
  • 例:Python等
  • 2-2. JIT方式は何ですか?


    JITはコンパイルと割り込みを混合した方式である.作成したJITコンパイラを使用すると、割り込みで実行するプログラムの実行速度をコンパイルで実行する言語に近いレベルに上げることができます.ここで待って、プログラムを実行するときにその場でコードを機械言語に翻訳すると言ったのではないでしょうか.JIT方式とinterpret方式は何が違うので、コンパイル方式の言語と実行速度は近いですか?
    答えはチャッキング
    JITメソッドは,翻訳が必要なソースコード(またはバイトコード)を始点から逐行機械言語に翻訳し,頻繁に実行されている部分を発見すると,その部分の翻訳結果をある位置に保存し,必要に応じて取り出して使用する.これをキャッシュと呼びます.
    入力点からコードを機械言語に逐行翻訳し、中間言語の特性とコンパイル言語の特性を有し、機械に翻訳されたコードがある位置に格納される.だから彼らは「コンパイルと中断を混合した」と言った.

    2-3. cachingはどのようにプログラムの実行速度を高めますか?


    例を挙げる.次の疑似コードがあるとします.
    1) def f(a, b):
    2)     return a + b
    3)    
    4) f(1, 2)
    5) f(3, 4)
    6) f(5, 6)
    上記の擬似コードが通常の割り込みで実行される場合、コードは4−>1−>2−>5−>1−>2−>6−>1−>2の順序で実行される.4行目で既に関数f()を1回機械言語に翻訳したとしても、5、6行目で関数f()を2回機械言語に翻訳することができる.
    でもJIT方式では違います上記のダミーコードをJIT方式で実行すると、コードは4->1->2->(キャッシュ)->5->6行の順に実行されます.関数f()は、1つのソースコード内で繰り返し呼び出される部分であるため、cachingを先に行い、次に呼び出し関数f()のコードに再び遭遇すると、cachingされたマシン言語が読み込まれて実行される.
    このようなJITプログラムの実行方式は、cachingによって中断的に実行される言語の速度を向上させ、コンパイラを実行する速度をコンパイラを実行する速度に近づける.

    2-4. JIT方式の欠点


    しかし、JITは必ずしもプログラムの実行速度を著しく向上させることができるわけではない.たとえば、1つのプログラムに重複コードがほとんど存在しない場合、キャッシュするコードはほとんどないため、速度を向上させる効果はわずかです.
    あるいは、プログラムの実行時間が短い場合、JITと割り込みプログラムの実行速度に大きな差はありません.
    もう1つの欠点は、cachingが静的にコンパイルされたプログラムに比べて実行時に消費するメモリが多いことです.