メッセージって何ぞや

カテゴリー: 自習メモ   タグ: ,   この投稿のパーマリンク

メッセージって何ぞや への4件のコメント

  1. h2 より:

    Smalltalkなどだと、オブジェクト(ここではselfとする)はクラスへのポインタを1個持っていて、クラスにメソッドテーブルが含まれていて、メッセージ(メッセージセレクタ)をキーにしてメソッドテーブルを引くとメソッド(関数本体)へのポインタが返ってきて、selfを第1引数にして、この関数ポインタを呼ぶという流れになります。

    不正確に要約すると、メッセージがキーでメソッドが値。

    • iida より:

      こちらももう・・・自習すらする前により詳細なコメントを^^;
      とてもありがとうございます。

      メッセージ=メソッドを呼び出すこと、と理解しかけていたのですが、
      そのような流れありきでのキーの役割なわけですね。

      他言語(例えばJavaScriptとか)だと、
      Object.method も Object[ ‘method’ ] も
      同じだったりするので、キーという概念は理解しやすいです。

      では、メンバ変数についても、関数ではなく他の型が返るだけで、
      同様にメッセージをキーにしてクラスにアクセスするという理解で合っていますか?

      またその場合、メンバ変数の値はオブジェクトごとに違ったりしますが、
      これはオブジェクトに直接持たせてある場合・クラスへのポインタを持っている場合と
      区別して考える必要があるのでしょうか?

  2. h2 より:

    Squeak/Pharoの場合、
    Object>>instVarAt: index
    がプリミティブで、任意のオブジェクトはObjectなので、任意のオブジェクトがinstVarAt:を理解します。

    例1:
    ‘abc’ instVarAt: 1は、$aのアスキーコードになります。
    ‘abc’ instVarAt: 2は、$bのアスキーコードになります。
    ‘abc’ instVarAt: 3は、$cのアスキーコードになります。

    例2:
    123 instVarAt: 1は、変則的ですが、123自身になります。

    名前つきのインスタンス変数があるオブジェクトのために、
    Object>>instVarNamed: aString
    が用意されていて、これは今のプリミティブを使って、
    ^ self instVarAt: (self class
    instVarIndexFor: aString asString
    ifAbsent: [self error: ‘no such inst var’])
    のように定義されています。’abc’のようなByteStringは、名前つきのインスタンス変数を持たないので、これに対してどのような変数名でinstVarNamed:を送ってもエラー(self error: ‘no such inst var’)になります。

    Squeak/Pharoのコンパイラは、インスタンス変数へのアクセスをinstVarAt:に変換しているかもしれません。詳しいことは知りません:-)

    • h2 より:

      instVarIndexFor:…は実際は、ClassDescription>>instVarIndexFor: instVarName…を呼び、これがClassDescriptionのインスタンス変数であるところのinstanceVariables配列(マップではない)をinstVarNameを求めてリニアサーチします(サーチして見付かったインデックスを返す)。

      (コンパイルされたメソッドで、実際にこのようなまわりくどい検索をしているかどうかは不明です)

      ともかくSqueak/Pharoの場合、メソッドの検索は「キー・値」検索ですが、インスタンス変数の検索はそうではないということです。さっき調べてわかりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*