2005年1月に出た「C++の設計と進化」(ソフトバンク パブリッシング発行)を読んだ。C++の設計者であるStroustrup自身が,C++の設計哲学や標準化されるまでの出来事を語った本である。原著が出たのは1994年とかなり古いが,日本語版にはStroustrupによる「2005年のC++」という1章が加筆されている。原著を読まれた方も,とりあえず手にとってみてはいかがだろうか。

 さて,本書を読んで改めて感じるのが,日本におけるC++の最近の評価が低すぎるのではないかということだ。Javaが普及した今となっては「もはや過去の言語」という声すら聞くほどだ。10年以上にわたってC++を触ってきた記者から見ると,悲しい限りである。

 確かに,開発コストを考えると,業務システムの開発にC++がほとんど使われないのは仕方がない。しかし,実行速度やメモリー効率が重要なソフトや,コストを掛けただけの見返りがある(=販売本数の増加によってコスト増を吸収できる)ソフトの開発ではC++の独壇場である。実際,ワープロ・ソフトをはじめ,一般的なパソコン・ユーザーが利用するアプリケーションのほとんどはC++で組まれていると言ってよい。

 業務システムについても,その下で動作するOS,Webサーバー,データベース管理システム,Java VMなど多くのソフトがCまたはC++で組まれたものだ。日本でC++の評価が低いのは,こうしたソフトの大部分が海外製であることの裏返しではないか,とまで思える。

長所が多いのにC++の評価が低くなった理由は?

 特に不思議なのは,Cは相変わらず人気があるのにC++がそうでないことである。記者が所属する日経ソフトウエアでは,Cの入門連載の読者アンケート結果は全連載中で1,2を争うほど良いのに,C++にするとなぜか下がってしまう。書籍の売り上げも,Cの入門書はJavaほどではないにせよ比較的よく売れているのに対し,C++はさっぱりのようだ。

 C++はCとの互換性を可能な限り保つように設計されており,「より良いC」としても使える言語である。例えば,C++では関数(正確にはブロック)の先頭でなくても変数を宣言できるので,宣言と同時に初期化することで初期化忘れを防ぐことが可能だ。コンパイル時だけでなく,リンク時にも型チェックが行われるなどCと比べて安全性も高い。データ構造のメモリー・レイアウトや関数の呼び出し形式などをCと同じするのも簡単なので,既存のCのコードをそのまま利用し,新たに書き起こす部分だけをC++で組む,というのも難しくない。

 オブジェクト指向が分からなくても,C++を使うメリットは十分にあるのだ。C++のまともな処理系が存在しない一部の組み込み系などの環境を除けば,いまだにCで組むことなど考えられない,というのが筆者の正直な気持ちである。

 C++の評価が低いのは,Javaが登場した際に「C++で問題とされていた部分をJavaで変更した」という言い方をされることが多かったのが原因ではないかと思う。確かに,C++にはCとの互換性を優先したために問題を抱えている部分があることは間違いない。しかし,JavaとC++とで言語仕様が異なる点について,単純に「Java=良い」「C++=悪い」という図式が当てはまるわけではない。

JavaとC++を比較してみる

 例えば,「C++の演算子オーバーロード(多重定義)は,コードの可読性が低くなるのでJavaではユーザーによるオーバーロードをサポートしていない」と言われることがある。この記述自体は誤りとは言えないが,「演算子オーバーロードを使うとコードの可読性が下がる」と短絡的に理解するのはあんまりだろう。例えば複素数を表すオブジェクトc1~c4に対して

c4 = c1.add(c2).add(c3);

と記述するよりも,演算子「+」をオーバーロードして
c4 = c1 + c2 + c3;

と記述した方が誰にとっても分かりやすいのは明らかだ。

 もちろん,不自然な演算子オーバーロードが可読性を下げることがあるのは事実だし,期待通りにプログラムが動かない原因をひたすら探した挙句,ライブラリの中で*や[]などの演算子がオーバーロードされていることに気付く,といったこともあるだろう。ただ,C++では演算子オーバーロードが拡張性/再利用性やパフォーマンスを向上させるための非常に重要な道具の一つであり,STL(Standard Template Library)などでも頻繁に利用されている。少なくとも,現在のC++プログラマの大多数は,演算子オーバーロードがないと困る,と言うはずだ。