【コラム】

OS X ハッキング!

138 Mac on Intelへの道のり - Mach-Oから探る

    海上忍  [2005/06/13]

    6月といえば紫陽花の季節。酸性の土壌では青色が、アルカリ性の土壌では赤色が強く出るようですが、咲き始めは薄い緑色が多いらしい。雨が続くと出不精になりがちですが、折を見てデスクトップピクチャ用に紫陽花の写真を撮りに行こうと思います。

    さて今回は、Mac OS X標準のバイナリフォーマットである「Mach-O」について。先日のWWDC 2005で発表されたIntelアーキテクチャへの移行に関連するトピックなだけに、いろいろ気になる読者にはぜひともお目通しいただきたい。

    Mach-Oへのシフトを進めた"意図"

    基調講演でSteve Jobs CEOは、これまでMac OS Xの全バージョンをIntelマシンで稼働させていた事実を明らかにしたが、それはさほど驚くべきことではないと思う。実際、Mac OS X 10.0のベースとなったDarwin 1.2.1はIntelマシンで動作確認されていたし、次のDarwin 1.3.1からは継続的にIntelマシン用のバイナリパッケージも提供された。当時このような記事を書いた経験から言わせていただくと、"Intel版Mac OS X"はドライバを開発する労力を除けばPowerPC版と同等、GUIなどプロプライエタリな部分にPowerPCに大きく依存したコードがあるかもしれないが、Appleさえその気になればいつでも製品化できる状況にあったはずだ。

    それを何故見送り続けたか? 利益の大半をハードウェアの製造/販売に依拠するというAppleの収益構造上、アーキテクチャの変更は大冒険であったことは想像に難くないが、旧Mac OSの資産を簡単には放棄できないという難題も影響していたに違いない。それは、バイナリフォーマットの変遷から読み取れるはずだ。

    Mac OS Xでは、旧Mac OSとMac OS Xどちらでも動作する「CFM」と、Mac OS Xのみ動作可能な「Mach-O」という2種類のバイナリフォーマットをサポートしているが、マルチスレッドなどBSDレイヤの機能までフルに活用できるのはMach-Oのみであり、AppleもMach-Oの利用を時間をかけて開発者に訴えてきた。最近公開されたアプリケーションの多くがMach-Oベースであることからすると、開発者側のMach-Oへのシフトはほぼ完了したと判断して差し支えないだろう。

    MABというカラクリ

    Mach-Oへのシフトは、Intelアーキテクチャへの移行において重要な意味を持つ。というのも、複数の区画を設けることが可能というMach-Oの特徴を利用すれば、複数の異なるアーキテクチャの実行コードを収めた単一のバイナリ(MAB : Multi Architecture Binary)を生成できるからだ。MABの利用を前提に考えると、CFMおよびClassic環境を過去の技術にするというAppleの方針は、アーキテクチャ変更への布石だったのかとも受け取れる。

    このMABは目新しい技術ではなく、NEXTSTEPがx86アーキテクチャに移植された頃に実用化されたものだ。実際、NEXTSTEP 3.3J for Intelが稼働している筆者のノートPC(現役!)には、4種類のCPU(68k/x86/HPPA/SPARC)に対応したパッケージがいくつもインストールされている。

    参考までに、NEXTSTEP 3.3JにおいてMABがどのように"見える"かを説明しておこう。

    まず、コンパイル済のアプリケーション。NEXTSTEP/OPENSTEPのアプリケーションは、Mac OS Xにも採用されているバンドル構造を持ち、バイナリは*.appディレクトリ直下に置かれているため、それをfileコマンドで調べれば対応するアーキテクチャが判明する。たとえば、Mac OS Xにも移植されている画像表示ソフト「ToyViewer.app」の実行例は図のとおりとなる。

    図 : NEXTSTEP 3.3JでMABバイナリを確認してみたところ。4種類のアーキテクチャに対応していることがわかる

    アプリケーションを書庫化したパッケージ(*.pkg)には、面白い仕掛けが用意されている。複数のアーキテクチャに対応したパッケージの場合、利用しているアーキテクチャ以外のバイナリはインストール時に削られ、ファイルシステム上には"痩せた"バイナリがコピーされることになる。

    この2点を踏まえたうえで、先日公開されたIntelアーキテクチャ対応の開発環境で生成したバイナリを確認すると、基本的にはNEXTSTEP/OPENSTEPの技術を踏襲していることがわかる。アプリケーション(バンドル)の内部では、アーキテクチャ非依存のリソースファイルは共有、プログラム本体も同一のファイルを使用する。バンドル内部の構造こそNEXTSTEP/OPENSTEPの時代から変化したが、Mach-Oの特徴であるMABをうまく生かしている点は同じだ。

    紙幅が尽きたので、今回はここまで。次回も、確実に到来する"Intel時代"を現在のリソースから読み取る作業を続けてみたい。

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン