● ToolBox API徒然草(2006/09/09)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 Carbonモダンアプリケーションへの道(その1) 〜


今回からは、「Carbonモダンアプリケーションへの道」というテーマで、Carbon APIに関連する最新の話題を取り上げてみます。

「モダンアプリケーションを作りたければCocoaを使えば?」という意見もあるでしょうが(笑)、それを言ってしまうと本連載の意味が無くなりますので、「最近のCarbon APIも随分とモダンになったもんだ」という暖かい眼差しで気長にお付き合いください。具体的には、自作ソースコードに太古から鎮座している「レガシーなCarbon API」を、最近登場した「モダンなCarbon API」に差し替えていく作業を解説します。例えば描画処理であれば、QuickDraw APIを用いている箇所をQuartz 2D(Core Graphics)APIで差し替える作業などが対象となります。当然、新しいAPIはMac OS Xに最適化されていますので、こうした差し替え作業の積み重ねが、自作アプリケーション全体のパフォーマンスや操作性の向上につながるわけです。

それから、今回は、モダンAPIへの差し替え作業を急がなければならないもうひとつの大きな理由が存在します。Mac OS Xが登場した時、我々デベロッパーは自作アプリケーションを延命するため、ソースコードに記していた旧ToolBox APIの多くをCarbon APIへと差し替えました。この作業を「アプリケーションのCarbon化」などと呼んでいましたが、確か、System 7が登場した時や、MacintoshのCPUがIBMのPowerPCに切り替わった時にも、小規模でしたが、そうした差し替え作業を行った記憶があります。しかし、インテル版CPUを搭載したMacintoshの登場で発生した「Universal Binary化」においては、こうしたAPIの差し替え作業は不要でした。そんなわけで、少々油断をしていたら、実際にはその裏で、Apple社による今までにない大規模な「API切り捨て作戦」が展開されていたのです。

Carbon Frameworkを用いてプログラミングをされている方は既にご存じだと思いますが、Mac OS X 10.4(Tiger)のDeveloper Tools(Xcode Tools)では、Apple社が「これからは使うことを推奨しない」と明言したAPIの存在を確認することができます。Framworkのヘッダファイルの定義に「*** DEPRECATED ***」というコメントが入っているAPIがその対象です。Xcode 2.3で「Mac OS X 10.4(Universal)SDK」を用いている場合、もしソースコードにこうしたDEPRECATED APIが記述されていると、コンパイル中にその都度警告が表示されます。古いソースコードを実際にコンパイルして試してみると、ちょっとした規模のものでも数百、プロジェクトが大規模になれば1万を越える警告が表示される場合もあります。それほど多くのAPIが、Apple社により「推奨しない」という烙印を押されたことになるわけです。

例えば、数百ものAPIが定義されているQuickDraw.hヘッダファイルでは、コールバック用のUniversal Procedure Pointer API(名称の最後がUPP)を除くと、生き残っているAPIはわずか60弱のみです。それ以外はすべてDEPRECATEDとなっています。また、QD.hの一部である、QuickdrawText.hやQDOffscreen.hを見てみると、既存APIは全滅していることが分かります(涙)。ところで、Xcodeが表示する警告ですが、なにやら「旧友」をバカにされているような気分になり、古くからのMacintoshプログラマにとっては感じ良くありません...。この警告の除外は、プロジェクトアイコンやターゲットアイコンを選択し、「情報を見る」で表示されるウィンドウの「ビルド」タブで行います。上部のコレクションメニューから「GNU C/C++コンパイラ4.0」「警告」を選び、「推奨されない関数についての警告」のチェックを外しておけばOKです。

では、DEPRECATEDと言うのは具体的に何を指すのでしょうか?そして、このAPIの運命はいったいどうなるんのでしょうか(Cocoaにもあるらしい)?「推奨されない」とは、こうしたAPIがそのうちシステムから完全に取り除かれることを意味しています。とは言っても、今すぐ取り除いてしまうと、そのAPIを用いているアプリケーションは、その時点で起動不可になります。昔々、Apple社は、SCSI ManagerのAPIを完全に削除してデベロッパーから大ひんしゅくを買ったことがありました。そうした経験上、突然の廃止はあまりにも無謀だと理解しているでしょうから、API自体はしばらくの間システム中に残るはずです。その代わり、最新SDKのヘッダファイルからはAPI定義が削除されるでしょう。現状でも、ヘッダファイルには定義されていないが、システム内には存在していて機能しているAPIがいくつかあります。

こうした移行はいつ起こるのでしょうか?それがデベロッパーとして最も気になる点ですが、困ったことにApple社はその時期を明言していません。つまり「そのうち」と言うことのようです(涙)。例えば、ヘッダファイルからの定義削除がMac OS X 10.5で実行されたと過程しましょう。Xcodeプロジェクトにおいて、最新のSDK(Mac OS X 10.5 SDK)を用いCarbon Frameworkをリンクすると、DEPRECATED APIを含んだソースコードは「未定義エラー」で正常にMakeできなくなります。つまり、DEPRECATED APIをソースコードにひとつでも含んでいるアプリケーションは、10.5の最新SDKを用いて開発を継続することが不可能になるわけです。ただし、API自身はシステムに存在しているので(多分)、Mac OS X 10.4 SDKを用いて開発したアプリケーションは、10.5でも起動できます。

さて、Mac OS Xが登場して既に5年以上経過していますので、モダンだと言っても導入されてから随分と時間が経っているAPIもあります。しかし、いまだしぶとくMac OS 9が生き残っている現状を見れば、有名なアプリケーションであろうが、そのソースコード内にレガシーAPIが大量に生き残っている可能性は大です。まあ、今回のような大規模なAPI廃止は、デベロッパー側にも大きな負担をかけますので、差し替え作業まで手が回らないのが現実でしょう(Universal Binary化だけでも大変なのに...)。そんなわけで、この件に関しては、Apple社の舵取りが重要な意味を持ちます。うまく裁いて欲しいところです。そして、お願いですから、API自体の破棄は10年後ぐらいにしてください(笑)。

次回は、もう少し詳しくDEPRECATED APIを調査してみたいと思います。いったい、どんなAPIが消え、どんなAPIが生き残ったのか?APIの差し替え作業をするにも、まずこの点を把握しておかなければ始まりません。


copyright 2006 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp