FreeBSD 2.X についての FAQ (よくある質問とその答え) : その他の質問 : それにしても, なぜそんなに多くのフォーマットがあるのですか?
Previous: FreeBSD の実行フォーマットの a.out はどのようなものですか, a.out を使う理由, ELFを使う理由は何でしょう?
Next: なぜシンボリックリンクのパーミッションは chmod で変えられないのですか?

12.3. それにしても, なぜそんなに多くのフォーマットがあるのですか?

もうおぼろげになってしまった暗い過去に, 単純なハードウェアが ありました. この単純なハードウェアは, 単純で小さなシステムを サポートしていました. a.out はこの単純なシステム (PDP-11) での 作業を行なうバイナリとして完全に適したものだったのです. 人々はこの単純なシステムから UNIX を移植する際に, a.out フォーマットをそのまま使いました. というのは Motorola 68k, VAXen, といったアーキテクチャへの UNIX の初期の移植ではこれで十分だったからです.

やがてある聡明なエンジニアがソフトウェアでちょっとした トリックを使うことを決めました. 彼はいくつかのゲートを削り取って CPU のコアをより速く走らせることができたのです. これは 新しい種類のハードウェア (今日では RISC として知られています) で 動いたのです. a.out はこのハードウェアには 適していなかったので, このハードウェア上で多くのフォーマットが, 限定された単純な a.out フォーマットでのものよりもより良い パフォーマンスを出すことを目指して開発されたのです. COFF, ECOFF, そしていくつかの有名でないフォーマットが ELF が標準になる前に開発され, それらの限界が探求されたのです.

さらに, プログラムサイズは巨大になり, ディスク (および物理メモリ) は依然として相対的に小さかったため, 共用ライブラリのコンセプトが 誕生しました. また, VM システムはより複雑なものになりました. これらの個々の進歩は a.out フォーマットを使用して遂げられましたが, その有用性は新しい機能とともにどんどん広がってきました. これらに加え, 実行時に必要なものを動的にロードする, または 初期化コードの実行後にプログラムの一部を破棄し, コアメモリおよび / またはスワップ空間を節約するという要望が高まりました. プログラミング言語はさらに複雑になり, main 関数の前に自動的に コールされるコードの要望が高まりました. 多くの機能拡張がおこなわれ, a.out フォーマットがこれらすべてを 実現できるようになり, それらはしばらくは基本的に動作していました. やがて, a.out はコードでのオーバヘッドと複雑さを増大させずに これらの問題すべてを処理することに無理がでてきました. 一方, ELF はこれらの問題の多くを解決しますが, 現状稼働している システムからの切替えは厄介なものになるでしょう. そのため ELF は, a.out のままでいることがELF への 移行よりももっと厄介なものになるまで待つ必要がありました.

しかし時が経つにつれ, FreeBSD のビルドツールの元となったツー ル群(特にアセンブラとローダ)と FreeBSD のビルドツール群は異なっ た進化の経路をたどりました. FreeBSD のツリーでは, 共有ライブラ リが追加され, バグフィックスも行われました. もともとのツール群 を作成した GNU の人たちは, プログラムを書き直し, クロスコンパ イラのサポート, 異なるフォーマットを任意に取り込む機能などを追 加していきました. 多くの人々が FreeBSD をターゲットとしたクロ スコンパイラの構築を試みましたが, FreeBSD の使っている as と ld の古いプログラムコードはクロスコンパイルをサポートしておら ず, うまくいきませんでした. 新しい GNU のツール群 (binutils) は, クロスコンパイル, 共有ライブラリ, C++ 拡張などの機能をサポー トしています. さらに数多くのベンダが ELF バイナリをリリー スしています. FreeBSD にとって ELF バイナリが実行できる ことは, 非常にメリットがあります. ELF バイナリが FreeBSD で動くのなら, a.out を動かすのに手間をかける必要はありま せんね. 長い間忠実によく働いた老いた馬は, そろそろ牧草地で休ま せてあげましょう.

ELF は a.out に比べてより表現力があり, ベースのシステム に対してより幅広い拡張性を提供できます. ELF 用のツールは よりよく保守されています. また多くの人にとって重要なクロスコン パイルもサポートしています. ELF の実行速度は, ほんの少し a.out より遅いかもしれませんが, 実際に速度の差をはかるのは困難 でしょう. ELF と a.out の間には, ページマッピング, 初期化 コードの処理など多くの違いがありますが, とりたてて重要なものは ありません. しかし違いがあるのは確かです. ほどなく, GENERIC カー ネルから a.out のサポートが外さます. a.out のプログ ラムを実行する必要性がなくなれば, 最終的に a.out のサポー トはカーネルから削除されます.


FreeBSD 2.X についての FAQ (よくある質問とその答え) : その他の質問 : それにしても, なぜそんなに多くのフォーマットがあるのですか?
Previous: FreeBSD の実行フォーマットの a.out はどのようなものですか, a.out を使う理由, ELFを使う理由は何でしょう?
Next: なぜシンボリックリンクのパーミッションは chmod で変えられないのですか?