Java に慣れ始めたばかりの人は、
マシンコードと
バイト コードの概念について混乱することがよくあります。彼らは何ですか?違いは何ですか? この問題をきっぱりと終わらせるために、短いメモでそれらの機能をできるだけ簡単かつ明確に説明しようとします。
マシンコード
プロセッサは本質的に、非常に複雑で高度な計算機です。これには多くのメモリ位置 (レジスタと呼ばれます) があり、それらの間でさまざまな数学演算やバイト演算が実行されます。マシンコードは、正確には一連の操作と関連するデータセットを記述したものです。実際、これはコンピュータのプロセッサが理解できる唯一の言語です。
先天性不適合
さらに、すべてのプロセッサが同じ言語を「話す」わけではありません。
CISCアーキテクチャと
RISCアーキテクチャの間には違いがあるだけでなく、これらの「陣営」内にも違いがあります。
CISC (複雑な命令セット コンピューティング) は、次の一連のプロパティによって特徴付けられるプロセッサ設計概念です。
- 長さが異なる多数のコマンド。
- 多くのアドレス指定モード。
- 複雑な命令コーディング。
RISC (縮小命令セット コンピューティング) - 縮小された命令セットを備えたプロセッサ。コマンドは同じ形式で短く、コーディングが簡単です。 |
新世代のプロセッサーには、旧世代モデルにはまったく知られていない追加の命令セットが導入されています。このため、あるアーキテクチャ (またはプロセッサの 1 世代) 向けにコンパイルされたプログラムは、他のハードウェアでは実行できません。このため、他のコンピュータでも確実に動作するようにプログラムを再コンパイルする必要があります。ただし、プロセッサだけでなく、プログラムとオペレーティング システムの相互作用の違いによっても再コンパイルする必要があります。これらのせいで、「Windows」プログラムを Linux 上で実行したり、「Linux」プログラムを Windows 上で実行したりすることが不可能になります。
バイトコード
バイトコードは多くの点でマシンコードに似ていますが、実際のプロセッサではなく仮想プロセッサからの一連の命令を使用する点が異なります。さらに、プログラムが実行されている実際のプロセッサのコマンドの実行を最適化する
JIT コンパイラの使用に焦点を当てたセクションが含まれる場合があります。
JIT コンパイル(ジャストインタイム コンパイル、オンザフライ コンパイル) または動的コンパイル(動的変換) は、バイトコードをマシン コードまたは別の形式に直接コンパイルすることによって、バイトコードを使用するソフトウェア システムのパフォーマンスを向上させるテクノロジです。プログラムが実行中です。Java では「公式には」バージョン 9 までは JIT コンパイラのみでした。Java 9 では、事前にコンパイルする別のコンパイラー (AoT) が登場しました。この機能により、Java クラスを仮想マシン上で実行する前にネイティブ コードにコンパイルできるようになります。この機能は、ピーク パフォーマンスへの影響を限定しながら、小規模アプリケーションと大規模アプリケーションの両方の起動時間を短縮するように設計されています。 |
CISCプロセッサの場合、一部の命令はプロセッサによってサポートされるより複雑な構造に結合でき、
RISCの場合は逆に、より単純な命令シーケンスに分割できます。
仮想OSでもある
ただし、バイト コードにはプロセッサ命令だけが含まれるわけではありません。また、仮想オペレーティング システムと対話するためのロジックも含まれており、これにより、アプリケーションの動作がコンピューターで使用されているオペレーティング システムから独立します。これは
JVMではっきりとわかります。JVM では、システム コールとGUIの操作は、プログラムが実行されている OS から独立していることがよくあります。概して、仮想システム/ハードウェアのみを作成する
Virtual Boxのようなソリューションとは異なり、 JVM はプログラム プロセスの起動をエミュレートします。
このようなのは JVM だけでしょうか?
絶対にありません。同じ
DotNet CLI は仮想マシンでもあり、 x86 互換プロセッサを搭載した Windowsを実行しているコンピュータで最もよく使用されます。ただし、他のシステム用の実装もあります。そのアプリケーションは、
ARM (RISC)互換プロセッサ上で動作する
Windows RT上で実行する必要があります。あるいは、サードパーティ製の
Mono環境のLinux/OSX上で実行することもできます。完全な互換性はありません)これらのプラットフォーム用の
DotNetの実装。したがって、このプラットフォームは、
JVMと同様に、異なるプロセッサや異なる OS 上で実行されます。
LLVM、
Flash SWF など、同様のソリューション (新旧両方) が他にもたくさんあります。一部のプログラミング言語には独自の仮想マシンがあります。たとえば、
CPython はPYソースを
PYCファイル ( PVMで実行するために準備されたコンパイルされたバイト コード)にコンパイルします。または、もっと古い例があります。Lisp
はFASL (Fast Load) ファイルにコンパイルできます。実際、それらには、ジェネレーターによってソース コードから構築された
AST ツリーが含まれています。これらのファイルは、さまざまなプラットフォーム上のLispインタプリタによって読み取って実行したり、現在使用されているハードウェア アーキテクチャ用のマシン コードを生成するために使用したりできます。
GO TO FULL VERSION