先週の金曜日に正式版が登場したLeopard。Appleも多くの新機能を喧伝しており、それらを試している方も多いだろう。
この記事では、見方を変えて、開発者から見るとLeopardにはどのような機能が追加されているのか、紹介したいと思う。先に述べておくが、追加機能は非常に多い。この記事に入りきらなかった新機能や、従来の機能の強化もたくさんある。Tigerのときも大きく機能は広がったが、Leopardではさらにその上に積み重ねられている。Machカーネル、Cocoaフレームワークといった強固な基盤の上に、次々と機能が花開いている。
Objective-C 2.0
Leopardで拡張された開発分野の機能のうち、最も大きい影響があるのが、Objective-C 2.0の導入だろう。Objective-Cは、いまやMac OS Xでアプリケーションを開発するときの主流の言語だ。動的で柔軟なオブジェクト指向と、C言語のローレベルなライブラリにアクセスできるという、両面を併せ持っている。しかし、その仕様が定まってから、すでに20年以上が経過している。テコ入れをして、もっとモダンにしようとしたのが、Objective-C 2.0だ。
「2.0」という大仰な名前がついているが、文法面での追加は少ない。むしろ、ランタイムの強化、改良に力を入れたという印象だ。その中で注目すべきは、ガベージコレクションの導入だろう。
ガベージコレクション
自動的なメモリ管理を行ってくれるガベージコレクションは、いまや必須の機能だろう。これまでObjective-CおよびCocoaには、ガベージコレクションは存在せず、参照カウンタによるオブジェクトの管理を行っていた。あるオブジェクトが他のオブジェクトから参照されている数を、retainとreleaseというメソッドを使って、プログラマが手で管理していたのだ。このretain/release、それに加えてautoreleaseを使った管理は、ある程度熟練すれば問題はないのだが、仕組みを理解するには時間がかかり、やはりバグの温床になってきたと考えるべきだろう。
ようやく満を持して登場したガベージコレクションであるが、Objective-Cの特殊事情を配慮したものとなっている。それをよく表しているのが、C言語やC++へのポインタをも使ったアクセスが可能である、という点だ。言ってみれば、他の多くのオブジェクト指向言語が自身の言語で作られたオブジェクトしか対象にしない「クローズ」なものに対して、「オープン」であるとも言える。このため、「保守的(conservative)」ガベージコレクションがベースになっている。ただし、Cocoaのオブジェクトだけ見れば「クローズ」となるので、その辺りのバランスをとった実装になっているようだ。また、世代別ガベージコレクションも採用している。