web-dev-qa-db-ja.com

JVMを実行する必要がある場合、Javaプラットフォームに依存しませんか?

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

「独立」とは、Javaコードが任意のマシンで実行され、特別なソフトウェアをインストールする必要がないことを意味しませんか?ただし、JVMはマシンに存在する必要があります。

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

誰かがJavaが「プラットフォームに依存しない」と記述されている場合の意味を喜ばせることができますか?

76
Serenity

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

そのため、ある意味では、Java言語の設計者は、言語とコンパイルされたコードはプラットフォームに依存しないことを決定しましたが、最終的にコードは物理プラットフォームで実行する必要があるため、 JVMのすべてのプラットフォーム依存コード。

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

Javaでは、CPUはプラットフォームに依存するJVMを実行します。この実行中のJVMは、実行可能なJVMがあれば、プラットフォームに依存しないJavaバイトコードを実行します。 Javaコードを書くと、物理マシンで実行されるコードをプログラムせずに、Java仮想マシンで実行されるコードを書くと言うかもしれません。

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

もちろん、Javaプログラムの移植性を破ることができる方法があります。 1つのオペレーティングシステム(cmd.exeなど)でのみ見つかったファイルを検索するプログラムを作成できます。 JNIを使​​用すると、コンパイルされたCまたはC++コードをクラスに効果的に配置できます。特定のオペレーティングシステムでのみ機能する規則を使用できます(「:」がディレクトリを分離すると仮定するなど)。ただし、本当に特別なこと(JNIなど)を行っている場合を除き、別のマシン用にプログラムを再コンパイルする必要はありません。

106
Edwin Buck
            Technical Article on How Java is platform indepedent?

詳細に入る前に、まずプラットフォームの意味を理解する必要がありますか?プラットフォームは、コンピューターのハードウェア(主にマイクロプロセッサーのアーキテクチャー)とOSで構成されます。プラットフォーム=ハードウェア+オペレーティングシステム

プラットフォームに依存しないものは、すべてのオペレーティングシステムとハードウェアで実行できます。

Javaはプラットフォームに依存しないため、Javaはどのオペレーティングシステムおよびハードウェアでも実行できます。ここで問題は、プラットフォームに依存しない方法ですか?

これは、OSに依存しないバイトコードの魔法によるものです。 Javaコンパイラがコードをコンパイルすると、マシンのネイティブコードではなくバイトコードが生成されます(Cコンパイラとは異なります)。現在、このバイトコードには、マシンで実行するインタープリターが必要です。このインタープリターはJVMです。したがって、JVMはそのバイトコード(つまり、マシンに依存しない)を読み取り、AMDが実行します。 OSごとに異なるJVMが設計されており、異なるOSでバイトコードを実行できます。

CまたはC++(プラットフォーム非依存ではない言語)コンパイラーの場合、OS依存の.exeファイルを生成します。この.exeファイルを別のOSで実行すると、このファイルはOS依存であるため互換性がありません。別のOS。

最後に、中間OSの独立したByteコードにより、Javaプラットフォームが独立します。

54
Jatin Khurana

これは、Javaプログラマーが(理論上)マシンまたはOSの詳細を知る必要がないことを意味します。これらの詳細は存在し、JVMおよびクラスライブラリがそれらを処理します。さらに、Cとは対照的に、Javaバイナリ(バイトコード)は、変更または再コンパイルすることなく、まったく異なるシステムに移動できることがよくあります。

25

いいえ、それは逆です。 Javaプログラムが独立するのは仮想マシンを使用するためです。

仮想マシンは独立しているのではなく、システムのタイプに合わせて特別に作成されたものをインストールする必要があります。仮想マシンは、オペレーティングシステムの上に独立したプラットフォームを作成します。

8
Guffa

JVMは、異なるシステムにインストールできる「シミュレートされたマシン」です。このように、同じJavaコードは異なるシステムで実行できます。これは、運用システム自体ではなくJVMに依存しているためです。

