web-dev-qa-db-ja.com

バイトコードとは何ですか?JVMはそれらをどのように処理しますか

JavaはJIT(ジャストインタイム)コンパイルを実装し、プラットフォーム間で移植可能なバイトコードはJVMによって「解釈」されると何度も耳にしましたが、実際には何がわかりません。バイトコードとは、JVMが実際にJava言語アーキテクチャで何を意味するか。それらについてもっと知りたいです。

21
Midnight Blue

JVM(Java仮想マシン)には、実際のマシンと同じように命令セットがあります。この命令セットに付けられた名前はJavaバイトコードです。これは Java仮想マシン仕様 で説明されています。他の言語は実行前にバイトコードに変換されます。例:= Rubyおよびpython。Javaのバイトコードはかなり低レベルですが、pythonのバイトコードははるかに高レベルです。

解釈とJITコンパイルは、バイトコードを実行するための2つの異なる戦略です。解釈は、バイトコードを一度に1つずつ処理し、各命令でエンコードされている仮想マシンの状態を変更します。 JITコンパイルは、バイトコードを、同等の操作を実行するホストプラットフォームにネイティブな命令に変換します。

解釈は一般に開始が速いですが実行中は遅くなりますが、JITは起動のオーバーヘッドが大きくなりますが、その後は速く実行されます。最新のJVMは、解釈とJIT技術の組み合わせを使用して、両方の利点を活用しています。バイトコードは、JITがバックグラウンドで変換しているときに最初に解釈されます。 JITコンパイルが完了すると、JVMはインタープリターの代わりにそのコードを使用するように切り替わります。 JITコンパイルは、より動的であるため、CおよびC++で使用される事前コンパイルよりも優れた結果を生成できる場合があります。 JVMは、コードが呼び出される頻度とコード内の一般的なパスを追跡し、この情報を使用して、プログラムの実行中に、より効率的なコードを生成できます。 JVMは、最初にインタープリターからJITコードに切り替えるときと同じように、この新しいコードに切り替えることができます。

C、C++、Fortranなど、ネイティブコードにコンパイルされる他の言語と同じように。 JVMバイトコードを出力する他の言語用のコンパイラがあります。一例はscala言語です。groovyとjrubyもJavaバイトコードに変換できると思います。

45
Geoff Reedy

バイトコードは、ソースコードと実際のマシンコードの間のステップです。 JVMは、バイトコードを取得してマシンコードに変換するものです。

JITは、JVMがプログラムの実行時にこの変換を実行するという事実を指します(CやC++などの従来のコンパイル/リンクされた言語のように)。

バイトコードのポイントは、バイトコードがすでに部分的にコンパイルおよび最適化されているため、厳密に解釈された言語(PHPなど)など)よりも優れたパフォーマンスが得られることです。また、バイトコードはCPUによって直接解釈されるため、特定のCPUアーキテクチャに結び付ける必要がないため、移植性が向上します。

もちろん、デメリットは、JVMがバイトコードをマシンコードに変換するためにいくつかの作業を行う必要があるため、通常、ネイティブにコンパイルされたアプリケーションよりも少し遅くなることです。

14
Eric Petroelje

Javaで何かをコンパイルすると、コンパイラはバイトコードを生成します。これはJava仮想マシンのネイティブコードです。JVMはバイトコードをプロセッサ/アーキテクチャのネイティブコードに変換します。ここでJITが発生します。JITがないと、JVMはプログラムを変換します。一度に1つの命令であり、非常に低速です。

1
Cesar

jcyangはすでにウィキペディアへのリンクを提供していますが、これはあなたの質問によりよく一致します:

Javaバイトコード

JavaコンパイラはJavaソースコードをクラスファイルにコンパイルします。クラスのメソッドはバイトコードに変換され、Java仮想マシン(JVM)がこのバイトコードを解釈します。ジャストインタイムコンパイラ(JIT)を使用して、バイトコードをマシンコードに変換し、クラスメソッドの実行を高速化できます。

0
Andreas_D

バイトコードは、機械語命令に相当するJVMです。

0
Kaleb Brasee