iPhone SDK、第一印象
iPhone SDKとObjective-C:ニートは社会のメモリーリーク?!

iPhone SDK、Objective Cが持つ「進化する能力」の遺伝子

 Objective Cの勉強から始めなければならないiPhone SDKは、いきなりコードを書き始めることが出来ない点が少しもどかしい。しかし、C++に関しては最初の商用コンパイラが出たころからの付き合いだが、Objective Cに関してはまったく付き合いがなかった私としては、結婚20年にして初めて浮気をするかのようなドキドキ感とともにObjective Cとの最初のデートに臨んでいる、という感覚。

 すなおな目でObjective Cを見なければならないのにも関わらず、ついついC++と比べてしまう私。個々のシンタックスの違いに目を奪われつつも、言語仕様の背景にある設計思想を読み取ろうとする行動は、外見だけに捕われず彼女の中身を理解しようとする行動と同じ。

 そんな中でちょっと気にかかったのが、categoryという既存のクラスを拡張する仕組み。言語仕様を見ただけでは、いまいち存在意義が伝わって来ないのだが、ここらあたりにC++とObjective Cを本質的に隔てる「何か」がありそうだが...。

 その予感が的中していたことは、Appleが提供しているUIKit(iPhone用のUIフレームワーク)のチュートリアル・ビデオを見ている最中に判明する。そこに"hello"という文字列変数(型はNSString)を表示するサンプルが出て来るのだが、そのコード、

[hello drawAtPoint:location withFont:font] // C++の hello.drawAtPoint(location, font)に相当

を見て「あれ?」と思った。NSStringは、Mac OSと共通のCocoa Foundationという下位レイヤーで定義されたクラスの一つ。それがなんでiPhoneだけに存在するUIKitという上位のレイヤー向けのメソッド"drawAtPoint"をサポートしているのだろう、と。

 その疑問は、NSStringの定義されているヘッダーファイルを見てすぐに解決した。NSStringというクラスそのものはFoundationで定義・実装されているのだが、drawAtPointというメソッドはUIKitがcategoryの仕組みを使って「追加」しているのだ。これは、RailsがRubyが提供しているシステムクラスを拡張し、jQueryがJavascriptが提供しているシステムクラスを拡張しているのと全く同じ発想だ。

 つまり、Objective Cは、上位のフレームワーク(もしくはサブシステム)で下位のフレームワークが提供しているクラスを拡張することを可能にするcategoryにより、不必要なサブクラス(例えばGraphicsAwareStringクラス)の導入や、スパゲッティコードの元凶である「下のレイヤーから上のレイヤーへの依存」なしにクラスを使う人の利便性を上げることを可能にしているのだ。

 地球上にこれだけバラエティのある動植物が反映しているのは、生物が進化の過程で「進化を容易にする」仕組みを獲得したことによる(雌雄に分かれて遺伝子を交換しあう仕組みなど)が、その意味では、このcategoryはObjective Cの進化を容易にするという意味で重要な役目を果たしているような気がする。

 考えてみれば、90年代にOSの大改造に失敗したAppleはWindows95の成功にあやうく倒産の危機にまで合うことになったが、今度はVistaでOSの大改造の失敗したMicrosoft(Microsoftは当初、すべてのシステムAPIを.Net VM配下のマネージドAPIにしようと計画していた)がAppleに大きく遅れを取っているという点は以外と気がついていない人が多い様に思う。iPhone OSはまさにその成果と言える。

Comments

mono

雌雄に分かれて遺伝子を交換しあう仕組みが「進化を容易にする」仕組みと言いきっちゃうのはかなり短絡、というか説明不足ですね。普通に考えれば進化を容易にするどころか進化が非効率的なものになってしまうわけですから。いかに遺伝子をロバストなものにするかという進化的課題がその非効率性とトレードオフなので成り立つ話ではないのですか。

m

本エントリからは大きく逸脱しますが、「(生物の)進化」の話に「効率性」を持ってくるのはなんだかおかしな感じがします。「進化が効率的」というのは、「何らかの仕組みが働いて、生存に有利な変異が起こりやすい状況にある」ということなのでしょうか?

ken

>普通に考えれば進化を容易にするどころか進化が非効率的なもの

これは「進化」が非効率になるのではなく、「遺伝子のコピー」が非効率になっているのでは? 進化が(生存競争)環境に合わせて変化していくということであれば、雄雌に別れて、遺伝子をミックスするというメソッドは、バリエーションを最大化するという意味で一つの有効な解です。

自分らしさを次の世代に伝える(遺伝子のコピー) VS バリエーションを適度に取り入れる(遺伝子プールのミックス、突然変異の確率)

といったトレードオフなのかと思います。
生物学は大学以来(しかも海外なので英語)なので言葉が厳密でなかったらすいません。

ogijun

あの、本質的なことでなくてもうしわけないのですが、できれば「Objective-C」と表記していただいた方が違和感がなくて良いと思います。

pata

本が今日きましたー
片手で持てる大きさのおもてなしがありましたw

mono

>ken

集団遺伝学の近代の研究では有性生殖によって遺伝的多様性を獲得できるという仮説自体が疑問視されています。なぜだか説明することが出来るほど僕も詳しく勉強したわけではないのですが・・・。非常に難しくデリケートな問題だったのを覚えているので「進化を容易にする」などと気軽に言っている中嶋さんのエントリに指摘を入れたくなってしまったわけです。僕も生物学は海外で英語で学んだので言葉遣いは非常に怪しいと思いますがご勘弁を。

ken

>集団遺伝学の近代の研究では有性生殖によって遺伝的多様性を獲得できるという仮説自体が疑問視されています。
へー、そうなんですか。なんかちょっと興味沸いてきました。いったいなんで性別なんて出来たんでしょうね。いずれにせよ生物は最強のアプリケーションですね。いつか人間もこんなコードをかけるようになるのでしょうか。

やまぐち

>以外と気がついていない人が

”意外と以外を間違えているケースって意外と多いです”
これ、一括で変換してみましたけど、一発では変換できませんね。貴社の記者が・・・というような、書くはずもないようなフレーズじゃなくて、こういうのをちゃんと変換してくれるようになるとありがたいですけどね

Verify your Comment

Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

Post a comment

Your Information

(Name is required. Email address will not be displayed with the comment.)