JavaはJIT(ジャストインタイム)コンパイルを実装し、プラットフォーム間で移植可能なバイトコードはJVMによって「解釈」されると何度も耳にしました。ただし、バイトコードとは何か、Java言語アーキテクチャでJVMが実際に何を意味するのかはわかりません。それらについてもっと知りたいです。
6 に答える
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バイトコードに変換できると思います。
バイトコードは、ソースコードと実際のマシンコードの間のステップです。JVMは、バイトコードを取得してマシンコードに変換するものです。
JITは、JVMがプログラムの実行時にこの変換を実行するという事実を指します(CやC ++などの従来のコンパイル/リンクされた言語のように)。
バイトコードのポイントは、バイトコードがすでに部分的にコンパイルおよび最適化されているため、厳密に解釈された言語(たとえば、PHPなど)よりも優れたパフォーマンスが得られることです。また、バイトコードはCPUによって直接解釈される必要がないため、特定のCPUアーキテクチャに結び付ける必要がなく、移植性が向上します。
もちろん、デメリットは、JVMがバイトコードをマシンコードに変換する際に何らかの作業を行う必要があるため、ネイティブにコンパイルされたアプリケーションよりも一般的に少し遅くなることです。
Javaで何かをコンパイルすると、コンパイラはバイトコードを生成します。これは、Java仮想マシンのネイティブコードです。次に、JVMはバイトコードをプロセッサ/アーキテクチャのネイティブコードに変換します。ここでJITが発生します。JITがないと、JVMはプログラムを一度に1命令ずつ変換しますが、これは非常に低速です。
jcyangはすでにウィキペディアへのリンクを提供していますが、これはあなたの質問によりよく一致します:
Javaコンパイラは、Javaソースコードをクラスファイルにコンパイルします。クラスのメソッドはバイトコードに変換され、Java仮想マシン(JVM)がこのバイトコードを解釈します。ジャストインタイムコンパイラ(JIT)を使用して、バイトコードをマシンコードに変換し、クラスメソッドの実行を高速化することができます。
バイトコードは、機械語命令に相当するJVMです。
JVMは、Javaコードを実行するために使用される仮想マシンです。JVMをコンパイラと比較することができます。コンパイラがないと、Javaコードをコンパイルしてアプリケーションを作成することはできません。JVMは、Javaコードを証明するコードの一部にすぎません。JVMの主なタスクは、JavaコードをJavaバイトコードに変換してコンパイルすることです。これにより、Java開発が容易になります。Java仮想マシンがどのように機能するかについて詳しく知りたい場合は、この記事を確認してください。