↑ 「SilverSackの書斎から」のページへ

↑ トップページへ

★ [SilverSackの自画自賛] SilverSackの書斎から

★

 「C++の設計と進化」(ビョーン・シュトラウストラップ)


☆ やっと読みました

この「C++の設計と進化」は、2005年に出た本で、出た時から興味はあったのですが、アマゾンの書評に「ソースコードの部分が多く難解」とあったり、当時は私のようなホビープログラマーにとっては「これからはC#だ、C++はもう古い」なんて空気になってたり、やたら分量が多い、とかいう理由で、尻込みしていたのでした。5年経って漸く手にしたのですが、もっと早く読めば良かったなと後悔しています。分量が多いのは確かで、私が出張の移動時しか本を読まないのもあって、結局は読むのに3ヶ月位かかってしまったのですが、記憶も動作も正確さを欠く人間という生き物が、一文字でも間違うと動かなくなってしまうプログラムというものを、どうやったら協働しながらミスなく作ることができるのかを考えて、言語仕様を詰めていく様は、非常に面白いものがありました。どう考えてこうなっているのかといった事情を語るプログラム言語関係の本は少ないのですが、やはり興味深いものがあります。

全体は以下のような構成になっています。

-1章 2005年のC++ 今回の日本語版を作成するに辺り著者本人が追加した、現在とこれまでの10年とこれからの10年のC++を俯瞰したもの
まえがき 1995年に原著が発行されたときの前書き
監修者序文 監修者επιστημηさんによる楽屋裏のお話
0章 読者のための注記 本書を読むに当たっての参考情報
1章 C++の前史 C++を生むに至った背景と経緯
2章 C with classes C++の前身となったC with classesの開発経緯と開発過程
3章 C++の誕生 C++の誕生経緯とその個々の仕様の開発と決定の経緯
4章 C++言語の設計ルール C++の設計方針について
5章 1985~1993年のできごと C++のISO規格化に至る道
6章 標準化 C++のISO規格化中の議論
7章 C++への関心と利用 C++の普及と使用の状況
8章 ライブラリ C++の持つライブラリについて(ちなみに原著が書かれたときはまだSTLはC++に含まれていなかった)
9章 そしてこれから 1994年時点でのC++の現状の総括
10章 メモリ管理 メモリ確保とガベージコレクションの扱いについて
11章 オーバーロード オーバーロードをどう扱うべきかとどう扱ったか
12章 多重継承 多重継承を巡る議論
13章 クラス概念の高度化 クラスでカバーできることの拡張について
14章 キャスト 安全ではないCのキャストを安全にするための新しい仕組みについて
15章 テンプレート テンプレートの意味、意義と正しい使用法に関する議論
16章 例外処理 例外処理に開発を巡る議論と現在の使用の背景
17章 ネームスペース ネームスペースの目的と正しい使用法
18章 Cのプリプロセッサ Cのプリプロセッサを如何に排除していくか
訳者あとがき 訳者の私的感想

全体は、三つに分けることができて、

-1~0章 前書き。
1~9章 C++のrelease1.0が出た時点でのC++の成り立ちを時系列を追って説明したもの。
10~18章 C++のrelease1.0が出た後追加された機能を機能別に説明したもの。

という感じになっています。

☆ プログラム言語の本として

C++という言語は、「オブジェクト対応のC言語」といった言われ方をよくするのは、その通りで開発経緯を語る記述の中でも作成した本人がそう語っているのですが、その中で「Cの効率を損ねない」ことにかなり神経質なまでに注意を払っていたことに驚きました。私が趣味でプログラムをやっていた頃は、「速いプログラムを書くことに気を配るより、見やすいプログラムを書くことを心がけなさい。速度については、最近のコンパイラは賢くなったので、書き方で余り差は出ません。寧ろ、問題の修正がし易いように読みやすく書くことに気を配った方が良いです。」などと言われていて、言語仕様がそんなに効率化に影響するとは思ってなかったのです。それから、処理系に因って違うなんて事情があるのをやっと知り始めた頃で、実装が違うとプログラムのやり方が変わる程度の内容しかない言語仕様というものに効率を左右するような力があるとも思ってなかったのです。

