NOTE: この記事は、当初、ココログの「いげ太のブログ」で公開していたものです。
時には昔の話を。
ふつうはポインタの方を難しいと感じるらしい。ポインタ(メモリの番地)なんてもんは基礎だ。五大装置やらなんやらとハードウェアについての知識を、あるいは CASL を、2 種対策と称して真っ先にやらされた身にとっては、それはそれほど難しい話ではなかった。そりゃもちろん、僕は C の専門家ってわけでも、それを使いこなしまくってるってわけでもなかったから、ポインタのポインタとかの問題を出されればそれはそれで脳みそがおっついてかないという感覚はあったけど、それでもやっぱり難しいという感覚をそれに抱くことはなかったのだ。
でも、構造体は難しかった。難しいといっても観念がわからないとかその使い方がわからないとかいう類じゃあない。なんでそんなもんが存在すべきなのかがわからなかったのだ。だってそうでしょ、アイツって、束ねてるだけじゃん。別々に変数を作ればそれでいいことじゃないか。ダブついているようで気に入らなかったんだ。いちいち新たなる型を作ることは単におっくうでしかないように思えた。
僕はいつも合理性について考えていた。オーバーラップするような機能は許容できなかった。結局のところ値なんてもんは、最終的にはプリミティブな組み込み型に帰結するにも関わらず、高々それを束ねるだけのものにいかほどの意味があろうかとも思えた。考えてみれば、プログラミング言語においても利便性のために存在する機能ってのは多くあるのだけれど、当時の僕はそんなこと知る由もなかった。
まさに初めて学んだ高級言語が C 言語だった。まだ、実装すべき機能は関数という最小単元によって作り上げられるといったような、プログラミングのセオリーさえままならない頃だ。僕はまだたいしたサイズのプログラムを書いたことがなかった。ゆえに、複数の値を意味のあるまとまりに束ねることに、どれほどの価値があるか理解できなかったのだ。あるいは、Windows API などにもっと早く触れていれば、考え方もすこしは変わっていたのかもしれないが。
すこし後になって、複数の戻り値を返したい場合には構造体が有効かもしれないと思うようになった。引数と違って、戻り値が複数の値であるためには、それはひとつの型としてまとまっている必要がある。さすがに、複数の戻り値を返すためにポインタ渡しの引数を乱発したり、そのためにグローバル変数を使ったりするのは違うなと思えた。
「構造体」という名前もややこしかった。VB よろしく「ユーザ定義型」と言ったほうが平易に思えた。「C の構造体が、抽象的な複合型を表現するだけでなく、メモリ上のレイアウトの指定にも使われていた」というようなことをなんとなくにも意識するようになるのは、気まぐれに買った本を読んでからのことであり、僕がその名を妥当と評価するのは「C 言語は中級言語である」とする解釈を知るときまで遅延された。
構造体の意義を知る前に、僕はオブジェクト指向について学ぶようになっていた。これからは Java の時代らしいと聞いたんだ。複数の値をひとまとめに束ねることは、もはや当然のこととして受け入れるようになっていった。OOP のコーディングじゃ、クラスを作らなきゃ始まらなかったからだ。このときの僕には OOP イコール Java だった。なにを書くにもクラス、クラス。構造体がわからないと言っていたのも、過去のこととして過ぎ去ろうとしていた。だってそこに構造体と呼ばれるものは何もなかったのだから。
そうこうしているうちに .NET だ。C# だ。C# には構造体がある。クラスは参照型で、構造体は値型で。そして値渡しに参照渡し。真に高級な言語について学ぶことで、スタックとヒープのような低レベル観念の権化とも呼べるものを理解する羽目になるとは思ってもなかった。K&R の呪縛だかノイマン脳の恐怖だかはともかく、どこまでいってもその辺の知識からは逃れられないのだなと感じ、つかマウス イヤーってなんスかねと思ったりもしたのだった。
クラスなんて構造体に関数ポインタを持たせたモジュールで、インスタンス化ってのはそのポインタを得ることでしかないよという糖衣錠を飲み込んで、逆説的に構造体を理解し始めた頃、僕は関数型の潮流を目の当たりにしていた。休むに似たりの考えをどうにかしようと横好きに流れて下手を打ち、古人の手の上で踊る阿呆は踊らにゃ損々とお堂をめぐる。そこで僕が見た景色は、構造体が直積型と呼ばれる世界だった。
ユーザ定義の抽象データ型には、直和型と直積型がある。そこに潜む集合論(あるいは圏論)にアカデミックなフレーバーを感じた。無論、僕にはそれをテイスティングすることはできないし、だからソムリエにはなれない。だいたいビールさえあればニコニコしてるオヤジ趣味だ。けれど、それを飲んで「あ、なんか洒落た味じゃん」ぐらいのことは言えるし、にわか野郎にも程があるといわれようとも、それを毎晩の献立の中に取り入れることができればバリエーションが広がる。たまには違うモノだって飲みたいのだ。
そんなこんなでまあ浅はかなことを今日もまた考えている。それにしてもアイツとの距離が一向に縮まらなく思えるけれど、それはきっと渦を描きながらゆっくりと外堀を埋めるように近づいていってるからだ、と自分に言い聞かせながら。