Stroustrup『Programming: Principles and Practice Using C++』第3改訂版
(stroustrup.com)- 『Programming: Principles and Practice Using C++』第3版は、プログラミングを初めて学ぶ読者を主な対象としており、多少経験のある読者にとっても モダンC++ とより良いスタイル・技法を身につける入門書として使える
- 本書の中心はC++文法の細かな暗記ではなく、プログラミングの基本原理と実践技術であり、手続き型・オブジェクト指向・ジェネリックプログラミングをあわせて扱う
- PPP3はPPP2より約半分のサイズに縮小され、1学期のコースで扱う基礎章を強化しつつ、C++20・C++23とQtベースのGraphics/GUIコードを反映している
- より専門的な章と純粋な参考資料はWebへ移され、必要なときに参照できるようになっており、最新の参考情報はcppreference.comのようなWeb資料で補う流れになっている
- サンプルPDF、PPPモジュール・ヘッダ、Qt GUIコード、講義スライド、コーディングスタイルガイドなどが提供され、授業と独習の両方に活用できる
本の目的と対象読者
- 『Programming: Principles and Practice Using C++ (3rd Edition)』、略称 PPP3 は、プログラミング経験のない人のための入門書である
- すでに少しプログラミングをしたことがある読者も、スタイルや技法を改善したり、モダンC++ を学ぶ資料として活用できる
- 授業用として設計されているが、独習も念頭に置いて書かれている
- 以前の版はTexas A&M Universityの電気工学、コンピュータ工学、コンピュータサイエンスの学生向け初回プログラミング授業や各所で使われてきた
プログラミングの教え方
- 本書は、読者が最終的に他人が使って保守できるほど良いプログラムを書けるようになることを目標としている
- 焦点は枝葉の言語技術の詳細よりも、基本概念と技法にある
- 単なるC++言語の入門書ではなく、プログラミング一般の入門書として構成されている
- 手続き型プログラミング
- オブジェクト指向プログラミング
- ジェネリックプログラミング
- モダンな高水準技法とともに、ハードウェアを効率よく使うために必要な低水準技法も扱う
- 有用で、正確で、型安全で、保守しやすく、効率的なコードを書くための基盤を提供する
- 必須概念、設計とプログラミング技法、言語機能、ライブラリを幅広く扱う
第3版で変わった点
- PPP3はPPP2に比べて約半分のサイズである
- 1学期のコースで通常扱う基礎章を強化することで分量を削減した
- C++20とC++23の中核部分を活用している
- Graphics/GUI章のコードを Qt ベースで再構成し、ブラウザや携帯電話のような環境での移植性を考慮している
- PPP2で“broadening the view”と呼ばれていた、より専門的な章は、必要なときに使えるようWebに配置された
- 純粋な参考資料は削除された
- より多く、より新しい資料をWebで見つけられ、例としてcppreference.comが挙げられている
C++標準とライブラリの範囲
- 本書は C++20とC++23 を使用する
- 組み込み型とユーザー定義型の設計と利用を扱う
- 入力
- 出力
- 計算
- シンプルなグラフィックス/GUI
- C++標準ライブラリの コンテナとアルゴリズム の入門も含まれる
公開されているサンプル資料
- Preface: 本書が約束することと約束しないことを扱う
- Table of Contents: 目次PDF
- Chapter 0: Notes to the Reader: 本書のアプローチ案内
- Chapter 10: A Display Model: サンプル章
- 完全な初心者はまだ読まないほうがよい
- 教員と経験のある読者に対して、週2章のペースなら約5週目に本書が到達する水準を示すための章である
- モダンC++の一部を示す目的もある
サポート資料とコード
- Links: C++実装系と開発環境へのリンク、始めるための簡単な助言
- How to use modules?:
PPP_support.hを使って module PPP をビルドする方法を含む - module PPP: モジュールを使える場合に使うPPPモジュール
- header "PPP.h":
stdとPPPモジュールを最も簡単に使うためのヘッダ - header "PPPheaders.h": ヘッダファイル利用へ戻す必要があるときに使うヘッダ
- GUI support: PPP3の10〜14章向けGraphics/GUIユーザーインターフェースライブラリを含む
- 実行には Qt のインストールが必要
- The User Manual も提供される
- Sample code from the various chapters: 各章のサンプルコード、TBD表記あり
- Errata: 正誤表
- Lectures based on PPP: PPP3向けに更新された講義スライド
- PPP Coding Style Guide
- Exercise Material: TBD表記あり
Webに残っているPPP2の章
- PPP2の一部の章は C++14 を使って書かれているが、今でも正しく、その主題を妥当に紹介している
- 提供されているPPP2資料:
翻訳状況
- PPP3の翻訳版はまだない
- 以前の版の翻訳は book covers page で確認できる
1件のコメント
Hacker Newsのコメント
この本の「古典的な最初のプログラム」が、1行目から
import std;を使っているのはかなり問題だと思う。知る限り、MSVCあたりを除けば、どのコンパイラもデフォルト状態ではまともに対応していない。Debianで
g++ --std=c++23 -fmodules-tsを使っても駄目で、https://en.cppreference.com/w/cpp/23 を見ると関連提案はP2465R3だが、clang++ 17も「部分対応」だ。clang++17をインストールしてもmodule 'std' not foundと出る。import std;が非常に新しい機能だというのは理解しているが、この本は C++入門者向け なので、平均的な初心者がどう反応するのか気になる。1〜2年前に「Tour of C++」を読んだときも同じ問題を見た。g++もまったく同じエラーと案内を出す。いま話題のStroustrupの最新版は読んでいないが、以前の版はC++を毎日使っていた頃に読んだ。20年たった今でも、KoenigとMooの Accelerated C++ のほうが好きだ。その後もっと良い本が出ているかもしれないが、読めてはいない。
記憶では、その本のHello Worldは
#include、int main()、std::cout << "Hello, world!" << std::endl;のような形で、今のArch Linuxでもg++ a.cppでビルドして./a.outを実行すればそのまま動く。本全体は、モダンC++でCのポインタ演算なしに、ほとんど擬似コードのように単純でクリーンなスタイルをまねる、優れた構成だった。初期のPythonの端正な感じにも似ていたが、Pythonのほうには後にpandasがnumpyやscipyのようなC++ラッピングライブラリを連れてくるまでは、そういう要素はなかった。
実務ではクリーンなC++コードをほとんど見なかった。FAANGで働いたわけではないし、速いプロトタイプではコードレビューもまれだったので、自分が経験したグリーンフィールドの世界の外で、KoenigとMoo式の指導がどれほど広がっているのかは分からない。放射線治療分野のように、次のTherac-25になりたくない場所は例外かもしれない。
そのため現時点では、適切な モジュールファイル を先に書かなければ
importは動かない。ただ、GCCの標準C++ライブラリ更新にそれほど時間はかからなそうなので、将来的にはこの新しい本をそのまますぐ使えるようになるだろう。すでに古いC++を知っていて知識だけを更新したい人にとっては、そのモジュールファイルを自分で書くこと自体が良い学習経験になるかもしれない。
g++呼び出しは、いつか誰かがGCCにパッチを入れれば、コンパイラの特別扱いで動くようになる可能性が高い。おおむね研究用の例を除けば、
g++呼び出しを直接つなぎ合わせる方式はもう現実的ではない。他のコンパイル言語でも、gccgo、rustc、javacを直接触るより、gobuild、cargo、Mavenのようなシステムを使う。[https://www.kitware.com/import-std-in-cmake-3-30/](https://www.kitware.com/import-std-in-cmake-3-30/)
GUIの章で、FLTKの代わりに Qt に変わった。業界でQtは広く使われているので、かなり大きな変化で、好意的に受け止められそうだが、学習曲線がどう変わるかは分からない。
クロスプラットフォームだからなのか、それともこれらのモデルが学習したコードにSFMLの使用例がより多かったからなのか気になる。SFMLはQtやFLTKより比較的新しいもののように思えるので、学習データが多いというのは不思議だし、4つすべてがC++のグラフィックスにはSFMLを使おうと一致したのも奇妙だ。
Stroustrupのコードで気に入っているのは
using namespace std;だ。std::every std::last std::bloody std::thingのように、あらゆるものの前にstd::を付ける慣例は人を狂わせる。using namespaceを絶対に入れてはいけない。名前空間が避けるために作られた名前衝突を、まさにそれで作ってしまうからだ。実装ファイルでも、個人的には
using namespace std;は好きではない。コードの可読性が落ちると思うし、std::の中身は非常に大きく、さらに大きくなり続けているので、名前衝突の可能性そのものを避けたい。コードは一度書くが何度も読まれるので、名前空間込みで短い名前を選ぶのは、効率面で悪い選択に見える。
std自体より、二重コロン::が醜悪だ。なぜ他の言語のように単にドット1つを使えなかったのか、理解できたことがない。10年以上C++を使っていないが、この本の以前の版を本当に深く学んだ記憶がある。大学で4年間、ほぼ99% C++を使った後だったにもかかわらずそうだった。
本当に良い本だ。本の中のC++を時間をかけてきちんと理解すると、世の中がなぜあれほどC++を恐れていたのか、少し悲しく感じるほどだ。
もちろんその後、こういう本をまったく読まずにひどいC++コードを書く人たちに山ほど出会うことになった。
C++で仕事をしていた頃が懐かしい。以前より開発スタックのさらに低い層に降りた感じがする。昔はUI、APIのパース、ほとんどすべてを**C++**で処理していた。
完璧だったとは言わないが、仕事は面白かったし、そのスタックで働ける高いレベルの人たちと一緒にいられるのが楽しかった。ブレードサーバーで
distccを動かしてビルドをずっと速くしたときほど興奮する昼休みはなかった。Linuxの熱心なユーザーが自分だけではなかったのも楽しかった。この1年で第2版の大半を終えた。本当に素晴らしい本で、長年プログラミングでぶつかってきたいくつもの精神的な壁を越える助けになった。
今回の版が薄くなった主な理由は、Part IV: Broadening the Viewが抜けたためだ。テキスト処理、数値計算、組み込みシステムといった追加トピックを扱っていたこの部分は、今ではオンラインで提供されている。該当する章は今でも関連性があり、C++11/14を使っているため、第2版から更新されてはいない。
モダンC++を継続的に更新している本、C++ Annotationsも共有しておく: http://www.icce.rug.nl/documents/cplusplus/
autoだけを加えて使う程度なら、かなり悪くないアプローチなのか気になる。以前、C++には4つの構成要素があると聞いたことがある。第一は「C」、第二はオブジェクト指向、第三はSTLやテンプレートのような生産性と柔軟性、最後は
volatileやasmのような特殊な状況向け、という分類だった。その人は1番は慎重に使い、4番を使わなければならない状況は避けるよう勧めていたが、これが筋の通った話なのか気になる。もっと分厚い鈍器本になると思っていたが、驚いたことに半分になっていた。
第2版はペーパーバックで1312ページ、重さ4.81ポンド、第3版はペーパーバックで656ページ、重さ2.71ポンドだ。
“Programming: Principles and Practice Using C++” 第3版は第2版の半分ほどの大きさで、本を持ち歩かなければならない学生は軽くなった重量を歓迎するだろう、とある。薄くなった理由は、C++と標準ライブラリに関するより多くの情報がWeb上にあるためだとされている。
Bjarneはなぜ
#includeの後にスペースを入れるときと入れないときがあるのか気になる。https://www.stroustrup.com/PPPheaders.h
新しい版が出たのは本当に楽しみだ。C++に興味がない人や、すでに熟練したプログラマーであっても、この本は読む価値がある。
私の知る限り、技術文書とコンピュータプログラミング教育の最良の事例の一つだ。