※ 記事は執筆時の情報に基づいており,現在では異なる場合があります。
私がC言語と出会ってから,もう25年近くたつ。当時は大学の計算機センターでFORTRANやPL/I,Lispなどで遊んでいた。PascalやパソコンBASICも手近にあったが,やはり面白いのはLispであった。
その後,C言語の紹介を雑誌で読んだり,研究室にあるPDP-11にUNIXがきたという噂(うわさ)を聞いたりはしたものの,特定のプロジェクトに割り当てられているらしく,私が触れる機会はなかった。さらに後に,知人がパソコンを購入してC言語のコンパイラが動くようになり,私はその友人に頼み込んで毎晩のように彼の部屋で使わせてもらってC言語になじんだのだった。
本格的にC言語を使うようになったのは,大学を卒業して職を二つほど変わってから。当時まだ珍しかったUNIXワークステーションでソフトウエアを開発する仕事だった。20年ぐらい前の話である。
このときすでにC++やObjective-Cの話題が出ていただろうか…と思い調べてみたら,Objective-Cを全面的に採用したNeXT Computerの発表が1990年前後,Microsoft C/C++ 7.0の登場が1992年であった。しかし,Objective-CはC言語に似てはいるもののある意味全く違う言語であるし,C言語よりもC++を使った方が楽だとはとても思えなかったので,両者とも私にとっては無縁の存在であった。
もちろん,オブジェクト指向のプログラミングを否定していたわけではない。大学時代にそれなりにいろいろ見てきたおかげで,オブジェクト指向のなんたるかは把握できているつもりでいた。しかし,この知識が却って邪魔をしたというべきだろうか,LispやSmalltalkで実現可能な柔軟なオブジェクト指向のパラダイムに比べて,C++のそれはかなりやっかいで扱いづらいものに感じたのだ。
例えば,GNU C++でプログラムを開発するとしてSTL(Standard Template Library)のvectorやstringを使ったとしよう。何か間違えたときにコンパイラが出すエラーメッセージが直感的でないために困惑した人は少なくないと思う。しかも,中で何をやっているかよくわからない。それなら自分で最初からコードを組んだ方がよっぽどいい,と考えるのは当然だ。
Visual C++ 4.0との出会い
私がなかなかC++になじめなかったもう一つの理由として,C++で書いた良質なコードが身の回りになかったという事情がある。今でもそうであるが,C言語なら無償で入手可能な良質なコードが山ほどある。私の場合だと,PerlやGNU Emacsのソースコードにはかなりお世話になった。UNIXといっても片手で数え切れないほど種類がある時代だったから,機種間の互換性を持たせるようなコーディング方法なども,こういったフリーのソフトウエアをお手本にして習得していった。
それに比べて,C++でこれ,というようなソースコードにめぐりあう機会はほとんどなかった。せいぜい,STLのような汎用で高次元のものか,そうでなければ構造体にメソッドを付けてみました,といった程度のものばかりだったのである。
ところがその後,大きな転機が訪れる。Visual C++ 4.0との出会いである。私の記憶によれば(今のバージョンでもそうだが)Visual C++ 4.0にはMFCのソースコードが付いていた。そして,すでに用意されているクラスの機能と少し違うことをしたいとき,ドキュメントに載っていないようなクラス間の相互作用があるとき,ちょっと込み入った現象をデバッグ・トレースしたいときなどはMFCのソースコードを見る必要があり,結果としてMFCの流儀をマスターしてしまった。
MFCについて,出来が良いとか悪いとか,いろいろ言う人はいるだろうし,もちろんMFCの前身となるプロダクトもあったのだろうが,ベースクラスをサブクラス化し,仮想関数を埋めることでコンポーネントのバリエーションを作り出していくというスタイルを一般に広めたのは,MFCの功績によるところが大きいのではないかと思う。
余談になるが,ATL(Active Template Library)はこれと少し違ったアプローチで,テンプレートによってインタフェースを決めておき,テンプレートから派生したクラスを寄せ集めることで主たるクラスのバリエーションを作り出していくというものである。いずれにせよ見事な手法で,私には到底及びも付かない。そういうわけでVisual C++のおかげで私はすっかりC++に慣れ親しむことができ,いまやstructと書く代わりに,まずclassと書き始めるようになってしまった。
こうしてC++をある程度マスターしたものの,よく考えてみるとWindowsのアプリケーション開発以外でC++を使うことはほとんどない。かなり以前にWebのシステム開発を依頼されたとき,顧客がPerlでは嫌だというのでC++でCGIを書いた経験もあるが,今ならJavaやPHPを使うだろう。Windowsだっていまや .NET FrameworkとかC#などといっている時代だから,C++を使う機会なんてめったにあるものではない。
そう思っていたら,なんと今回,C++でインターネット・サーバーを開発する仕事を少しだけお手伝いすることになってしまった。Boostというライブラリを使っているという説明を受けて,ソースコードを見せてもらうと,テンプレートをはじめとする先進的な機能をかなり積極的に使っている。
Boostというのは,以前聞いたことのある名前だと思って改めて調べてみると,拡張C++ライブラリのドラフトであるTR1の多くがBoostの影響を受けているという。非先進的な私から見ると,ああ,C++ってこんな風になってしまうんだ,という気持ちがしないでもない。
聞けばC++0xの策定も進んでいるという。今の仕事が終わって,しばらくして戻ってきたとき,初見では理解できないようなC++になっていたらどうしよう。そんな風になってもまた以前のように,何か機会があって新しいC++を愛することができるようになるのだろうか。正直言って今の私には自信がない。