Classクラスとreification
檜山さんが書いた「いまさらながらだけど、オブジェクトとクラスの関係を究めてみようよ」というエントリを読んだ。実は以前にも見たのだけど、読む気すら起きなかったし、なんだか分からない世界だなぁと思っていた。
ところが、去年「Ruby Hacking Guide」の「第4章 クラスとモジュール」で無限連鎖するクラスのクラスをどう実装するかというような話題には触れていたし、少しはClassクラスのことも知ったので、もしかしてと思って再び読んでみたら、すいっと理解できるので驚いた。
RHGにはこう書いてある。
クラスがオブジェクトであるオブジェクト指向言語は、 ClassのクラスをClass自身にしてしまうことでループを作りだし、無限のインスタンス〜クラス関係を仮想的に作りだすのが常套手段なのである。
繰り返すが、ClassのクラスがClassなのは実装を楽にするためだ。論理的に重要なのではない。
つまり、
irb(main):001:0> 1.class => Fixnum irb(main):002:0> Fixnum.class => Class irb(main):003:0> Fixnum.class.class => Class irb(main):004:0> Class.class => Class irb(main):005:0> Class.class.class.class.class.class => Class
とかなっているのは、無限に「クラスのクラスのクラスの……」といった(メタ)+クラスが定義されてたり実装されてたりするわけじゃなくて、単に自己言及的に循環してるだけ。
いずれにしても、たぶんこの辺にはすごくおもしろい議論があって、SmalltalkやJavaScriptを横目に眺めつつオブジェクトって何だと問わないと理解できない世界があるんじゃないかという予感。おもしろいなぁと思う一方、正直、抽象的議論を深追いしてもしゃーないかなという気もする。Classクラスは、もうちょっと調べてみたいし、reflectionと呼ばれる方面も気になってはいるのだけど。
抽象的な存在であるクラスを、メモリ上で実体のあるデータに落とし込んで操作可能にするような具象化は「reification」と呼ぶらしい。Wikipediaの解説によると、別にクラスとオブジェクトの関係だけじゃなくて、CのポインタだとかSchemeの継続といったものもreificationの例のようだ。