Apple Developer Connection
高度な検索
Member Login ログイン | ご入会 ADC連絡先

>Adopting Universal Binaries on Mac OS X

すでに耳に達していると思いますが、Mac OS Xはインテルアーキテクチャ上で動作しており、インテルをベースにした初のMacintoshもまもなく登場します。そして開発者へのメッセージもはっきりしています。つまり、PowerPCバージョンのアプリケーションを引き続き提供しながら、同じアプリケーションのインテルバージョンを準備しようというものです。

Mac OS Xでの並外れたパフォーマンスを維持し、さらに向上できるようにする一方で、この移行を楽に進められるように、アップルは1つのパッケージに両方のアーキテクチャのネイティブコードを入れる形式であるUniversal Binaryを導入しました。Universal Binaryによって、アプリケーションはPowerPCおよびインテルベースのMacintoshでネイティブに動作します。Mac OS Xプラットフォームでは、今後何年間も両方のアーキテクチャがサポートされることになるので、アプリケーションで両方のアーキテクチャをサポートすることは不可欠です。そして、今こそがUniversal Binaryへの移行を開始すべき好機です。

この新しいチップアーキテクチャに移行することで得られるメリットは、とりわけパフォーマンスの領域で大きいので、Mac OS Xの開発者にとっては面白い時です。

今こそ、この目標を達成するためにアプリケーションが必要とする変更について考え始める好機です。アプリケーション開発者は、Universal Binaryを作成するプロセスが簡単なものであり、いくつかの要素にもよりますが、微々たる作業で済む場合もあることに気付くでしょう。一般に、標準のプログラミングガイドラインに従って書かれたアプリケーションは、最も簡単にUniversal Binaryに変換できます。

本稿では、Mac OS XのUniversal Binaryについて紹介します。プロセスと課題について概観し、Universal Binaryを書き始めるのに役立つ詳細を提供するいくつかの参考資料へのリンクも掲載します。Mac OS Xですでに開発をしていたり、Mac OS Xでの開発を検討している場合は、本稿を読んで、インテルベースのMacへの移行準備に必要な事柄を明確に理解しましょう。

プラットフォーム

アップルは、Mac OS Xを移行のために準備しておくという仕事を、静かに、しかし周到に行ってきました。Mac OS Xは、Mac OS X 10.0から最新出荷バージョンのMac OS X v10.4 Tigerまで、過去5年間にわたって、インテル上でビルドされてきました。つまり、Mac OS Xはその成り立ちからクロスプラットフォームであり、移行に関する作業の大半はすでに完了しています。Worldwide Developers Conference 2005に至るまでに、アップルはMac OS Xがインテル上で「動作」するようさらに努力し、PowerPC上のMac OS Xと同程度までに引き上げています。

オペレーティングシステムの準備はできているので、アップルがインテルベースの初のMacを用意している間に、コードを準備するのが開発者としての仕事になります。そのための方法は、必ずXcodeを使用し、アプリケーションをUniversal Binaryとしてビルドするのに必要なことを実行することです。

ツール

アップルのツールスイートおよび統合開発環境(IDE)であるXcodeは、Universal Binaryをサポートするために更新されました。Xcode 2.1以降は、インテルおよびPowerPCバージョンのアプリケーションの一方または両方を選択できる、いまや周知の「Architectures to build for:」チェックボックスを備えてます。両方のアーキテクチャで実行可能なコードが、単一のアプリケーションバンドルに含まれています。実行時に、オペレーティングシステムがバンドルを調べ、基盤のハードウェアに適合するコードを選択します。これは透過的にすばやく実行されるため、ユーザが関与する必要がありません。

XcodeはMac OS X Tiger向けのアプリケーションを開発し、Mac OS Xが備えている素晴らしいテクノロジーをすべて利用するための速くて簡単な方法です。Xcodeはアプリケーションを将来に向けて準備を整える最良の方法でもあります。Xcodeは、UNIXの能力と高性能な開発テクノロジーを融合します。これにMac OS Xの使いやすさが加わることで、結果として最高のMac OS Xアプリケーションを開発するための比類のないツールスイートとなっています。

Xcode 2.1以降には、Fix and Continue、ZeroLink、予測コンパイル、リモートデバッグ、分散ビルドなどのテクノロジーが盛り込まれています。XcodeにはGCC 4も含まれています。GCC4は、アプリケーションを高速化するように設計された高度な最適化手法がいくつか盛り込まれた業界標準コンパイラです。これらの中で最も重要なのはTree SSA(Single Static Assignment:単一静的代入)の使用です。Tree SSAは、言語およびターゲットに依存しないように設計されており、以前のバージョンのコンパイラでは不可能だったレベルのコード分析と最適化を可能にします。

