202

これまで、プログラミング言語として C++ を使用してきました。C++で書かれたコードは、オブジェクトコード「マシンコード」になるまでコンパイルプロセスを経ることを知っています。

その点でJavaがどのように機能するかを知りたいです。ユーザーが作成した Java コードは、コンピューターでどのように実行されますか?

4

10 に答える 10

254

Java の実装では、通常、2 段階のコンパイル プロセスが使用されます。Java ソース コードは、Java コンパイラによってバイトコードにコンパイルされます。バイトコードは Java 仮想マシン (JVM) によって実行されます。最新の JVM は、ジャストインタイム (JIT) コンパイルと呼ばれる手法を使用して、実行時にオンザフライでハードウェア CPU が理解できるネイティブ命令にバイトコードをコンパイルします。

JVM の一部の実装では、JIT でバイトコードをマシン コードにコンパイルして直接実行する代わりに、バイトコードを解釈することを選択する場合があります。これは依然として「インタープリター」と見なされますが、高レベルのソース コードを読み取って実行するインタープリターとはまったく異なります (つまり、この場合、Java ソース コードは直接解釈されず、Java コンパイラーの出力であるバイトコードが解釈されます)。

Java を事前にネイティブ コードにコンパイルし、結果のバイナリを実行することは技術的に可能です。Java コードを直接解釈することも可能です。

要約すると、実行環境に応じて、バイトコードは次のようになります。

  • 事前にコンパイルされ、ネイティブ コードとして実行されます (ほとんどの C++ コンパイラと同様)。
  • ジャストインタイムでコンパイルして実行
  • 解釈された
  • サポートされているプロセッサによって直接実行されます (バイトコードは一部の CPU のネイティブ命令セットです)
于 2009-08-25T04:41:14.470 に答える
120

ここに画像の説明を入力

Java で書かれたコードは次のとおりです。

  • 上の画像の左側のセクションに示されているように、最初にjavacというプログラムによってバイトコードにコンパイルされます。
  • 次に、上の画像の右側のセクションに示すように、javaという別のプログラムが Java ランタイム環境を開始し、Java インタープリター/JIT コンパイラーを使用してバイトコードをコンパイルおよび/または解釈する場合があります。

javaはいつバイトコードを解釈し、いつコンパイルしますか? アプリケーション コードは最初に解釈されますが、JVM はどのバイトコード シーケンスが頻繁に実行されるかを監視し、それらをハードウェアで直接実行できるようにマシン コードに変換します。数回しか実行されないバイトコードの場合、これによりコンパイル時間が節約され、初期レイテンシが短縮されます。頻繁に実行されるバイトコードの場合、遅い解釈の初期段階の後、JIT コンパイルを使用して高速で実行します。さらに、プログラムはほとんどの時間をそのコードの少数の実行に費やすため、コンパイル時間が大幅に短縮されます。最後に、最初のコード解釈中に、コンパイル前に実行統計を収集できるため、最適化を向上させることができます。

于 2016-04-04T03:25:59.033 に答える
71

どのプログラミング言語も解釈および/またはコンパイルできるため、「解釈された言語」または「コンパイルされた言語」という用語は意味がありません。

Java の既存の実装に関しては、ほとんどがbytecodeへのコンパイル手順を伴うため、コンパイルが必要です。ランタイムはバイトコードを動的にロードすることもできるため、何らかの形式のバイトコード インタープリターが常に必要になります。そのインタープリターは、内部的にネイティブ コードへのコンパイルを使用する場合と使用しない場合があります。

最近では、部分的なジャストインタイム コンパイルが、JavaScript など、かつて「解釈される」と見なされていた多くの言語で使用されています。

于 2009-08-25T06:46:56.570 に答える
54

Java はバイトコードにコンパイルされ、Java VM に渡されて解釈されます。

于 2009-08-25T04:39:45.657 に答える
16

Java はコンパイル済みプログラミング言語ですが、実行可能なマシン コードに直接コンパイルするのではなく、JVM バイト コードと呼ばれる中間バイナリ形式にコンパイルします。次に、バイトコードはコンパイルおよび/または解釈されて、プログラムが実行されます。

于 2009-08-25T04:40:22.753 に答える
14

両方の種類。最初にJavaがバイトコードにコンパイルされ(「翻訳された」と言う人もいます)、JITの気分に応じてコンパイルまたは解釈されます。

于 2009-08-25T04:40:33.597 に答える
-3

Java は、 Java 仮想マシンと呼ばれるプラットフォームを対象とするバイトコンパイル言語であり、スタックベースであり、多くのプラットフォームで非常に高速に実装されています。

于 2009-08-25T04:40:32.693 に答える