回答:
通常、Java実装は2段階のコンパイルプロセスを使用します。Javaソースコードは、Javaコンパイラによってバイトコードにコンパイルされます。バイトコードは、Java仮想マシン(JVM)によって実行されます。最新のJVMは、ジャストインタイム(JIT)コンパイルと呼ばれる手法を使用して、バイトコードを実行時にハードウェアCPUがオンザフライで理解できるネイティブ命令にコンパイルします。
JVMの一部の実装では、バイトコードをJITでコンパイルしてマシンコードに変換し、直接実行するのではなく、バイトコードを解釈する場合があります。これは「インタプリタ」と見なされていますが、高レベルのソースコードを読み取って実行するインタプリタとはかなり異なります(つまり、この場合、Javaソースコードは直接解釈されず、バイトコード、Javaコンパイラの出力は解釈されます)。
Javaを事前にネイティブコードにコンパイルして、結果のバイナリを実行することは技術的に可能です。Javaコードを直接解釈することもできます。
要約すると、実行環境に応じて、バイトコードは次のようになります。
Javaで書かれたコードは:
Javaはいつバイトコードを解釈し、いつコンパイルしますか?アプリケーションコードは最初に解釈されますが、JVMは頻繁に実行されるバイトコードのシーケンスを監視し、ハードウェアで直接実行できるようにそれらをマシンコードに変換します。数回しか実行されないバイトコードの場合、これによりコンパイル時間が節約され、初期待ち時間が短縮されます。頻繁に実行されるバイトコードの場合、JITコンパイルは、低速の解釈の初期段階の後、高速で実行するために使用されます。さらに、プログラムはほとんどのコードの実行にほとんどの時間を費やすため、コンパイル時間の短縮は重要です。最後に、初期コードの解釈中に、コンパイル前に実行統計を収集できるため、最適化をより効果的に実行できます。
「解釈された言語」または「コンパイルされた言語」という用語は、どのプログラミング言語でも解釈および/またはコンパイルできるため、意味がありません。
Javaの既存の実装については、ほとんどがバイトコードへのコンパイル手順を含むため、コンパイルが含まれます。ランタイムはバイトコードを動的にロードすることもできるため、常に何らかの形式のバイトコードインタープリターが必要です。そのインタープリターは、ネイティブコードへのコンパイルを内部的に使用する場合としない場合があります。
最近、部分ジャストインタイムコンパイルは、かつて「解釈済み」と見なされていた多くの言語、たとえばJavaScriptで使用されています。
Javaはバイトコードにコンパイルされ、バイトコードがJava VMに渡されて解釈されます。
Javaはコンパイルと解釈の両方を行い、
Javaでは、プログラムは実行可能ファイルにコンパイルされません。それらはバイトコードにコンパイルされ(前述のとおり)、JVM(Java仮想マシン)が実行時に解釈/実行します。javacコンパイラを使用すると、Javaソースコードがバイトコードにコンパイルされます。バイトコードは、ファイル拡張子.classでディスクに保存されます。
プログラムを実行するときに、バイトコードが変換されます。バイトコードは、ジャストインタイム(JIT)コンパイラを使用して変換できます。その結果、マシンコードがメモリに送られ、実行されます。
Javacは、JavaコードをバイトコードにコンパイルするJavaコンパイラです。JVMは、バイトコードを実行/解釈/ネイティブコードに変換するJava仮想マシンです。Javaではインタプリタ言語と見なされていますが、バイトコードがJVMにある場合、JIT(ジャストインタイム)コンパイルを使用する場合があります。JITコンパイラーは、バイトコードを多くのセクションで(または完全に、まれに)読み取って動的にマシンコードにコンパイルするため、プログラムをより高速に実行し、キャッシュして後で再コンパイルすることなく再利用できます。したがって、JITコンパイルでは、コンパイルされたコードの速度と解釈の柔軟性が組み合わされています。
インタプリタ型言語は、その実装の大部分は、以前に機械語命令にプログラムをコンパイルすることなく、直接、自由に命令を実行しているの言語プログラミングの一種です。インタプリタはプログラムを直接実行し、各ステートメントを、すでにマシンコードにコンパイルされている1つ以上のサブルーチンのシーケンスに変換します。
コンパイルされた言語は、その実装典型的にコンパイラ(ソースコードからマシンコードを生成する翻訳者)であり、しないインタープリタ(無プリランタイム変換が行われていないソースコードの段階的エグゼキュータ)プログラミング言語であります
Javaのような最新のプログラミング言語実装では、プラットフォームが両方のオプションを提供することがますます一般的になっています。
引用:https : //blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster
アプリケーション開発者は、今日の市場で入手可能なさまざまなOSのいずれかでアプリケーションコードを開発できます。この段階では、Java言語はOSに依存していません。Javaアプリケーション開発者が書いた素晴らしいソースコードは、Javaの用語でクライアントサイドコンパイルと呼ばれるJavaバイトコードにコンパイルされるようになりました。Java Byteコードへのこのコンパイルは、Java開発者が「1度書く」ことを可能にするものです。Java Byteコードは、互換性のあるすべてのOSおよびサーバーで実行できるため、ソースコードはOS /サーバーに依存しません。Java Byteコードの作成後、Javaアプリケーションと基盤となるOS /サーバー間の相互作用はより密接になります。旅は続きます-エンタープライズアプリケーションフレームワークは、Java仮想マシン(JVM)またはJavaランタイム環境(JRE)として知られるランタイム環境でこれらのJavaバイトコードを実行します。JVMは、OSとサーバーが提供するリソースを利用するため、基盤となるOSとハードウェアと密接な関係があります。Java Byteコードは、プラットフォーム固有の機械語実行可能コードにコンパイルされるようになりました。これはサーバー側コンパイルと呼ばれます。
したがって、Javaは間違いなくコンパイルされた言語だと思います。