これまで、プログラミング言語として C++ を使用してきました。C++で書かれたコードは、オブジェクトコード「マシンコード」になるまでコンパイルプロセスを経ることを知っています。
その点でJavaがどのように機能するかを知りたいです。ユーザーが作成した Java コードは、コンピューターでどのように実行されますか?
これまで、プログラミング言語として C++ を使用してきました。C++で書かれたコードは、オブジェクトコード「マシンコード」になるまでコンパイルプロセスを経ることを知っています。
その点でJavaがどのように機能するかを知りたいです。ユーザーが作成した Java コードは、コンピューターでどのように実行されますか?
Java の実装では、通常、2 段階のコンパイル プロセスが使用されます。Java ソース コードは、Java コンパイラによってバイトコードにコンパイルされます。バイトコードは Java 仮想マシン (JVM) によって実行されます。最新の JVM は、ジャストインタイム (JIT) コンパイルと呼ばれる手法を使用して、実行時にオンザフライでハードウェア CPU が理解できるネイティブ命令にバイトコードをコンパイルします。
JVM の一部の実装では、JIT でバイトコードをマシン コードにコンパイルして直接実行する代わりに、バイトコードを解釈することを選択する場合があります。これは依然として「インタープリター」と見なされますが、高レベルのソース コードを読み取って実行するインタープリターとはまったく異なります (つまり、この場合、Java ソース コードは直接解釈されず、Java コンパイラーの出力であるバイトコードが解釈されます)。
Java を事前にネイティブ コードにコンパイルし、結果のバイナリを実行することは技術的に可能です。Java コードを直接解釈することも可能です。
要約すると、実行環境に応じて、バイトコードは次のようになります。
Java で書かれたコードは次のとおりです。
javaはいつバイトコードを解釈し、いつコンパイルしますか? アプリケーション コードは最初に解釈されますが、JVM はどのバイトコード シーケンスが頻繁に実行されるかを監視し、それらをハードウェアで直接実行できるようにマシン コードに変換します。数回しか実行されないバイトコードの場合、これによりコンパイル時間が節約され、初期レイテンシが短縮されます。頻繁に実行されるバイトコードの場合、遅い解釈の初期段階の後、JIT コンパイルを使用して高速で実行します。さらに、プログラムはほとんどの時間をそのコードの少数の実行に費やすため、コンパイル時間が大幅に短縮されます。最後に、最初のコード解釈中に、コンパイル前に実行統計を収集できるため、最適化を向上させることができます。
どのプログラミング言語も解釈および/またはコンパイルできるため、「解釈された言語」または「コンパイルされた言語」という用語は意味がありません。
Java の既存の実装に関しては、ほとんどがbytecodeへのコンパイル手順を伴うため、コンパイルが必要です。ランタイムはバイトコードを動的にロードすることもできるため、何らかの形式のバイトコード インタープリターが常に必要になります。そのインタープリターは、内部的にネイティブ コードへのコンパイルを使用する場合と使用しない場合があります。
最近では、部分的なジャストインタイム コンパイルが、JavaScript など、かつて「解釈される」と見なされていた多くの言語で使用されています。
Java はバイトコードにコンパイルされ、Java VM に渡されて解釈されます。
Java はコンパイル済みプログラミング言語ですが、実行可能なマシン コードに直接コンパイルするのではなく、JVM バイト コードと呼ばれる中間バイナリ形式にコンパイルします。次に、バイトコードはコンパイルおよび/または解釈されて、プログラムが実行されます。
両方の種類。最初にJavaがバイトコードにコンパイルされ(「翻訳された」と言う人もいます)、JITの気分に応じてコンパイルまたは解釈されます。
Java は、 Java 仮想マシンと呼ばれるプラットフォームを対象とするバイトコンパイル言語であり、スタックベースであり、多くのプラットフォームで非常に高速に実装されています。