なんてところが、ざっと思いつく記述ですが、最初に読んだC++の教本に「C++は効率を落とさないために工夫されている」とあって、「ああ、そうなんだ」と思いましたが、それを実現するためにここまで意識と手間をかけていたとは思いませんでした。

もう一つC++については、同様なオブジェクトプログラミングができる言語としてJavaとC#と比較されることが多いですが、開発時期が10年ずれているということの影響を主因として、背負っていたものと目していたものがC++とJava/C#では違うんだ、ということも感じました。

「Cにオブジェクトプログラミング機能を追加する」という選択が目していたところは、以下のような内容と読みました。

  1. 最も効率が良い言語の一つであるCにオブジェクトプログラミング機能を追加することによって、最も効率が良いオブジェクトプログラミング環境を実現したい。
  2. Cは、最も広く利用されている言語であったので、このユーザーが抵抗なくオブジェクトプログラミングに移行できるように、従来のCの開発機能も残して、それにオブジェクトプログラミング機能を追加する形を取った。
  3. オブジェクトの考え方を導入することによって、プログラムの部品化を進める。これによって、問題の局所化を計ると同時に、作成の分業を可能にする。
  4. 抽象化の考え方を導入することによって、部品化されたプログラムの汎用性を高め、再利用性を高める。

JavaやC#が出てきた頃は、ここら辺の事情に若干の変化があったように思います。10年経ってCPUの性能の向上もあり、効率を犠牲にして開発の効率性を上げるという選択に妥当性が出てきたこと、目的は異なるとしても開発環境とプログラム言語が一体化して、開発環境がかなりのブログラムの部品を提供するようになったことあたりが、この背景にある変化だと思いますが、そうすると上記の1項と4項は、JavaとC#では余り考慮していない(開発環境作成時に考慮はしていると思いますが、しかし言語として公開しているわけではないので)ということになるでしょう。そう見てみるとC++は、コンパイラの作成、ライブラリの作成、プログラミング辺りをひっくりめて対象にしているわけで、C++を語ることは、プログラムの考え方についてかなり広い範囲を考察することになるのだと思います。本の帯にある「C++プログラマのみならず全プログラマ必読の書」とありますが、頷けるのと同時に、C++の成功がシュトラウストラップさんの見識と考察の高さの賜であることが分かります。

☆ 私個人にとって

私は、プログラムは趣味で、今の主な仕事は、会計関係ですが、実はここら辺の仕事にプログラムを勉強した経験は結構役立っています。決算作業では、かなりのステップの計算作業を間違いなく進めていくことが必要になるわけですが、これを実行する上で、プログラミングでの問題を局所化する方法とか、処理を構造化する方法とかは、かなり有効なのです。

そういうプログラムでの方法論や概念を私は決算作業に適用していったわけですが、そこら辺の試行錯誤を経験していたので、C++構築でのシュトラウストラップさんの試行錯誤は非常に共感と興味を持って読みました。(客観的には比較にならないくらい規模に差がある経験ですが、まあ、私が強い共感を持って読んだのは事実なので。)で、以下のC++の総括は、非常に心に残りました。何かをやろうとした場合に直面する普遍的な内容があるように思います。

誰でも読める本ではありません(流石に、C++の知識が全くない人間がここでの著者の試行錯誤に感動できるとは思えないので。)が、C++の知識があれば、プログラムのノウハウを離れても興味を持って読める本であると思います。

☆ ネット上の更なる情報

いつも本の記事を検索すると本屋さんのサイトが上部にずらっと並んで、個人の書評はなかなか見つからないのですが、こちらはずらっと骨のある書評が並びました。流石、硬派の本ですな。

(2011年 2月12日 記)