アーキテクチャの相違点

チップファミリ間のアーキテクチャの違いによって、開発者が認識し、場合によってはソースコードを修正する必要がある一般的な注意点がいくつかあります。たとえば、次のような点です。

  • PowerPCとインテルファミリでは、命令アラインメントに関するルールが異なります。PowerPCの命令はすべて、サイズが4バイトであり、4バイトの境界に揃える必要があります。インテル命令は、サイズが可変(1バイトから10バイト)であるため、結果として境界揃えの必要がありません。
  • バイト順序、つまりはエンディアンに応じて、値の先頭または末尾のメモリアドレスのどちらに対して値の最上位バイトの格納とアクセスを行うかが決まります。PowerPCは最上位バイトを先頭に格納しますが(ビッグエンディアン)、インテルは最下位バイトを先頭に格納します(リトルエンディアン)。
  • 整数型のゼロによる除算は、インテルシステムでは致命的な結果となりますが、PowerPCシステムでは処理が継続され、ゼロが返されます。
  • インテルでのC言語の呼び出し規則(アプリケーションバイナリインターフェイス、ABI)では、関数の引数をスタックに渡すように指定します。PowerPCのABIでは、関数への引数はレジスタを使用して渡すものと指定されています。

このような注意点は、『Universal Binaryプログラミングガイド』で詳しく説明しています。

アプリケーション

アプリケーションのUniversal Binaryバージョンを作成する必要はあるのでしょうか。これはアプリケーションのタイプによります。ウィジェット、スクリプト、およびJavaアプリケーションは、それらのアプリケーションの性質により、再コンパイルなしで「そのままで機能」します。ウィジェットとスクリプトはインタプリタによって実行され(コンパイルはされない)、Javaアプリケーションはすでにポータブルなフォーマットです。

Xcodeを使って作成したCocoaアプリケーションは、再コンパイルの前に若干の調整が必要になる場合もありますが、全体の労力は少なくて済みます。たとえば、インテルベースのMacintoshでは、nilへ送られるObjective-Cのメッセージは、floatまたはdoubleとして型指定された戻り値として無意味な値を返します。PowerPCベースのMacintoshでは、これらのメッセージは0.0を返します。また、Cocoaフレームワークはエンディアン問題を透過的に処理しますが、許容限度が低いグラフィックAPIおよび外部C/C++ APIを使用するときには注意してください。

Xcodeで開発したCarbonアプリケーションは、さらにもう少しの調整と再コンパイルを必要とするかもしれませんが、比較的容易にビルドできるはずです。たとえば、QuickDrawのPictureデータ構造体のpicFrameフィールドに直接アクセスする既存のコードがある場合は、QuickDraw関数のQDGetPictureBoundsを使用して、Pictureの適切にスワップされた境界を取得するようにします。また、カスタムリソースを使用するCarbonアプリケーションは、エンディアンを処理するために再編成する必要がある場合もあります。

Metrowerks CodeWarriorで作成されたCarbonアプリケーションは、まずXcodeに移行し、次に前述した調整と再コンパイルが必要になります。アプリケーションをCodeWarriorからXcodeへ移行するガイドラインについては、『Porting CodeWarrior Projects to Xcode』を参照してください。この移植ガイドでは、pragma文の処理など、多数の課題について説明しています。GCCコンパイラはCodeWarriorで定義されているほとんどのpragmaをサポートしていませんが、XcodeはCodeWarriorがpragmaを通じてサポートしているディレクティブの多くに対してビルド設定を提供します。GCC 4は厳格で標準に準拠したコンパイラなので、コード内の修正すべき問題にフラグを立てることがありますが、これはアプリケーションの品質と安定性の向上に役立ちます。

アプリケーションに対するプラグインAPIを用意する場合は、プラグイン開発者のことを考えて、アプリケーションで2つのアーキテクチャをサポートする方法を決めてください。

以上は、ごく一部の例にすぎません。詳細については、『Universal Binaryプログラミングガイド』を参照してください。

Universal Binaryの作成

アプリケーションのUniversal Binaryを作成するプロセス全体は簡単です。依存関係を確認し、アプリケーションをビルドし、実行するだけです。以下は詳細ではなく、概略的な手順です。詳細については、本稿の末尾にある参考資料を参照してください。

