渋谷のアジアンキッチンで夜8時から開催されました。 約30人のRubyユーザに取り囲まれてぼこぼこにされました。えーん(嘘)。
いや、それはそれとして、 昨日の夕食はタイ料理、今日の昼食はカレー(ナン付き)、 夕食はアジアンキッチンとアジアンな食事になったものです。 「アジア人だからいいのだ」といったのは、なかださんだったっけ。
手元の広辞苑によれば
アイデンティティ
人格における同一性。ある人の一貫性が成り立ち、 それが時間的・空間的に他者や共同体にも認められていること。 自己同一性。同一性。主体性。
なのだそうだ。たとえば、私の同姓同名の「まつもとゆきひろ」という人がいるとしても (本当にいる)、その人と私は違う人間であり、区別もできる。 これは人間にはアイデンティティがあるからだ。
では、アイデンティティがないとはどういうことか。 ある二つの「値」があって、それがまったく同一のものか、 それともたまたま値が共通なのか知る方法がない時、アイデンティティが存在しない。
たとえば、PerlやBASICの文字列にはアイデンティティがない。 文字列を変数に代入する時、内部的にコピーが起きるかもしれないし、 そうでないかもしれない。あるいは代入が発生した時点では(内部的には)同一でも、 後で知らないうちにコピーに変わってしまうかもしれない。
アイデンティティがないということは、 「値」つまり「状態」にしか興味がないということだ。状態は(通常は)オブジェクトではない。 オブジェクトに関心がないということは、それはすなわちオブジェクト指向ではない。 よって、オブジェクト指向の本質としてアイデンティティが必要である、ということになる。
上記の理屈はとりあえず置いておくとして、アイデンティティは本当に必要かという点について、考えてみよう。実は以前のPHPの話のとき、 harukiさんの「リファレンスが無くてもオブジェクト指向できるのでは?」というツッコミに対して書こうと思ってた内容だ。
私の理解が正しければ、harukiさんの論理は「PHP4では代入によってコピーが発生する」が、 PHPにはオブジェクト指向機能がある、よってアイデンティティがなくてもオブジェクト指向ができる、 というものだったと思う。
しかし、PHPのオブジェクト指向機能はリファレンスというアイデンティティを利用しているので、 この論理は成立しないと思う。もしPHPにリファレンスがなければ オブジェクト指向プログラミングは不可能だろう。
私のもっともよく知っているアイデンティティのない言語はPerl4である。 バージョン4より前のPerlの「値」にはアイデンティティがない。 スカラー(数と文字列)も配列もハッシュもその内容でしか判定することはできない。 この言語でオブジェクト指向を行うことはほぼ不可能だ。 唯一アイデンティティを要求しそうなファイルハンドルは「グロブ」という シンボルテーブルのエントリをアイデンティティとして導入しなければ実現できなかった。
もうひとつのアイデンティティのない言語の例としてはTclがある。Tclには文字列というデータ型しかなく、 この文字列にはアイデンティティはない。 しかし、「オブジェクトパス」(.frame.buttonのようなの)や、番号のようなID(まさにアイデンティティの略だ)を 導入してオブジェクトを表現している
やはり、オブジェクト指向プログラミングにはアイデンティティが必要であると考えられるのではないだろうか。
とはいえ、つらつらと考えるに、 リファレンスのまったくない言語でオブジェクト指向プログラミングができる可能性はゼロではないかもしれない。
というのは、オブジェクトを更新するような副作用がまったくなければ、 アイデンティティはさほど重要にならないからだ。 Rubyの実装においてFixnumは厳密にはオブジェクトではなく単なる「値」なのに、 オブジェクトとして振る舞うことができるのもその例だ。
しかし、副作用の全くないオブジェクト指向プログラミングというのは、 なかなか考えにくい。はたして実用的に可能なのだろうか。 もし可能なら関数型言語に完全に整合したオブジェクト指向機能が実現できそうだが。 O'Camlには副作用があるしなあ。