読み込み中...Objective-C(オブジェクティブ シー)はプログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語。
Objective-CはNeXT、Mac OS XのOSに標準付属する公式開発言語である。OS Xのパッケージ版に開発環境がCDで付属するほか、ユーザ登録をすれば無償でダウンロードできる。(Xcodeの項目参照)Objective-CはCを拡張してオブジェクト指向を可能にしたというよりは、Cで書かれたオブジェクト指向システムを制御しやすいようにマクロ的な拡張を施した言語である。従ってbetter Cに進んだC++と異なり、C & Object Systemという考え方であり、ある意味二つの言語が混在した状態にある。プログラマは問題領域に合わせて双方を使い分けることができるため、お互いの利点を活かしやすいのが特徴である。
言語全体としてはCの完全上位互換であり、if/for/whileなどの制御文や、intなどのスカラー型、関数記法、宣言・代入といった基本的な文法はCに準拠する。
一方オブジェクトシステムはSmalltalkの概念をほぼそのまま借用したもので、動的型のクラス型オブジェクト指向ランタイムを持ち、メッセージパッシングにより動作する。このことからしばしば「インラインでCの書けるSmalltalk」または「インラインでSmalltalkの書けるC」などと呼ばれる。
最大の特徴はオブジェクトシステムが完全に動的という点で、実行時のクラス拡張、オブジェクト汎用型idの導入により型によらない動的配列・辞書など、インタプリタに近い記述力をもつことである。実際にコードそのものはネイティブコンパイルされるものの、動作原理はほぼインタプリタに近く、コンパイラ型言語としては稀な柔軟性を発揮する。
従ってC側から見れば一種のスクリプトインタプリタが乗っているような状態であり、逆にオブジェクトシステムからはOS機能や膨大なC言語資源を直接利用可能なインターフェースが備わっているといえる。また仮想マシンを持たずに済むため、取り回しも良い。Objective-C特有のこの形態は双方のメリットが明確で、実用面での使い勝手が非常に優れている。この特性に着目したのがNEXTSTEPで、UNIXとの互換性と先進的なオブジェクト指向環境の両立に成功し、その後のOS設計に大きな影響を与えることとなった。
後続言語への影響としては、特にJavaの基礎設計にその姿を見る事ができる(SunがOPENSTEPに関わっていた事と関係がある)。
| クラス | 単一継承+インタフェース多重継承(プロトコル) 通常はルートクラスから継承 |
|---|---|
| オブジェクトシステム | 動的束縛、メタクラスを持つ |
| 型 | 動的型+見た目の静的型のハイブリッド |
| 実行速度 | コードはCと同等のネイティブコンパイル、メソッド呼び出しは動的ディスパッチを行なうのでやや遅延する。平均してC/C++よりは遅く、中間コード型言語(Javaなど)より数倍する程度といわれる。ただし、クリティカルな部分はいつでもCに展開できるため、実行速度が問題になる事はまずない。 |
| その他 | オブジェクトはポインタ互換、Cのスカラー型はオブジェクトではない |
Objective-Cは、1983年にBrad Coxによって開発され、そのコンパイラやライブラリを支援するためにStepstone社を創立した。Stepstone社は、Objective-Cに力を注いだが、それはマイナーな存在であった。Objective-Cが認知され始めるきっかけは、1985年、アップルコンピュータを去ったスティーブ・ジョブズが、m68k機であるNeXTコンピュータとNeXTSTEPオペレーティングシステムの開発を行うNeXT Computer社を創立したことに始まる。
そのマシンのユーザインタフェースは、Display PostScriptと Objective-Cで書かれたApplication Kitにより提供され、Objective-CはNeXTコンピュータの主力言語となった。その後の歴史は、主にNeXT社とともにあり、GCCをベースにしたObjective-Cサポートが行われ、プロトコルの導入など文法の拡張なども行われている。NeXT社による多くの成果は、GCCに還元されている。
1995年には、NeXT社がStepstone社からObjective-C言語と、その商標に関する全ての権利を買い取っている。1997年初頭、Apple社がNeXT社を買収し、NeXT社CEOのジョブズがApple社のCEOに復帰したのに伴い、その技術をベースにしたオペレーティングシステムMac OS X上における、主力開発言語の一つとなり、Cocoaフレームワークのコア言語として採用されている。Mac OS X v10.5からは一部言語仕様の変更が行われObjective-C 2.0と呼ばれる(詳細は#Objective-C 2.0を参照)。
長らくNeXT及び、その後継であるMac OS Xの専用言語に近い状態だったが、2007年に入り、Apple社の携帯電話iPhoneにおいてCocoa touchフレームワークの記述言語として採用。習得者の人口が増える傾向にある。
Objective-Cのクラスは定義部と実装部に分かれており、通常定義部を.hファイル、実装部を.mファイルに記述する。後述のカテゴリによりクラス定義を複数のパートに分割できる。
メソッドにはクラスメソッドとインスタンスメソッドがあり、それぞれ接頭辞+及び-により区別される。メソッド呼び出しの際、クラスメソッドはクラスオブジェクトに、インスタンスメソッドは各インスタンスに送信される。
いわゆるコンストラクタは存在しない。慣習として新規オブジェクトの生成は+allocで、初期化は-initで行われるが、プログラマが自由に別の特殊化したメソッドを定義することが可能であり、初期化中に別の初期化メソッドを呼びだす場合もある。一方デストラクタ(ファイナライザ)に相当するものは-dealloc、またはガベージコレクション使用時の-finalizeで、これらのメソッドはオブジェクトの破壊時に必ず呼び出される。
selfは特殊な変数で、メソッドの実行時にレシーバとして渡される。代入も可能であり、-init等でスーパークラスの実装で自分自身を初期化し、正しい値が返った時のみ継続して初期化を行なうなどに利用される。
オブジェクトの型はオブジェクトを特定のクラスに制限したい時に用いられる。ただしこれはソースコードでのみ意味を持ち、実行レベルでは全てidとして扱われる。また型付きのオブジェクトはインスタンス変数を構造体互換でアクセスできる。保護レベルはpublic(フリー)、protected(継承クラスのみ)、private(同一クラスのみ)があり、デフォルトはprotectedである。ただメモリ管理の一貫性などの理由から、ほとんどの場合アクセサを用いる。
Objective-Cのオブジェクトは全て自分自身に関する定義情報を保持しており、実行時に利用する事ができる。
実装系によるが、存在しないメソッドを呼びだした際、例外を発生する前にそれを他のオブジェクトに転送するチャンスが与えられる。method forwardingと呼ばれる。
Appleのランタイムでは、セレクタに対応する引数情報と転送処理の二つの過程を経て行われる。
プロトコルはクラスのメソッドインターフェースを規定する機構である。元々はNeXTワークステーション上で分散オブジェクトシステムを構成する際、リモートオブジェクトの通信効率を上げるために導入された。
プロトコルに準拠するクラスは定義されたメソッドを全て実装しなければならない。また、プロトコルは多重継承を許す。
カテゴリはメソッドのコレクションを定義して、クラス定義後に追加オーバーライドを行なう機構。
特徴的なのは、メソッドのオーバーライドが、カテゴリがロードされたタイミングで実行時に行われるという点で、これにより外部モジュールで基盤モジュールを置き換える事ができる。従ってカテゴリを用いればオリジナルコードの再コンパイルなしにルートクラスの挙動を変更する事さえ可能となる。また機能追加のためだけのサブクラス化を行なう必要がなくなる点は特筆に値する。
カテゴリが上述のInformalプロトコルに利用できるのは、ロードが実行時に行われるという構造上、コードのリンク時に実装が存在する保証がなく、インターフェースのみが先行する形になることから。
応用範囲は非常に広く、単純にクラス定義を複数の機能クラスターから構成するために用いる事もあれば、先に挙げたフレームワークのパッチやInformalプロトコルに用いるケースなど多岐にわたる。プログラムの可読性や設計のしやすさ全般に貢献しており、Objective-Cプログラマの間では「Javaの最大の弱点はカテゴリがないこと」などとささやかれるほどである。
オブジェクトシステム自体がCで書かれていることに加え、C哲学である「プログラマにできることを制限しない」を良くも悪くも受け継いでいるため、Objective-Cにはさまざまな超言語的技法が存在している。これらの機能は非常に強力であるため乱用を避けるべきだが、この柔軟性こそがObjective-Cの魅力と評する向きもある。
Objective-CとC++が混在したもの。両者はCからの拡張部分がほぼ干渉しないため、お互いをただのポインタ値と見なす事で表記が混在できる。従ってクラスシステムの互換性はなく、単純なObjective-C & C++になる。
主な用途はC++のライブラリをObjective-Cからアクセスするためのラッパー記述で、実例としてAppleのWebKit(KHTMLベース)などがある。コンパイル速度が非常に遅くなる事もあって積極的に用いられる事は少ない。
上述のように、Objective-Cランタイムシステムの実体はC言語関数群そのものである。このライブラリの内部でリフレクションやメッセージ送信の機構が全て閉じているため、これらに対するラッパーを用意することで、外部言語からシステムの完全制御が可能になる。
現在言語ブリッジが確立している言語には、Haskell、Java、Perl、Python、Rubyなどがある。
初期のObjective-CプログラムはC同様単純な割当と解放を行なっていたが、現在はライブラリレベルで参照カウントを行なうのが一般的。OPENSTEPライブラリはイベントサイクル単位でAutorelease poolと呼ばれる暗黙の参照元を持っており、オブジェクトをここに登録することで事実上の自動解放オブジェクトを実現している。
今後はガベージコレクションに徐々に移行すると見られている。ただし両方式は一長一短があるという見方が支配的で、今後も併用される可能性が高い。GNU版ランタイムは独自にBoehm GCを使ったGCモードをすでに実現している。Apple版はMac OS X 10.5でGCを導入した。iPhoneのCocoa touchではリソース制限が厳しいことからGCは使われず、Autorelease方式を採用している。
読み込み中...