今度は抽象化とかそういうの

僕は、オブジェクトもthisもサッパリ理解できなかった

という話になりました。
檜山さんのお書きになるエントリは面白くてためになる、そして凄く刺激される、いつも楽しみにしている、私のお気に入りです。
;; でも圏論とかは難しくてダメなのでした。そのうちじっくり読ませて貰おうと思いつつ、なかなか取り組めない……
;; それにしても、このセミコロン二つのスタイルまで覚えていて下さるとは……

なので、時間も無くフーフー言っているのに、自分が反応できることがあると何とか無理矢理でも反応できないものか、となってしまうのが問題と言えば問題でしょうか。

今日は、先日の「『常識』というよりは『理解の基盤』と『説明の方法』」の流れを汲む、オブジェクト指向に関する話題です。

檜山さん自身が、巷に溢れるオブジェクト指向の説明である「現実社会の抽象化」とか、犬や猫を使った多態や継承の説明について、わけわからん御託と能書きが気持ち悪いと感じられたり、メッセージパッシングというメタファが擬人化されて説明された途端に鳥肌が立ったり、といったエピソードと絡めて、

だけどね、計算現象、プログラミング言語機構としてのオブジェクト/クラスを理解できたその後で、実世界・現実との対応を考えてもいいのじゃないのかな。

と訴えておられます。
;; でも一番インパクトがあったのはゴルゴの話。

ここら辺のオブジェクト指向の考え方である「現実社会の抽象化」やメッセージパッシングに関しては、私自身はわりと肯定的で、人への説明にも良く使ってます。
確かに全てを説明するというのは無理があったり、誤解を招き易い局面があったりと、問題が無いとは思わないのですが、モデル化などの仰々しい話以前に、プログラムしようとしている問題領域の分析や、それに対する意識の共有などには役立つことも多いと感じているからなのですが、上手く行かないことも多いので、特にこの様な考えを声高に主張するつもりは今のところありません。

それでも最初からこの様な話が素直に理解できた訳ではなく、やはり頭を混乱させながら今に至る (未だに混乱している部分も残る) 訳で、実のところ、檜山さんが `大人だね > 僕' と書かれていることと、多少ニュアンスが異なる気がするものの、同じ様なものなのかもしれません。

最初から素直に理解できなかったものが、どの様な経緯で理解が進められたのかと言うと、

C++の初期の処理系はcfrontというトランスレータで、Cソースを吐くだけだった。で、僕は中間のCソースをのぞき見していた。それでやっと事情が飲み込めたんだよね、僕としては。

という記述、私の場合は Perl でした。

Perl5 は、JavaC++, Ruby などの所謂、オブジェクト指向言語と比較すると、なかなか無理矢理な言語ですよね。
しかしだからこそ、オブジェクト指向言語の仕組みを覗き見ることができました。

Perl5 が持つオブジェクト指向の仕組みは、perl のコアドキュメント (perldoc) である、`Perlobj' に書かれており、また、そこで利用されているモジュール機構については Perlmod で説明されています。これらを読めば、Perl5 がどの様にしてオブジェクト指向プログラミングを実現させているかが判ります。

そして、私の理解 (幾分強引な解釈ですが) では、

  • 元々あったパッケージ機構を拡張したモジュール機構をクラスとして扱う。(多少、制約がありますが)
  • 特殊なハッシュへのリファレンスをオブジェクトとして扱う。
  • メソッド呼び出しでは、オブジェクト (リファレンス) を第一引数に指定することを義務付ける。(更によりオブジェクト指向チックなメソッド呼び出し構文を利用すれば、構文中で指定されたオブジェクトが第一引数としてメソッドに渡る)
  • メソッド側では第一引数を shift して変数に保持し、this, self として扱う。

といった単純なルールを適用することで、オブジェクト指向プログラミングを可能にしてしまっている様に見えます。

Java風の記法に換えて説明すると、obj.someMethod(arg)という呼び出しは、functionFor_someMethod(thisRef, arg)のようにトランスレートされる。つまり、参照引数を1つ余分に持った関数(サブルーチン)になるわけね。隠れた引数thisRefは、ヒープ上にあるメモリブロック(構造体だと思ってよい)を指している。

と殆んど同じことですね。

と、言いたかったのは、私の場合、確かに、この様な実装が透けて見える部分を見てきたことで、オブジェクト指向という未知の領域の理解が深まったのは間違いなかったということでした。