「C++の設計と進化」を読みました
「C++の設計と進化(http://www.amazon.co.jp/exec/obidos/ASIN/4797328541/arielnetworks-22/)」を読みました。
Javaを意識してないふりをしながら意識している感じが伝わってきました。読み手がそういう目で読むからそう見えるだけでしょうか。本文はともかく、第-1章(翻訳版のために後から書かれた39ページのスペシャル前書き)でのJava攻撃は直截的すぎます。以下のような感じです。本文で抑えていた感情が日本語向けの特別書き下ろしで爆発してしまった感じです。
空前の量のごまかしとやはりこれも空前の量の非プログラマ向けの宣伝とともに、Javaがプログラム・シーンに踊り出てきた。
まあ、ストラウストラップ氏がJavaをどう思っているかに興味はないので、どうでもいいのですが。
ストラウストラップ氏が言語設計に関して全編に渡って次のことを強調しています。
- 高速な実行速度
- 静的型の安全性
- 実用主義
すべて素晴らしいです。
最近は、実行速度なんて二の次だ、という主張をする人もいます。速度が重要ではない局面があるのは認めます。速度以外を重視して設計したプログラミング言語も否定はしません。でもぼくは速い言語が好きです。
静的型も好きです。動的型言語も否定はしません。適材適所でしょう。しかし、コンパイルでエラーを見つけられる静的型の安心感が好きです。書く手間が増えても読む時の負担を減らす方が正しい道だと信じています。
ストラウストラップ氏の実用主義を示す名言を引用します。
私は当時も今も、言語の設計は原理原則からスタートするものではなく、経験と実験と健全な工学的トレードオフに裏打ちされたアートである、と信じている。
かっこいいです。
第4章の「C++言語の設計ルール」も珠玉の名言にあふれています。特に「4.4 言語技術的なルール」です。列挙してみます。
- 静的タイプシステムに対する暗黙の侵犯がない
- ユーザ定義タイプにも内蔵タイプと同格の良質なサポートを提供する
- ローカリティの尊重
- 順序依存性を避ける
- 同じ機能なら人に教えやすいほうを選べ
- シンタクスは重要だ(ときには悪い意味で)
- Cのプリプロセッサを使わないようにする
第4章はこれらに関する深い話が続きます。時間のない人はここだけでも書店で立ち読みする価値があります。
ストラウストラップ氏の主張はどれもこれも自分好みです。その上、自分はCも好きです。
これだけの条件が揃っていながら、自分がC++を好きではないのが不思議でなりません。
なぜだろうと考えてみました。
たぶん、C++の高度な機能とGCのないことの両立に無理があるせいではないかと思います。たとえば、C++には「真のローカル変数(本書での表現)」があります。Javaと比較すると、Javaではオブジェクトはヒープにしか確保できません(注)。一方、C++はスタックに積めます。以前、「 プログラミング言語Goの第一印象 」でも少し触れましたが、基本的にはできた方が良いと思っています。C++のクラスにはコンストラクタとデスクトラクタという言語機能があります。これも単体で見れば悪くありません。しかし、これらの機能とGCがないことが組み合わさると思わぬバグ(ダングリングポインタやメモリリーク)を生みます。単体でそれぞれを見れば悪くない機能であってもです。
もちろん、ちゃんと書けばダングリングポインタもメモリリークも起きません。それを言うなら、どんなプログラミング言語でも、ちゃんと書けばバグは生まれません。結局、どれだけ落とし穴があるかの程度問題です。残念ながらC++には落とし穴が多すぎます。
GC好きなんですか、と言われそうですが、いえ、GCがない言語も欲しいと思っています。GCがどれほど効率的になろうと、固有にチューニングして作り込んだメモリアロケータの効率には敵わないからです。そうです、矛盾しています。悪いのはC++ではなく、矛盾している自分にあるのです。
そんなわけでC++が嫌いではあるのですが凄いとは思っています。
Javaプログラマも教養のために読んでみてはどうでしょうか。Javaなら、「 EffectiveJava 」と「 パーフェクトJava 」でも読んでおけば事足ります。ゴールデンウィークに腰を据えて読むならこういう本です。
(注) Javaもエスケープ分析でオブジェクトをスタックに積めるようですが、シンタクス的にはできません。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/d-and-e/tbping