[解決済み] JavaはJVMを必要とするのに、どうしてプラットフォーム非依存なのですか?
質問
私は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 のような)本当に特別なことをしない限り、異なるマシン用にプログラムを再コンパイルする必要がないことは保証されています。
関連
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
Java基礎編 - オブジェクト指向
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
Javaジェネリックを1つの記事で
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
API の戻り値を処理するために ResponseEntity を使用する
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
アクセス制限の解決方法: ---- in Java