ファット
バイナリは、複数の異なる
CPUアーキテクチャに対応する実行コードを一つのファイルに格納した
バイナリ形式です。これにより、異なる
CPUを搭載した
コンピュータ上で、同じ
ソフトウェアを動作させることが可能になります。例えば、ある
ソフトウェアが異なる
CPUアーキテクチャ(例:x86とARM)の両方をサポートする場合、それぞれの
CPU用の実行コードを別々のファイルとして配布するのではなく、一つのファット
バイナリにまとめて配布することができます。
ファットバイナリの利用シーン
ファット
バイナリは、主に以下のような状況で利用されます。
OSのベースCPU変更時の後方互換性維持:
OSがベースとなる
CPUアーキテクチャを変更した場合、古い
CPU向けの
ソフトウェアを新しい
CPU上で動作させるためにファット
バイナリが利用されます。これにより、ユーザは
ソフトウェアを買い換えることなく、新しい環境で既存の
ソフトウェアを利用できます。
異なる最適化を持つCPUのサポート:
同じアーキテクチャでも、
CPUのモデルによって最適な命令セットや命令実行方法が異なる場合があります。ファット
バイナリを利用することで、それぞれの
CPUに最適化された実行コードを一つのファイルに含めることができ、
ソフトウェアのパフォーマンスを最大限に引き出すことができます。
複数アーキテクチャのOSサポート:
OSが複数の
CPUアーキテクチャをサポートする場合、それぞれのアーキテクチャ用の実行コードを一つのファット
バイナリにまとめて配布することで、ユーザは自分の環境に合わせた
ソフトウェアを選択する手間を省くことができます。
Appleが採用した
PowerPCアーキテクチャとx86アーキテクチャ(
Intel Mac)をサポートする
バイナリは、特に
Universal Binaryと呼ばれます。これは、
Appleが
PowerPCからIntel x86アーキテクチャへ移行する際に、
ソフトウェアの互換性を維持するために導入されました。
ファットバイナリのメリットとデメリット
ファット
バイナリのメリットは、主に以下の点です。
配布・管理の容易性: 複数のアーキテクチャに対応した
ソフトウェアを、一つのファイルとして配布・管理できるため、ユーザは自分の環境を意識せずに
ソフトウェアを利用できます。
ソフトウェアの互換性: 異なる
CPUアーキテクチャを搭載した環境でも、同じ
ソフトウェアを動作させることができます。
一方、デメリットとしては、以下の点が挙げられます。
ファイルサイズの増大: 複数のアーキテクチャに対応した実行コードを一つのファイルに格納するため、ファイルサイズが大きくなります。これは、使用しないアーキテクチャのコードも含まれるためです。
macOSでは、初期には
リソースフォークのCODEリソースに
実行ファイルが格納されていましたが、Power Macではデータフォークに格納する方法が採用されました。一方、
Universal Binaryでは、
リソースフォークはあまり使われなくなり、一つのファイルに複数のアーキテクチャの
バイナリを格納する方式が取られています。
具体的には、
Javaプログラムが
CPUを判定し、適切なアーキテクチャの
バイナリを実行します。この
Javaプログラムは、
Javaバイトコードとしてコンパイルされたものが、複数の
バイナリの先頭に配置されています。そのため、
実行ファイルを
バイナリエディタなどで確認すると、
Javaバイトコードであることを示すマジックナンバー(0xCAFEBABE)と、各アーキテクチャ用のマジックナンバーが確認できます。
ファイルサイズ削減のための工夫
ファイルサイズが増大するというデメリットを解消するために、不要なアーキテクチャのコードを削除するユーティリティが利用されることもあります。これにより、必要なアーキテクチャのコードのみを残し、ファイルサイズを削減することが可能です。
ファット
バイナリは、異なる環境で
ソフトウェアを動作させるための重要な技術です。その利用は、
ソフトウェアの利便性を向上させる一方で、ファイルサイズを増大させるというトレードオフがあることを理解しておく必要があります。