オペレーティング システム/プラットフォームごとに異なるバージョンの JVM があります。これは、それを開発した人々が、主要なオペレーティング システム用にさまざまなインタープリターを作成したことを意味します。今日、新しい OS が登場した場合、Java もその OS で動作しますか? では、プラットフォームに依存しないと言うとき、JVM が利用可能なプラットフォームに限定しているのでしょうか、それとも Java は実際にはプラットフォームに依存しないのでしょうか?
7 に答える
ここでは、いくつかの異なることを混同しています。
プラットフォームに依存しないのはJavaプログラミング言語であり、ひいては、 Javaプログラミング言語で記述されたプログラムです。
JVM自体はプラットフォームに依存しません。これは、言語のプラットフォームに依存しないことを実現するためのプラットフォームに依存する手段です。
明らかに、Java は JVM を持たないプラットフォームでは実行できません。したがって、言葉の最も文字通りの意味で、Java はプラットフォームに依存しません。しかし同時に、プラットフォームの独立性の定義は役に立ちません。プラットフォームの一部の側面で言語を解析できる必要があるため、真にプラットフォームに依存しない言語はあり得ません。また、考えられるすべてのプラットフォームを考えると、必ずしもそれを解析できないものもあります。
したがって、非常に多くのプラットフォームで JVM が実行され、Java コードは同じ意味で任意の JVM で実行できるという事実を考慮すると、Java はプラットフォームに依存します。
考慮する必要があるさまざまな側面があります。
JVM仕様は、ガベージ コレクションをどのように実装する必要があるかを述べていないように、プラットフォームの独立性についてそれほど厳密ではありません。そのため、企業は、パフォーマンスを最適化するために、プラットフォームに依存するJVMのコンポーネントを自由に使用できます。したがって、コンパイルされたコードを実行するJVMは、プラットフォームに依存しません。Windows JVM、Linux JVM、Mac OS JVM など、そのプラットフォームに固有の JVM が必要であり、同じプラットフォーム用の JVM のさまざまな実装があります。
ただし、Java API、Java 言語、およびJava コンパイラはプラットフォームに依存しません。
Java では、プラットフォームの独立性とは、コードを正しく記述すれば、結果としてコンパイルされたコードが、JVM をサポートするどのプラットフォームでも変更されずに同じように実行されるという事実のみを指します。
明らかに、JVM がなければ、バイトコードを実行する機会はありません。この質問により、JVM を新しいプラットフォームに移植するのが実際にどれほど難しいか疑問に思いました。 Wpediaには次のものがあります(HotSpot VMについて):
ポートは、Mac OS X およびその他のさまざまな Unix オペレーティング システム用にサードパーティからも入手できます。x86、PowerPC、SPARC (Solaris のみ) など、いくつかの異なるハードウェア アーキテクチャがサポートされています。
HotSpot の移植は、コードが主に C++ で記述されているものの、多くのアセンブリ言語が含まれているため困難です。これを改善するために、IcedTea プロジェクトは、ゼロ アセンブラー Hotspot (またはゼロ) と呼ばれる HotSpot インタープリターの汎用ポートを開発しました。アセンブリ コードはほとんどありません。このポートは、HotSpot のインタープリター コンポーネントを任意の Linux プロセッサ アーキテクチャに簡単に適応させることを目的としています。ゼロ アセンブラ Hotspot のコードは、バージョン 1.6 以降、HotSpot のすべての非 x86 ポート (PPC、IA64、S390、および ARM) に使用されます。
IcedTea の開発者である Gary Benson は、ゼロを補完するために、LLVM を使用して HotSpot 用の Shark と呼ばれる、プラットフォームに依存しないジャストインタイム コンパイラを開発しました。
Java が完全にプラットフォームに依存しないとは思いません。
なぜなら:
作業のスレッディング スケジュール タイム スライスは、プロセッサ、OS、およびプラットフォームによって異なります。
出力デバイスの変更に応じて AWT グラフィックスが変更されるため、プラットフォームの依存関係が示されます。