つまり、これにより、プログラマは仮想システム(JVM)と通信し、特定のマシンおよびOS機能の代わりにその機能を利用できます。 JavaはJVMのみに依存するため、プラットフォームに依存しません(プラットフォームにJVMがインストールされている場合)。

つまり、Javaはプラットフォームに依存しないため、実行するすべてのシステムにJVMをインストールする必要があります。ただし、JVMがインストールされているすべてのシステムで実行されます。

7
Lars Andren

JavaはJVM(Java仮想マシン)を備えているため、プラットフォームに依存しません。実際の例を使って説明しましょう。あなたが家族に自由であると仮定しましょう。しかし、なぜ?

あなたはそれらをよく知っており、彼らもあなたを知っているからです。しかし、あなたは私の家族には自由ではありません。あなたはそれらを知らず、彼らもあなたを知らないからです。しかし、もし私があなたの友人であり、私があなたを私の家族に紹介できるなら、それであなたは彼らと自由に話すことができるでしょう。

同様に、あなたがコードであり、私がJVMである場合。また、あなたの家族はWindowsプラットフォームであり、私の家族はLinuxプラットフォームです。あなたがC言語または他のプラットフォーム依存言語である場合、あなたはあなたの家族だけを知っています、そしてその逆も同様です。それが、あなたが書かれたプラットフォームだけがそのコードを知っており、それをサポートする理由です。しかし、あなたがJavaコードであり、あなたが私の家族に来たとき、すなわち。 Linuxプラットフォームと、そこにあなたが私を見つけたら、JVM、それから私はあなたに私の家族、Linuxプラットフォームを紹介することができ、あなたはそれと対話することができます。

プラットフォーム依存言語の場合、JVMのような友人がプラットフォームファミリを紹介することはできません。これがJavaがプラットフォームに依存しない方法です。 :)

4
Tazwar Utshas

C/c ++では、コンパイラを使用したコンパイル後のソースコード(cプログラムファイル)は、ネイティブマシンコード(コードをコンパイルする特定のマシンが理解できる)に直接変換されます。したがって、c/c ++のコンパイル済みコードは、異なるOSで実行できません。

しかし、Javaの場合:Java(.Java)のソースファイルは、JVMにインストールされたJVMが理解できるバイトコード(.classファイル)を提供するJAVACコンパイラ(JDKに存在)を使用してコンパイルされます。任意のOS(物理システム)。

ここでは、コードを実行するオペレーティングシステムごとに異なるJVM(プラットフォーム依存)が必要ですが、インストールされているJVMのいずれかが理解できるため、.classファイル(コンパイル済みコード/中間コード)は同じままです。どのOSでも。

C/c ++の場合:ソースコードのみがマシンに依存しません。 Javaでは、ソースコードとコンパイルされたコードの両方がプラットフォームに依存しません。

これにより、Java Platform(machine)が独立します。

3
PRATHIKSHA JAIN

Javaはプラットフォーム非依存ではなく、それ自体はプラットフォームJavaアプリの実行に基づくプラットフォームですが、Javaプラットフォーム自体はプラットフォームに依存します

3
user3647490

JVMは具体的なプラットフォームから抽象化します。プログラムはJVMのみに依存し、JVMはWindowsやLinuxなどのさまざまなプラットフォームで使用できるため、プログラムはプラットフォームに依存しません(ただし、jvmに依存します)。

3
deamon

1:jvm(つまりJava仮想マシン)は、packages.jvmと呼ばれるフォルダー(つまり、中間レベル形式のプログラムのコレクション)に存在するさまざまな機能を提供する多くのファイルを含むプログラムのコレクションです。 o/sにオーバーロードされないようにします。この場合、.classファイルまたはJavaアプリケーションのみを単独で実行するのに役立ちます。 Javaコンパイラは、o/sおよびprocessorに固有ではないバイトコード(.classファイル)の表現を提供します。
2:jvmは、frmバイトコードを受信した後、すべての関数のわかりやすいメモリ割り当てをプロセッサに伝えるために、.exeファイルにバイトコードを作成します。
3:jvmは、制御が実行を終了した後、RAMからメモリ割り当てを解放します。

2
ranjan

簡単な言葉で:

Javaプログラミング言語 プラットフォームに依存しません。

JVM プラットフォームに依存

2
Mohan

JVMはOSに依存しています。 os JVMごとに異なります。

「.class」はすべてのJVMで同じです。そのため、すべてのJVMはその「.class」ファイルデータを理解します。

windows依存JVMはWindowsにWindows依存命令を与えますLinux依存JVMはLinuxにLinux依存命令を与えます。

他のオペレーティングシステムの場合も同様です。そのため、Javaは任意のオペレーティングシステムで実行されます。

JavaがOSに依存しない理由です。

2
time pass

JVMはプラットフォームに依存します。
ただし、生成されるものはプラットフォームに依存しません。 [これをバイトコードと呼ぶか、単にクラスファイルと言うことができます]。そのためJavaがプラットフォーム独立と呼ばれる理由。
WindowsでもMacでも同じクラスファイルを実行できますが、JREが必要です。

1
Nitz

独立していないということは、Javaコードを任意のマシンで実行でき、特別なソフトウェアをインストールする必要がないことを意味します(この場合、JVMはマシンに存在する必要があります)。

Javaを使用すると、Windowsでソースコードをコンパイルでき、JVMを実行している任意のプラットフォームでコンパイル済みコード(正確にはバイトコード)を実行(解釈)できます。はい、JVMが必要ですが、JVMは任意のコンパイル済みコードを実行できます。コンパイル済みコードはプラットフォーム非依存です。

つまり、ソースコードの移植性とコンパイルされたコードの移植性の両方があります。

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

マシンにはCコンパイラがなくても、プラットフォーム固有のバイナリを使用する必要があります。 CまたはC++では、コンパイル済みコードは各アーキテクチャに固有であり、プラットフォームに依存しないです。

つまり、C/C++では、ソースコードの移植性(ある程度の規律はあります)がありますが、コンパイルされたコードの移植性はありません。各アーキテクチャをプラットフォーム固有のバイナリに再コンパイルする必要があります。

1
Pascal Thivent

JavaはJVMで実行されるという点でプラットフォームに依存しません。そうは言っても、ほとんどの一般的なOSプラットフォーム(および一部の組み込みアプライアンス)で具体的に実現された単一の抽象マシンに対するプログラミングによって、プラットフォームに依存しません。

関連するアイデアは、同じOSを異なるハードウェアで実行できるようにする多くのオペレーティングシステムに存在するハードウェアアブストラクションレイヤーです。

あなたの最初の質問では、Turbo Cはjavacプログラムに類似しており、JVMはOS/HALです。

JVMおよびJITコンパイルに関する議論の補足事項です。これは、C#およびCLRの場合とPythonの場合と同じ原則であり、コードが「ハードウェア上で直接」実行されると誰かが言った場合、すでにコンパイルされている命令は最適化を利用できるという点で本当ですmachine/cpuで実行されています。したがって、モジュールの最初のコンパイルがかなり遅い場合でも、次にこのモジュールを実行すると、実行されているコードはネイティブの速度で実行されるため、ハードウェア上で直接実行されます。

0
user1712937

Cソースデータをコンパイルすると、現在のオペレーティングシステムが理解できるネイティブコードが生成されます。このソースコードを他のオペレーティングシステムに移動すると、表現がO.SからO.Sに変更されることを意味するネイティブコードのため、オペレーティングシステムで理解できません。したがって、CまたはC++はプラットフォームに依存します。

Javaの場合、コンパイル後、ネイティブコードの代わりにバイトコードを取得します。バイトコードを実行すると、JVMを使用してネイティブコードに変換され、実行されます。

したがって、Javaはプラットフォームに依存せず、CまたはC++はプラットフォームに依存しません。

0
Monis Majeed

