| ||||||
C++は新しい言語になった感じがする。C++11では、C++98と比べて、よりクリアで、より簡潔で、より直接的に、自分のアイディアが表現できる。コンパイラは、より優れたチェックを行うし、プログラムは高速に動作するようになった。 本書では、私は完全性(completeness)を目標とした。プロフェッショナルプログラマが必要とするであろう、すべての言語機能と標準ライブラリコンポーネントを解説している。具体的には、以下の点に注意を払った:
C++の使い方は、時の流れとともに劇的に変化したし、言語自体もそうである。プログラマにとって、ほとんどの変化は、改良となっている。現在のISO C++標準(ISO/IEC 14882:2011:一般にC++11と呼ばれる)は、これまでのバージョンよりも高品質のソフトウェアを記述できる道具となった。どのくらい優れた道具となったのだろうか? 現代のC++では、どのようなプログラミングのスタイルやテクニックが使えるのだろう? そのプログラミングのテクニックを利用する言語機能や標準ライブラリ機能とは何だろう? エレガントで、正確で、保守しやすくて効率的なC++コードの構築要素とは何だろう? 本書は、これらの疑問に答える。1985年、1995年、2005年のビンテージもののC++での回答とは、その多くが一致しない。C++は、進化した。
C++は、タイプリッチで軽量な抽象化の設計と利用を重要視した汎用プログラミング言語である。ソフトウェアインフラストラクチャにあるような、資源に制約のあるアプリケーションに特に適している。時間をかけて高品質なプログラミング技法を修得するプログラマにとって、C++は価値あるものだ。C++は、プログラミング作業に真剣に取り組む人向けの言語である。今の社会は、ソフトウェアに大きく依存しているので、高品質ソフトウェアは必須である。
これまでに、数十億行にもおよぶC++コードが、開発され、利用されてきた。安定性が極めて高いので、1985年版のC++、1995年版のC++のコードが現役で動作しているし、今後数十年間も動作し続けるだろう。とはいえ、現在のC++を使うと、すべてのアプリケーションが、よりよくコーディングできる。古いスタイルにしがみついていると、低品質で性能が劣るコードになってしまう。安定性を重視するのならば、標準に準拠したコードを書こう。そうすれば、今後20年、30年間は利用できるだろう。本書で示すコードは、すべて2011年版のISO C++標準に準拠している。本書は、3種類の読者層を想定している:
当然ながら、上記3種類の読者層が重複することもある。そもそも、プロフェッショナルなソフトウェア開発者は、複数のプログラミング言語をマスターするものだ。
本書は、読者がプログラマであると想定している。“forループって何?”とか“コンパイラって何?”と疑問に感じるのであれば、本書に取り組むには(まだ)早い。本書の代わりに、Programming: Principles and Practice Using C++を読んで、プログラミングとC++を、初歩から始めてほしい。また、ソフトウェア開発者としてある程度の経験があることも想定している。“なんでテストなんか気にするの?”とか、すべての処理に万能な言語が一つ存在して“言語は基本的にすべて同じ。文法だけ教えてほしい。”とか、単一の言語がすべての仕事に対して理想的なものであると思い込んでいる方も、本書の読者ではない。 C++11は、C++98を超えるどんな機能をもっているのだろうか? 一例をあげよう。現代のコンピュータに適した数多くの並行処理機能によるマシンモデル。システムレベルの(たとえばマルチコアの活用などによる)並行プログラミングを行うための言語機能と標準ライブラリ機能。正規表現の取扱い、資源管理ポインタ、乱数、(ハッシュ表を含む)高度なコンテナなど。さらに、統一された汎用初期化構文、簡潔なfor文、ムーブセマンティクス、Unicodeのサポート、ラムダ式、汎用定数式、クラスのデフォルト動作の制御、可変個引数テンプレート、ユーザ定義リテラルなどだ。これらのライブラリ機能と言語機能は、いずれも、高品質なソフトウェアを開発するプログラミング技法のためのものである。ある特定の問題を解決するために個別に使用するのではなく、建築物に用いる煉瓦のように、複数の機能を組み合わせて使うものだ。コンピュータは、あらゆる用途にかなう機械であり、C++がその能力を引き出す。C++の設計は、開発者が想像すらできないような将来の問題にも対応できるほどの高い柔軟性と汎用性を目標としている。
これまでのすべての版の謝辞で名前をあげた方々に加えて、次の方々への謝意を表する。Pete Becker、Hans-J. Boehm、Marshall Clow、Jonathan Coe、Lawrence Crowl、Walter Daugherity、J. Daniel Garcia、Robert Harle、Greg Hickman、Howard Hinnant、Brian Kernighan、Daniel Krügler、Nevin Liber、Michel Michaud、Gary Powell、Jan Christiaan van Winkel、Leor Zolman。彼らの支援がなければ、本書をここまで充実させられなかった。 標準ライブラリに関する多くの質問に回答してくれたHoward Hinnantにも謝意を表する。
Originライブラリの開発者であるAndrew Sutton。Originライブラリは、テンプレートを解説した章の複数の概念、および第29章で提示した行列演算ライブラリを解説する際の確認に利用した。Originライブラリはオープンソースであり、ウェブで“Origin”や“Andrew Sutton”を検索すれば見つかる。 “探検”の章に潜んでいた問題箇所を他の誰よりも多数発見してくれた、私のソフトウェア設計クラスの大学院生に謝意を表する。 レビュアからのアドバイスのすべてを取り入れることができれば、本書が大きく進化することは間違いない。しかしそうすると数百ページも増えてしまう。専門家によるレビューでは、技術的な詳細、よりよいサンプルコード、開発上の有用な規約など、多くの追加提案が寄せられた。専門家ではないレビュー(または教育者によるレビュー)でも、サンプルコードの追加提案が寄せられた。また、ほとんどのレビューアが本書は長すぎるかもしれないとの意見を寄せてくれた(適切な指摘である)。
プリンストン大学の計算機科学部、特に研究休暇の一部を取らせてくださったBrian Kernighan教授に謝意を表する。おかげで本書を執筆する時間がとれた。
ケンブリッジ大学の計算機研究所、特に研究休暇の一部を取らせてくださったAndy Hopper教授にも謝意を表する。やはり本書を執筆する時間がとれた。
本書の編集者Peter GordonとAddison-Wesleyのチームの支援と辛抱に謝意を表する。
College Station, Texas
| ||||||