Javaなどの一部の言語がコードをほとんどまたはまったく変更せずに両方のLinuxで実行されるのはなぜかと思っていましたが、他の言語ではすべてのコードをほぼ書き直さなければなりません。どうしてこれなの?カーネルのせい?
これが単純な質問である場合は申し訳ありませんが、私は実際には多くの手がかりを持っていません。
また、Linuxの観点から見たCPUアーキテクチャの違いは何ですか。
Javaなどの一部の言語がコードをほとんどまたはまったく変更せずに両方のLinuxで実行されるのはなぜかと思っていましたが、他の言語ではすべてのコードをほぼ書き直さなければなりません。どうしてこれなの?カーネルのせい?
これが単純な質問である場合は申し訳ありませんが、私は実際には多くの手がかりを持っていません。
また、Linuxの観点から見たCPUアーキテクチャの違いは何ですか。
技術的にはあなたは間違っています。
Java は Linux では実行されません。また、Windows では動作しません。Mac でも、他の Unix 系オペレーティング システムでも動作しません。さらに言えば、どのオペレーティングシステムでも実行されません。
マシン上で直接実行されます。Java 仮想マシンという 1 種類のマシンでのみ動作します。幸いなことに、Java 仮想マシンは Linux、Windows、Mac などで仮想化されています。
非常に長い話ですが、本質的には次のとおりです。
Java コードは、バイトコード解釈可能なファイル (.class) に変換されます。これは、Windows、Linux、Mac プラットフォームにインストールできる、プラットフォームに依存する Java 仮想マシンによって解釈および実行されます。
ただし、C/C++コードをプラットフォームに依存しないように努力することはできますが、OS が異なる (場合によってはアーキテクチャが異なる) ため、実行するすべてのシステムでその (同じ) コードをコンパイルする必要があります。その特定のマシンで実行される適切なバイナリを構築します。
OBS: コードの独立性を高めるには、すべてのシステムで利用可能なライブラリを使用する必要があります。
OBS2: 実行可能ファイルについて詳しく知るには、良い「答え」のある良い「質問」があります:実行可能ファイルには実際に何が含まれていますか?
Java はマシン コードにコンパイルされるのではなく、JVM (Java 仮想マシン) によって実行されるバイト コードにコンパイルされるためです。JVM は、OS 固有の処理を行います (また、OS 機能への統一されたインターフェイスを Java プログラムに提供します)。
Java は、Java 仮想マシン (JVM) と呼ばれる仮想コンピューター上に構築されます。JVM がコンピュータに適切に実装されている限り、すべての Java プログラムはほとんど労力をかけずに実行できます。注意点は、ハードコードされたパス名など、コード自体にオペレーティング固有の項目が含まれている場合です (これらは、たとえば、Unix と Windows で異なります)。
問題は言語ではなく、使用するライブラリにあります。私は、Windows と Linux の両方で同じコードの 99% を簡単に使用するプロジェクトに取り組んでいます。これができるのは、Windows と Linux の両方に実装されたライブラリを使用しているためです。ライブラリは、プラットフォーム固有のコードをカプセル化します。Java も同じです。プラットフォームごとに異なる方法で実装された標準ライブラリがあります。