まず、サードパーティ製のライブラリ、プラグイン、およびカーネル拡張に対するアプリケーションの依存関係を確認します。依存関係が少ないほど、このプロセスが簡単に済む可能性が高くなります。依存関係を排除できるか、更新されたバージョンを入手できる場合は、仕事が簡単になります。また、今こそハードウェアの依存関係を可能であれば抽象化または排除する好機です。マシンの低レベルの詳細を隠してくれる高レベルのAPIを使用しましょう。

次に、アプリケーションをビルドするために、コードをXcode 2.1以降およびGCC 4に移行する必要があります。GCCは、Xcodeでアプリケーションをコンパイルしてリンクするために使用するオープンソースのGNUコンパイラコレクションです。コードがそれ以前のバージョンのGCC(該当する方は分かるでしょう)またはCodeWarriorと依存関係にある場合は、事前にいくらか状態を整えておく必要があることもあります。CodeWarriorの場合の一般的な注意点については、上記の「アプリケーション」で簡単に説明しました。

次のステップでは、Universal Binaryをビルドするためのビルド環境を構成します。すでに旧バージョンのXcodeを使用している場合は、Xcode 2.1以降にアップグレードするだけで十分です。プロジェクトでXcodeを使わず、GCCのみを使っている場合は、インテルベースのビルド環境のために環境設定スクリプト、makefile、および他のカスタムビルドツールを再編成する必要があるかもしれません。

注意:Universal BinaryはPowerPCまたはインテルベースのMacintoshのいずれかで作成できますが、作成したアプリケーションを徹底的にテストするにはPowerPCおよびインテルベースのMacintoshの両方が必要になります。

また、アプリケーションをいくつかの小さいAPI変更に適応させる必要もあります。アップルが提供するアクセサ関数を経由しないで、コードが構造体の特定のフィールドに直接アクセスする場合、またはビット操作を実行する場合は、アプリケーションの該当する部分を更新する必要がある可能性があります。このプロセスの詳細については、『Universal Binaryプログラミングガイド』を参照してください。

アプリケーションのビルドができたら、実行して、問題が起きないか確認します。エラーを修正したら、完了です。

Developer Transition Kit

Universal Binaryを作成してテストする最善の方法は、インテルベースのMacintoshを使用することです。Developer Transition Kitに、インテル上のMac OS Xでアプリケーションを開発するために必要なすべてが含まれています。これはまた、Universal Binaryのインテルとの互換性をテストするために現在利用できる唯一のプラットフォームでもあります。このキットは、3.6 GHz Pentium 4プロセッサとインテル用のMac OS X 10.4(プレビューリリース)を搭載したPower Macintoshが含まれます。また、Universal BinaryをビルドするためのXcode 2、『Universal Binaryプログラミングガイド』、およびUniversal Binaryの互換性を確保するのに必要な簡単な手順の実例を示すサンプルコードも含まれています。これは開発専用のプラットフォームであり、2006年末までにユニットをアップルに返却する必要があります。 このキットは、Apple Developer Connection SelectメンバおよびPremierメンバ限定で999ドルの価格で提供されます。

詳細情報

もっと詳しく知りたいですか?以下に、取り組みを始めるのに役立つ追加の情報源を列挙します。

発表

このエキサイティングなアップルの新しい方向性については、Worldwide Developers Conference 2005の基調講演におけるスティーブ・ジョブズの発表をご覧ください。

ツール

Developer Transition Kitは、インテルベースのMacintoshでアプリケーションの移植とテストを開始する最も手っ取り早い方法です。この安価で効率的なプラットフォームには、取り組みを始めるのに必要なすべてが含まれています。

開発者の方は全員、『Universal Binaryプログラミングガイド』を読む必要があります。このドキュメントには、移植にかかわる問題、PowerPCとインテルのアーキテクチャの違い、データアラインメント、バイトスワップ、およびAltivecとSSEに関する詳細な情報が含まれています。これらは説明されているトピックのごく一部にすぎません。

Universal Binaryをビルドするための開発環境となるXcode 2.1以降は無償でダウンロードできます。開発者の方はXcodeに関する質問をXcode-usersメーリングリストに投稿できます。

CodeWarriorユーザの方は、XcodeとCodeWarriorの違い、CodeWarriorプロジェクトをXcodeにインポートする方法、および変換にかかわる多くの問題の詳しい情報について理解を深めるために、『XcodeへのCodeWarriorrプロジェクトの移植』をお読みください。

記事

Universal Binaryと移植プロセスについて述べている開発者の方々の意見をお読みください。

Apple Developer Connectionでは、Mac OS Xアプリケーションを開発し、インテルに移植している各社の経験を定期的に記録しています。最近の記事では、StickyBrain製品、およびApple Design Awardを受賞したComic Lifeを中心に取り上げています。

掲載日:2004-08-26