【コラム】

ダイナミックObjective-C

13 Objective-Cのエンジン部 - ランタイムに踏み込む

    木下誠  [2005/11/02]

    ランタイムに踏み込む

    この連載はObjective-Cという言語を「動的」というキーワードをもとに紹介している。ここまでで、クラスの型、クラスとメソッドの調査、ターゲット/アクションパラダイム、セレクタ、カテゴリ、プロトコル、非形式プロトコル、ポージング、といった機能を解説してきた。

    これで言語仕様のうち動的な特徴を持つものは、ほとんど出そろった感はある。もともと、Objective-CはC言語に最低限のオブジェクト機能を付加したものなので、あまり言語仕様は大きくないのだ。

    だが、まだ一番大事なものへの言及が不足している。それは、メッセージの送信についてである。Objective-Cの様々な動的な特徴を調べていくと、結局のところそれらを実現しているのはメッセージの送信である、ということに気づく。メッセージングシステムを理解しない限り、Objective-Cの真の姿は見えてこない。

    メッセージ送信は、概念だけを語るならば簡単である。「あるオブジェクトから、あるオブジェクトへ、メッセージを投げる」。これだけである。これだけならば、C言語での関数呼び出しや、C++におけるメンバ関数呼び出しと変わらない。Objective-Cでは、ここに呼び出された側でメッセージを処理するためのメソッドを動的に探す、動的束縛を伴う、という点が決定的に違う。

    この仕組みを明らかにするために、Objective-Cランタイムの解説を行いたい。言語仕様やクラスの実装の仕方ではない。Objective-Cのコードをコンパイルして実際に動かす、ランタイムライブラリである。いわば、Objective-Cのエンジン部である。

    ランタイムの解説は、そのソースコードをもとにして行っていこう。この連載は、Objective-Cの内部へと、さらに深く潜り込んでいく。

    Objective-Cとランタイム

    とはいうものの、ランタイムの解説まで行うことを、疑問に感じる方もいるかもしれない。「ランタイムは言語仕様ではないから、ここで語るのは不適当」という意見もあるだろう。また、「ランタイムの仕組みは複雑すぎるのでは」と思うかもしれない。

    だが実は、Objective-Cにおいては、ランタイムはそれほど遠い存在ではない。まず、Objective-CのランタイムはC言語で書かれている(一部アセンブリ言語)。そして、Objective-Cは、C言語のスーパーセットであり、C言語を完全に内包している。つまり、Objective-Cからは、ランタイムのすべてを直接操作できるのだ。

    事実、Mac OS Xで使われているランタイムは、APIドキュメントが公開されている。ランタイムAPI込みでObjective-Cの仕様のようなものだ。熟練のObjective-Cプログラマならば、もっともスマートな解法を得るために、積極的にランタイムAPIを利用しているだろう。ランタイムAPIを利用すると、動的なサブクラスの作成や実行中にメソッドの実装をすげ替えるなどの、高度な操作が行える。ほとんど何でもありである。

    第二に、ランタイムのソースコードは公開されている。この連載で取り上げるのは、Mac OS XでのObjective-Cランタイムであるが、そのソースコードはAppleのDarwinプロジェクトとして公開されている。さらに、そのコードサイズは小さい。十分に追いかけることのできる量である。

    メッセージ送信についての議論を行う時に、その概念や理念から始めることは大事だ。だが、依って立つところが明確でないと、議論は迷走しがちになる。この連載では、「いま動いている環境」を大事にしたい。実装を解き明かすことから始めよう。ランタイムのソースコードを眺めることで、メッセージン送信のベールをはがしていき、「裸のオブジェクト指向」の姿が見えるだろう。

    ランタイムを読み解くための道筋

    ソースコードの中に闇雲に飛び込んでいっても何もつかめない。道筋をきちんと確認しよう。

    最初の目的は、メッセージ送信を理解することだ。そこで、Objective-Cでのメッセージ送信をおさらいしよう。

    メッセージ送信

    1. オブジェクトAがメソッドを指定
    2. メソッドのためのセレクタを取得
    3. オブジェクトBにメッセージを送信
    4. セレクタからメソッドの実装を取得
    5. 実行
    6. 返り値を送信

    この一連の流れが、どのように行われているのか、さらに詳しく知りたいのだ。

    そこで、次回以降、ここに登場している用語の一つ一つを、解き明かしていこう。

    • クラスとは何か
    • オブジェクトとは何か
    • セレクタとは何か
    • メソッドの実装とは何か
    • メッセージとは何か

    これらが明らかになったとき、メッセージ送信を理解できるだろう。

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン