1960 年生まれ,独身フリー・プログラマの生態とは? 日経ソフトウエアの人気連載「フリー・プログラマの華麗な生活」からより抜きの記事をお送りします。2001年上旬の連載開始当初から,現在に至るまでの生活を振り返って,週1回のペースで公開していく予定です。プログラミングに興味がある人もない人も,フリー・プログラマを目指している人もそうでない人も,“華麗”とはほど遠い,フリー・プログラマの生活をちょっと覗いてみませんか。
※ 記事は執筆時の情報に基づいており,現在では異なる場合があります。

 オブジェクト指向という言葉を初めて聞いたのは,確か24年前のことだ。まだC++言語どころかC言語でさえマイナーな存在で,やっとK&R仕様のCコンパイラがパソコンなどで利用できるようになったころであったと記憶している。ようやく,「構造化プログラミング」,すなわち「いままでプログラムのフロー制御にgoto文を多用していたけど,if…then…elseとかforなどの構造的な構文を使ってもう少しわかりやすいプログラムを書こうよ」というアプローチが普及のきざしを見せ,プログラムの品質を上げるために「モジュール化」ということがさかんに言われ始めたころのことである。オブジェクト指向という言葉を知っている人は周囲にほとんどいなかった。

 メリットがいろいろとありそうだからぜひ使ってみたいと考えたわけだが,当時はオブジェクト指向プログラミングをサポートする言語システムが手元になかった。こうした言語は,従来と比較して,とてつもなくオーバーヘッドの大きなものになりそうであった。インスタンスと呼ばれるメモリー・ブロックの割り当てと解放が頻繁に発生するし,場合によっては動的なメモリー管理(ガーベジ・コレクション)を行う必要もあるだろう。また,メソッドの呼び出しを解決するには,それぞれのインスタンスが指し示すクラスが保持するテーブルを探索しなくてはならない。

 アプローチが優れている,つまり人間が楽をするぶんだけリソース(メモリーやCPU)を消費するのは仕方がない。だが,その結果とんでもなく遅いシステムになったのでは意味がない。さてどうしたものだろう,と思いながら,一部の特殊な処理系,例えばSmalltalkとかObjective-Cなどが利用できる環境をうらやましく思い,横目で見ていたものだ。

 実際,私がC++の仕様策定が始まったという話を耳にしてから,いつでもどこでも気にせずに使えるようになるまでに,ほんとうに気が遠くなるような時間がかかった。その間,トップクラスの研究者たちが試行錯誤と議論を繰り返し,さらにハードウエアの進歩が拍車をかけて,やっとオブジェクト指向プログラミングが実用になる時代が来たのである。したがって,いま我々が目にしている言語仕様は,長い年月を経て最終的に残ったものであるということを肝に銘じておきたい。

 当時提唱されていたアプローチを思いつくまま書いてみよう。あるものは,クラスを表すクラス(メタクラス)という考えを持ち込んで,クラスのふるまい,すなわちメソッドの処理方法や,多重継承している場合のメソッドの探索ルールに至るまでプログラミング可能なメカニズムを持っていた。また,あるものは数値や文字のようなプリミティブ(基本型)にまでクラスを持ち込み,すべてをプログラマに開放しようとした。あるいは,クラスとメソッドの定義を完全に切り離し,メソッドを「(引数である)複数のクラスに対して操作を行う手続き」として扱うもの,あるいはインスタンスの割り当てと解放の必要性をなくし,リファレンス・カウンタを使ってガーベジ・コレクションを実現しようとしたもの,あるいはもっと簡単に,オブジェクト指向的な書き方ができるようなC言語のマクロを用意しただけのものなど。もちろん,これらがすべて消えていったわけではないのは,JavaやLisp系の言語を見ればわかるだろう。しかし,C++言語の設計者たちは,およそ考えうるあらゆるトレードオフの上に現在の仕様を決めたのである。

 私にとってC++の原点は,マイクロソフトのVisual C++(ビジュアル・ツールVisual Studioで利用できるC++処理系)である。当時,UNIX系のシステムでC++を使って開発するのは,開発側にとっても顧客側にとってもまだ抵抗があったが,Windowsにおいて「Visual C++を使って開発します」と言って反発されることはなかったからである。しかも,Visual C++ 4.0に至ってIDE(統合開発環境)としての完成度がきわめて高くなった。それまでは「プログラムを書くのならEmacsが最強でしょ」と言ってはばからなかった私だが,その後に必ず「でもVisual C++もなかなかいいよ」と付け加えるようになったほどである。

 私だけではない。現在世に出ているメジャーなIDEの多くがVisual Studioにどこかしら似ているように思えることからも,影響力は莫大であったと言える。余談だが,こうして考えると,特定の環境に囲い込まれて暮らしていくのも悪くないものである。極論すれば,顧客あるいはユーザーにとって,自分が利用するシステムの実現手段の選択肢が広いか狭いかなどといったことは,実はどうでもいいことなのだ。

 私がC言語からC++言語に移行するにあたって,Visual C++の恩恵ははかりしれないものがあった。なんとVisual C++には,クラスライブラリであるMFC(Microsoft Foundation Classes)のソースコードが付いていたのである。当然のことながら,ソースコード・デバッガを使って内部の動きまで細密に観察できる。おかげで私はC++言語固有の込み入った機能,コンストラクタ/デストラクタだとか,基底クラス/抽象メソッドの考え方をはじめとして,派生クラスによるメソッドのオーバライドを前提とした設計技法,インライン関数の書き方,あるいは「アプリケーションに唯一」のインスタンスを用意する手法など様々なプログラミング・テクニックを学んだ。

 そうして私は約1カ月でC++言語をほぼひと通りマスターできた。C++言語の策定が始まった時期に「そのうち,今の構造化プログラミングと同じように,オブジェクト指向プログラミングが最低限のスキルになる時代が来るはずだ」と発言した人がいるが,いつしか私も「struct …」と書く代わりに「class …」と書き始めるようになっていたのである。しかし,オブジェクト指向だからこそ悩むことがある。次回はそうしたことについて書いてみようと思う。