Objective-C


Objective-Cは何故メソッド呼び出しの度にメソッドを検索するのか



Objective-Cには「メソッド呼び出しの度に、目的のメソッドを検索する」という仕様がある。
オブジェクトがメソッドへのポインタを持っていればそんな面倒な動作は不要になるのに、どうしてわざわざそんな仕様にしたのだろうか。

C++のオブジェクトはメソッドへのポインタを持っている。
しかしObjective-Cのオブジェクトはそのポインタを持っていないので、呼び出される度にメソッドを検索するしかない。
では何故、Objective-Cのオブジェクトはメソッドへのポインタを持っていないのか。
それは、Cを拡張したC++と違ってObjective-Cが純粋なC言語で作られているためだ。
Objective-Cのオブジェクトとは、Cの構造体そのものであり、構造体を間借りする形でコードが格納されている。
もともと構造体にはデータへのポインタがないので、当然コード(メソッド)へのポインタも持つことはできない。


CではCPUのアドレッシングモードを使って構造体内の変数や配列へアクセスするように、コンパイラがうまくコードを生成するようになっている。
例えば、ベースレジスタが構造体の開始アドレスを持ち、ディスプレースメントが配列の開始までの距離、インデックスレジスタが配列の要素までの距離を持つ、といった具合だ。
この例で言えば、ベースレジスタがオブジェクトの開始アドレスを持っていて、メソッド開始までの距離をディスプレースメントで指定するアドレッシングモードをジャンプ/コール命令で使えれば、毎回メソッドを検索しなくても済むことになる。
しかしCPUのアドレッシングモードは、データへのアクセス(読み取りや書き込み、演算など)には豊富に用意されているが、コードへのアクセス(ジャンプやコールなど)にはそれほど多く用意されていない。(DECのVAXは別としても)
そのため、いたしかたなくオブジェクトの先頭からメソッドを探す動作が必要となってくる。
つまり、意図的にメソッド検索が必要な仕様にしたのではなく、純粋なC言語で作成した結果どうしても生まれてしまった仕様ということだ。



[ 戻る ]