web-dev-qa-db-ja.com

実行可能ファイルがOSではなくCPUに依存しているのはなぜですか?

Cプログラムを作成して.exeファイルにコンパイルすると、.exeファイルにはCPUへの生のマシン命令が含まれます。 (おもう)。

もしそうなら、最新バージョンのWindowsを実行しているコンピューターでコンパイル済みファイルを実行するにはどうすればよいですか? CPUの各ファミリには、異なる命令セットがあります。では、物理CPUに関係なく、適切なOSを実行するコンピュータが.exeファイルの命令を理解できるようになるのはなぜですか。

また、一部のアプリケーションの「ダウンロード」ページにあるWebサイトでは、Windows、Linux、およびMac(86および64ビットコンピューターの場合、多くの場合、OSごとに2つのダウンロード)のダウンロードがあります。 CPUのファミリごとに、ダウンロード数が増えないのはなぜですか?

17
Aviv Cohn

実行可能ファイルは、OSとCPUの両方に依存します。

  • 命令セット:実行可能ファイルのバイナリ命令は、いくつかの命令セットに従ってCPUによってデコードされます。ほとんどのコンシューマーCPUは、x86(「32ビット」)またはAMD64(「64ビット」)命令セットをサポートしています。プログラムは、これらの命令セットのいずれかに対してコンパイルできますが、両方に対してコンパイルすることはできません。これらの命令セットには拡張機能があります。これらのサポートは実行時に照会できます。たとえば、そのような拡張機能はSIMDサポートを提供します。最適化コンパイラーは、これらの拡張機能が存在する場合、それらを利用しようとするかもしれませんが、通常、拡張機能なしで機能するコードパスも提供します。

  • バイナリ形式:実行可能ファイルは特定のバイナリ形式に準拠している必要があります。これにより、オペレーティングシステムはプログラムを正しくロード、初期化、および起動できます。 Windowsは主にPortable Executable形式を使用し、LinuxはELFを使用します。

  • システムAPI:プログラムはライブラリを使用している可能性があります。ライブラリは実行システムに存在している必要があります。プログラムがWindows APIの関数を使用する場合、Linuxでは実行できません。 Unixの世界では、中央オペレーティングシステムAPIはPOSIXに標準化されています。POSIX関数のみを使用するプログラムは、Mac OS XやSolarisなどの準拠したUnixシステムで実行できます。

したがって、2つのシステムが同じシステムAPIとライブラリを提供し、同じ命令セットで実行し、同じバイナリ形式を使用する場合、一方のシステム用にコンパイルされたプログラムはもう一方のシステムでも実行されます。

ただし、互換性を高める方法はいくつかあります。

  • AMD64命令セットで実行されるシステムは、通常、x86実行可能ファイルも実行します。バイナリ形式は、実行するモードを示します。 32ビットプログラムと64ビットプログラムの両方を処理するには、オペレーティングシステムによる追加の作業が必要です。

  • 一部のバイナリ形式では、ファイルに、異なる命令セット用にコンパイルされたプログラムの複数のバージョンを含めることができます。このような「ファットバイナリ」は、PowerPCアーキテクチャからx86への移行中にApple=によって推奨されました。

  • 一部のプログラムはマシンコードにコンパイルされず、中間表現にコンパイルされます。これは、オンザフライで実際の命令に変換されるか、解釈される場合があります。これにより、プログラムが特定のアーキテクチャーから独立します。このような戦略は、UCSD pシステムで使用されました。

  • 1つのオペレーティングシステムで複数のバイナリ形式をサポートできます。 Windowsはかなり下位互換性があり、DOS時代のフォーマットをサポートしています。 Linuxでは、WineはWindowsフォーマットのロードを許可します。

  • あるオペレーティングシステムのAPIは、別のホストOS用に再実装できます。 Windowsでは、CygwinとPOSIXサブシステムを使用して、(ほとんどの)POSIX準拠の環境を取得できます。 Linuxでは、WineはWindows APIの多くを再実装しています。

  • クロスプラットフォームライブラリを使用すると、プログラムをOS APIから独立させることができます。多くのプログラミング言語には、これを実現しようとする標準ライブラリがあります。 JavaおよびC.

  • エミュレータは、外部バイナリ形式を解析し、命令を解釈して、必要なすべてのAPIの再実装を提供することにより、異なるシステムをシミュレートします。エミュレーターは、最近のPCで古いNitendoゲームを実行するためによく使用されます。

37
amon

Windowsを実行している現在のPCの99%には64ビットプロセッサが搭載されており、32ビットソフトウェアを実行することもできます。残りの1%には32ビットプロセッサが搭載されています。したがって、32ビットプロセッサ用に構築されたソフトウェアはどこでも実行できます。 64ビットプロセッサ用に構築されたソフトウェアは、ソフトウェアの作成者が関心を持つすべてのPCで実行されます。

MacOS XおよびiOSは「ファットバイナリ」をサポートしています。実際にダウンロードするものには、異なるプロセッサのバージョンが含まれている場合があります。だれもPowerPCプロセッサ用のアプリケーションを作成しなくなりましたが、数年前のある時点で、実行可能ファイルにPowerPC、32ビットIntel、および64ビットIntelバージョンを含めることができ、適切なバージョンが実行されました。最近のiOSでは、アプリをダウンロードすると、デバイスのプロセッサに適したバージョンが表示されます。別のデバイスにダウンロードすると、別のバージョンを入手できます。ユーザーにはまったく見えません。

2
gnasher729