1. ホーム
  2. java

[解決済み] JavaはJVMを必要とするのに、どうしてプラットフォーム非依存なのですか?

2023-07-04 09:50:11

質問

私はJavaを学び始めたばかりですが、プラットフォーム独立性のトピックについて混乱しています。

"independent"は、Javaコードがどのマシンでも実行でき、特別なソフトウェアをインストールする必要がないことを意味しませんか?しかし、JVM はマシンに存在する必要があります。

例えば、C/C++ソースコードをコンパイルし、それを実行するために、Turbo Cコンパイラーが必要です。マシンには C コンパイラーが必要なのです。

Javaがquot;platform independent"と表現されるとき、何を意味しているのか、誰か教えてください。

どのように解決するのですか?

一般に、コンパイルされたコードは、CPU がプログラムを実行するために必要な命令の正確なセットです。 Java では、コンパイルされたコードは、すべての物理マシン上で同じように動作することが要求される仮想 CPU のための正確な命令セットです。

つまり、ある意味、Java言語の設計者は、言語とコンパイルされたコードがプラットフォームに依存しないようにすることを決定しましたが、コードは最終的に物理プラットフォーム上で実行されなければならないので、プラットフォームに依存するすべてのコードをJVMに置くことを選択しました。

JVM に対するこの要件は、Turbo C の例とは対照的です。 Turbo C では、コンパイラーはプラットフォーム依存のコードを生成し、コンパイルされた Turbo C プログラムは CPU によって直接実行できるため、JVM のワークアライクは必要ではありません。

Javaでは、CPUはプラットフォーム依存のJVMを実行します。 この実行中の JVM は次にプラットフォームに依存しない Java バイトコードを実行しますが、実行するために利用可能な JVM があることが前提です。 Javaコードを書くときは、物理マシン上で実行されるコードのためにプログラムするのではなく、Java仮想マシン上で実行されるコードを書くと言うことができます。

このすべてのJavaバイトコードがすべてのJava仮想マシン上で動作する唯一の方法は、Java仮想マシンがどのように動作するかについてかなり厳密な標準が書かれていることです。 これは、使用している物理プラットフォームに関係なく、JavaバイトコードがJVMとインターフェイスする部分は、1つの方法でのみ動作することが保証されていることを意味します。 すべてのJVMがまったく同じように動作するので、同じコードは再コンパイルしなくても、どこでもまったく同じように動作します。 同じであることを確認するためのテストに合格できない場合は、仮想マシンを "Java virtual machine" と呼ぶことは許されないのです。

もちろん、Javaプログラムの移植性を壊す方法はあります。 あるオペレーティング システムでのみ見られるファイル (たとえば cmd.exe) を探すようなプログラムを書くことができます。 JNIを使えば、コンパイルされたCやC++のコードをクラスの中に効果的に入れることができます。 特定のオペレーティング・システムでのみ有効な規則(たとえば、":" でディレクトリを区切ると仮定する)を使用することもできます。 しかし、(JNI のような)本当に特別なことをしない限り、異なるマシン用にプログラムを再コンパイルする必要がないことは保証されています。