web-dev-qa-db-ja.com

Javaはコンパイルされたプログラミング言語または解釈されたプログラミング言語ですか?

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

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

138
Eduardo

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

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

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

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

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

enter image description here

Javaで記述されたコードは次のとおりです。

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

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


参照:

1: http://techwelkin.com/compiler-vs-interpreter

2: http://docs.Oracle.com/javase/7/docs/technotes/tools/windows/Java.html

3: https://en.wikipedia.org/wiki/Just-in-time_compilation#Startup_delay_and_optimizations

70
displayName

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

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

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

55
starblue

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

50
Noon Silk

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

11
maykeye

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

10
Sam Harwell

Javaはコンパイルと解釈の両方を行い、

Javaでは、プログラムは実行可能ファイルにコンパイルされません;これらはバイトコードにコンパイルされ(前述)、JVM(Java Virtual Machine)は実行時に解釈/実行します。 Javaソースコードは、javacコンパイラを使用するとバイトコードにコンパイルされます。 バイトコードは、ファイル拡張子.classでディスクに保存されます。

プログラムを実行する場合、 バイトコードが変換されます バイトコードは、ジャストインタイム(JIT)コンパイラを使用して変換できます。その結果、マシンコードがメモリに送られ、実行されます。

Javacは、JavaをコンパイルするJavaコンパイラバイトコードへのコード。 JVMは、バイトコードをネイティブマシンコードに実行/解釈/変換するJava仮想マシンです。 Javaでは、インタープリター言語と見なされますが、バイトコードがJVMにある場合、JIT(Just-in-Time)コンパイルを使用する場合があります。 JITコンパイラーは多くのセクション(またはめったに完全ではない)でバイトコードを読み取り、プログラムをより高速に実行できるように動的にマシンコードにコンパイルします。その後、再コンパイルせずにキャッシュして後で再利用します。そのため、JITコンパイルでは、コンパイルされたコードの速度と解釈の柔軟性が組み合わされています。

解釈された言語は、その実装のほとんどが、事前にコンパイルすることなく、直接かつ自由に命令を実行するプログラミング言語の一種です。機械語命令へのプログラム。インタプリタはプログラムを直接実行し、各ステートメントをすでにマシンコードにコンパイルされている1つ以上のサブルーチンのシーケンスに変換します。

A compiled language is a programming language whose implementations are typically compilers (translators that generate machine code from source code), and not interpreters (step-by-step executors of source code, where no pre-runtime translation takes place)

Javaのような現代のプログラミング言語の実装では、プラットフォームが両方のオプションを提供することがますます一般的になっています。

3
prime