«前の日記(2003-08-07) 最新 次の日記(2003-08-09)» 編集

Matzにっき


2003-08-08 [長年日記]

_ [Ruby]まつもとゆきひろを囲む会

渋谷のアジアンキッチンで夜8時から開催されました。 約30人のRubyユーザに取り囲まれてぼこぼこにされました。えーん(嘘)。

いや、それはそれとして、 昨日の夕食はタイ料理、今日の昼食はカレー(ナン付き)、 夕食はアジアンキッチンとアジアンな食事になったものです。 「アジア人だからいいのだ」といったのは、なかださんだったっけ。

_ [OOP]アイデンティティ

手元の広辞苑によれば

アイデンティティ

人格における同一性。ある人の一貫性が成り立ち、 それが時間的・空間的に他者や共同体にも認められていること。 自己同一性。同一性。主体性。

なのだそうだ。たとえば、私の同姓同名の「まつもとゆきひろ」という人がいるとしても (本当にいる)、その人と私は違う人間であり、区別もできる。 これは人間にはアイデンティティがあるからだ。

では、アイデンティティがないとはどういうことか。 ある二つの「値」があって、それがまったく同一のものか、 それともたまたま値が共通なのか知る方法がない時、アイデンティティが存在しない。

たとえば、PerlやBASICの文字列にはアイデンティティがない。 文字列を変数に代入する時、内部的にコピーが起きるかもしれないし、 そうでないかもしれない。あるいは代入が発生した時点では(内部的には)同一でも、 後で知らないうちにコピーに変わってしまうかもしれない。

アイデンティティがないということは、 「値」つまり「状態」にしか興味がないということだ。状態は(通常は)オブジェクトではない。 オブジェクトに関心がないということは、それはすなわちオブジェクト指向ではない。 よって、オブジェクト指向の本質としてアイデンティティが必要である、ということになる。

上記の理屈はとりあえず置いておくとして、アイデンティティは本当に必要かという点について、考えてみよう。実は以前のPHPの話のとき、 harukiさんの「リファレンスが無くてもオブジェクト指向できるのでは?」というツッコミに対して書こうと思ってた内容だ。

私の理解が正しければ、harukiさんの論理は「PHP4では代入によってコピーが発生する」が、 PHPにはオブジェクト指向機能がある、よってアイデンティティがなくてもオブジェクト指向ができる、 というものだったと思う。

しかし、PHPのオブジェクト指向機能はリファレンスというアイデンティティを利用しているので、 この論理は成立しないと思う。もしPHPにリファレンスがなければ オブジェクト指向プログラミングは不可能だろう。

私のもっともよく知っているアイデンティティのない言語はPerl4である。 バージョン4より前のPerlの「値」にはアイデンティティがない。 スカラー(数と文字列)も配列もハッシュもその内容でしか判定することはできない。 この言語でオブジェクト指向を行うことはほぼ不可能だ。 唯一アイデンティティを要求しそうなファイルハンドルは「グロブ」という シンボルテーブルのエントリをアイデンティティとして導入しなければ実現できなかった。

もうひとつのアイデンティティのない言語の例としてはTclがある。Tclには文字列というデータ型しかなく、 この文字列にはアイデンティティはない。 しかし、「オブジェクトパス」(.frame.buttonのようなの)や、番号のようなID(まさにアイデンティティの略だ)を 導入してオブジェクトを表現している

やはり、オブジェクト指向プログラミングにはアイデンティティが必要であると考えられるのではないだろうか。

とはいえ、つらつらと考えるに、 リファレンスのまったくない言語でオブジェクト指向プログラミングができる可能性はゼロではないかもしれない。

というのは、オブジェクトを更新するような副作用がまったくなければ、 アイデンティティはさほど重要にならないからだ。 Rubyの実装においてFixnumは厳密にはオブジェクトではなく単なる「値」なのに、 オブジェクトとして振る舞うことができるのもその例だ。

しかし、副作用の全くないオブジェクト指向プログラミングというのは、 なかなか考えにくい。はたして実用的に可能なのだろうか。 もし可能なら関数型言語に完全に整合したオブジェクト指向機能が実現できそうだが。 O'Camlには副作用があるしなあ。

_ 番号

昨日泊まったホテルの部屋番号が256、今晩が320。

なんとなくキリがいい、と思うのは、やっぱり壊れてるかも。

本日のツッコミ(全3件) [ツッコミを入れる]
_ shiro (2003-08-09 04:25)

「副作用が全くなければ、アイデンティティは問題にならない」<br>というより、副作用が無い場合のアイデンティティは参照の同一性ではなく内容の同一性に基づく、ということを、Henry Bakerが言っていますね。ご存知かもしれませんが: Henry Baker, "Equal Rights for Functional Objects or, The More Things Change, The More They Are the Same", ACM OOPS Messenger 4, 4 (October 1993), 2-27.<br>http://home.pipeline.com/~hbaker1/ObjectIdentity.html

_ haruki (2003-08-09 12:13)

アイデンティティが無いとおっしゃる言語では、アイデンティティは「変数名」で判定されるものなのでは?<br>つまり、変数Xと変数Yは、値がたまたま同じであっても、「同じ」ものではないということです。<br><br>「アイデンティティが無い」というよりも「アイデンティティの判定の必要が無い」というだけではないかと思います。

_ まつもと (2003-08-09 19:16)

おなじ変数でも同じものを指しているとは限らないかも。<br><br>それはともかく、そのような言語においては実用的なオブジェクト指向プログラミングは無理じゃないかっていう私の結論は変化しません。

お名前:
E-mail:
コメント:
[]

«前の日記(2003-08-07) 最新 次の日記(2003-08-09)» 編集

track feed Matzにっき Creative Commons License This work is licensed under a Creative Commons License.