Java の JIT と AOT

Java がセミコンパイルおよびセミインタープリタ言語であることは誰もが知っています。コンパイル部分は C++ 言語に似ており、インタープリタ部分は Python 言語に似ています。Java は 2 つのメソッドを組み合わせた言語です。

1. 編集と解釈

1.1 コンパイルされた言語

いわゆるコンパイルとは、プログラムのソースコードを直接実行できるバイナリファイルに変換することですが、プログラムごとにコンパイル後に生成されるバイナリファイルは異なります。プログラムのソースコードがわずかに変更されただけであっても、変更されたソースコードは修正する必要がある すべてのコードファイルを再コンパイルする必要がある ソースコードの量が多く、コンパイル速度が非常に遅い場合、デバッグや実行が面倒になり、プログラムの開発効率が低くなります。コンパイルされた言語の。しかし、対照的に、コンパイルされたバイナリ ファイルは対応するオペレーティング システム上で直接実行でき、プログラムのパフォーマンスは非常に高くなります。典型的なコンパイル言語は C++ であり、C++ プログラムは非常に効率的です。プログラムの起動速度をさらに高速化するために、AOT技術が開発されました。

1.2 通訳される言語

いわゆる解釈とは、仮想マシン (ソフトウェアの一種) がテキストやファイルの内容を分析し、それに応じて応答することを意味します。インタプリタ型言語はテキストやファイルを解釈するだけでコンパイル処理がないため、ソースコードファイルが多少変更されてもインタプリタにとっては大きな違いはなく、デバッグや実行速度に大きな影響を与えることはありません。違いを認識できるため、プログラム開発の速度が向上します。これがインタプリタ型言語の利点です。しかし、逆に、プログラムの実行速度と効率は低下します。インタプリタによって解釈されるテキストまたはファイルは、実際には、インタプリタが効率的に解釈できる中間コード (バイトコードと呼ばれることもあります) に変換する必要があるためです。インタプリタに任せる このようなプログラムの実行効率は非常に低いです。典型的なインタープリター言語は Python であり、ソフトウェア Python は仮想マシンです。プログラムの実行速度をさらに高速化するために、JIT技術が開発されました。

1.3 仮想マシン

仮想マシンとは、プログラムのソースコードを解釈するためのソフトウェアのことを指しますが、なぜ仮想マシンと呼ばれるのでしょうか? なぜなら、その反対は非仮想マシン、つまり実マシンであり、私たちのコンピュータは実マシンであり、オペレーティングシステムはこの実マシン上で動作する「仮想マシン」であり、Java、Pythonなどです。 「仮想マシン」の「仮想マシン」です。それがどのようなプログラムであっても、最終的にはマシンが実行するためのマシンコードに変換されます。仮想マシン内での仮想マシンのプロセスでは、ネストが深くなるほど、プログラムは実際の物理的なプログラムから「遠ざかる」ことになります。実行処理中に変換処理が階層化されるため、実行効率が低下します。プログラムの実行効率という点では、C++ > Java > Python であることは誰もが知っています。これは、C++ が実際の物理マシンに「近い」のに対し、Python は「遠い」からです。

1.4 Java はなぜ「一度コンパイルすればどこでも実行できる」のでしょうか?

上記のことから、Java はセミコンパイルおよびセミインタープリタ言語であることがわかります。Java がソース コードをコンパイルするとき、コンパイラ javac は Java ファイルをクラス接尾辞を持つバイトコード ファイルにコンパイルし、それを解釈します。JVM はそれを解釈します。クラス バイトコード ファイルを使用して、クロスプラットフォームの目的を達成します。

2. JITとAOT

2.1 JITの原則

JIT と呼ばれる Just In Time (Just In Time) とは、プログラムが実行速度を高速化するという目的を達成するために、実行中にホット コードをコンパイルすることを意味します。

インタプリタ型言語を高速に動作させたい場合は、コンパイル方向にしか開発できませんが、完全にコンパイルすることはできないため、JIT 技術があります。解釈および実行プロセス中に、非常に頻繁に実行されるコード (ホット スポット コードと呼びます) が見つかった場合、コードのこの部分がコンパイルされてキャッシュされ、使用時にコンパイルされたファイルが呼び出されます。加速が実現されます。前に述べたように、Java はセミコンパイルおよびセミインタープリタ言語です。Java がソース コードをコンパイルするとき、コンパイラ javac は Java ファイルをクラス サフィックスの付いたバイトコード ファイルにコンパイルし、インタプリタ JVM がクラス バイトコード ファイルを解釈します。クロスプラットフォームの目的を達成するため。このプロセスには、コンパイルと解釈の両方が含まれます。説明の過程で JIT が登場します。

JIT はプロセスをスピードアップします

JITはJava言語だけでなく、Pythonなどの言語でも利用されています。一般に、JIT はスループットが高く、ランタイム パフォーマンスのボーナスがあり、プログラムの実行速度が速く、コードを動的に生成できるなどの特徴がありますが、起動が比較的遅く、トリガーするにはある程度の時間と呼び出し頻度が必要です。機構。

もちろん、Java での JIT テクノロジの適用は、ホット コードのコンパイルだけではなく、他の多くの側面での最適化も行います。

2.2 ホットスポットコード

どのコードがホット コードであるかを JIT がどのように判断するかについて、以下に簡単に説明します。簡単に言えば、コードが何度も実行されると、JIT によってホット コードとして識別されます。具体的には、次の 2 つの方法で判断できます。

サンプルベースのホットスポット検出

カウンタベースのホットスポット検出

2.3 AOTの原理

Ahead Of Time (Ahead Of Time) は AOT と呼ばれ、プログラムが起動を高速化するために実行前にコードをコンパイルすることを意味します。

プリコンパイル (静的コンパイルとも呼ばれます) は、コードの構造を事前に分析し、対応する最適化を実行し、バイナリ ファイルに直接コンパイルすることを意味します。インタプリタによって解釈される必要はなく、プラットフォームによって直接実行されます。 。AOT テクノロジを実行するプログラムは、メモリ使用量が少なく、起動速度が速く、直接実行できますが、実行時のパフォーマンス ボーナスはなく、プログラムの実行条件に基づいてさらなる最適化を実行することはできません。通常、gcc の o1、o2、および o3 は、コンパイルされたプログラムの品質を向上させるコンパイルの最適化です。

おすすめ

転載: blog.csdn.net/weixin_62651706/article/details/132274149
おすすめ