バイトコードはプレートフォームに依存しませんが、バイトコードを独立させるJVMです。バイトコードはマッチンコードではありません。バイトコードは、コンパクトな数値コード、定数、および参照(通常は数値アドレス)であり、プログラムオブジェクトのタイプ、スコープ、ネストの深さなどの解析およびセマンティック分析の結果をエンコードします。したがって、ソースコードを直接解釈するよりもはるかに優れたパフォーマンスが得られます。バイトコードは実行前に解釈する必要があり、これは常にJVMインタープリターによって行われます。

0
ScoRpion

JavaはJava開発者の観点ではプラットフォームに依存しませんが、Javaコードを実行するためにプラットフォーム依存のJVMが必要なエンドユーザーには当てはまりません。基本的に、Javaコードがコンパイルされると、通常プラットフォームに依存しないバイトコードが生成されます。したがって、開発者はプラットフォームシリーズ全体に対して単一のコードを記述する必要があります。しかし、この利点は、このコンパイルされたコードを実行するためにJVMをインストールする必要があるエンドユーザーにとって頭痛の種です。このJVMは、プラットフォームごとに異なります。したがって、依存関係はエンドユーザーに対してのみ有効になります。

0
user1641361

Javac –ソースコードをバイトコードに変換するコンパイラ。 JVM-バイトコードを機械語コードに変換するインタープリター。

わかっているように、Javaは両方ともcompile ** r&** interpreterベースの言語です。ソースコードとも呼ばれるJavaコードがコンパイルされると、ポータブルですべてのオペレーティングシステムで簡単に実行できるBYTE CODEと呼ばれるネイティブコードに変換されます。生成されるバイトコードは、基本的にhexa decimal formatで表されます。この形式は、Solarisワークステーション、Macintosh、Windows、Linuxのすべてのプラットフォームで同じです。コンパイル後、インタープリターは生成されたバイトコードを読み取り、ホストマシンに従って変換します。 。 バイトコードは、インストールするすべてのオペレーティングシステムで使用可能なJava仮想マシンによって解釈されます。したがって、Javaプログラムを新しいプラットフォームに移植するには、インタプリタといくつかのライブラリルーチンを移植します。

それが役に立てば幸い!!!

0
user3401570

良い質問ですが、ソースコードがコンパイラによって中間ネイティブバイトコードに変更され、一度にすべてのチェック(見つかった場合)の後にエラーを与えることでプログラムをバイトコードに変換し、プログラムにインタープリターが必要な場合プログラムを1行ずつチェックし、マシンコードまたはオブジェクトコードに直接変更します。セキュリティ上の理由により、デフォルトでは各オペレーティングシステムにJavaインタープリターを設定できないため、実行するにはjvmが必要ですあなたがここで言ったように異なるOSプラットフォームの独立性は、プログラムがunix、mac、linux、windowsなどのOSで実行できることを意味しますが、これはすべてのOSがなしでコードを実行できることを意味しません仕様、実装、およびインスタンスを言うjvm、次に進むと、バイトコードさえ開くことができるクラスローダーを持つことができるようにPCの構成を変更することにより、Javaバイトコードを実行することもできますアプレットなど-by nimi sh :)幸運を祈ります

0
Nimish Maskara

{App1(Javaコード)------> App1byteCode} ........ {(JVM + MacOS)App1、App2、App3での作業の支援}

{App2(Java Code)-----> App2byteCode} ........ {(JVM + LinuxOS)App1、App2、App3での作業の支援}

{App3(Java Code)-----> App3byteCode} ........ {(JVM + WindowsOS)App1、App2、App3での作業の支援}

これはどのように起こっていますか?

回答:JVMは、JVMがOSと同期しているため、基になるOSに従ってByteCodeおよびResponseを読み取ることができます。

そこで、プラットフォームと同期するJVMが必要であることがわかりました。

しかし、主なことは、プログラマーがプラットフォームの特定の知識を知り、特定のプラットフォームを念頭に置いてアプリケーションをプログラムする必要がないことです。

Javaでのプログラムの書き込みの柔軟性--- ByteCodeにコンパイルし、任意のマシンで実行します(実行するにはプラットフォームに依存するJVMが必要です)Javaプラットフォームに依存しません。

0