1 ポイント 投稿者 GN⁺ 2024-04-20 | 1件のコメント | WhatsAppで共有
  • 『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++の一部を示す目的もある

サポート資料とコード

Webに残っているPPP2の章

翻訳状況

  • PPP3の翻訳版はまだない
  • 以前の版の翻訳は book covers page で確認できる

1件のコメント

 
GN⁺ 2024-04-20
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は #includeint 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になりたくない場所は例外かもしれない。
    • 現在の GCC 13.2.1ドキュメント は、標準ライブラリはインポート可能なヘッダーユニットとして提供されていないと述べている。そうしたユニットをインポートするには、まず明示的にビルドする必要があり、注意しないとモジュール機構がマージしなければならない重複宣言が発生して、コンパイラのリソース使用量がヘッダーファイルの分割方法に影響される可能性がある。
      そのため現時点では、適切な モジュールファイル を先に書かなければ import は動かない。ただ、GCCの標準C++ライブラリ更新にそれほど時間はかからなそうなので、将来的にはこの新しい本をそのまますぐ使えるようになるだろう。
      すでに古いC++を知っていて知識だけを更新したい人にとっては、そのモジュールファイルを自分で書くこと自体が良い学習経験になるかもしれない。
    • 今では、興味深いC++プログラムを ビルドシステム なしで維持するのは現実的ではない。それでも例に挙げられた g++ 呼び出しは、いつか誰かがGCCにパッチを入れれば、コンパイラの特別扱いで動くようになる可能性が高い。
      おおむね研究用の例を除けば、g++ 呼び出しを直接つなぎ合わせる方式はもう現実的ではない。他のコンパイル言語でも、gccgorustcjavac を直接触るより、gobuild、cargo、Mavenのようなシステムを使う。
      [https://www.kitware.com/import-std-in-cmake-3-30/](https://www.kitware.com/import-std-in-cmake-3-30/
    • 本のページで参照されているこの文書が、モジュール問題 の助けになるかもしれない: https://www.stroustrup.com/module_use.html
  • GUIの章で、FLTKの代わりに Qt に変わった。業界でQtは広く使われているので、かなり大きな変化で、好意的に受け止められそうだが、学習曲線がどう変わるかは分からない。

    • Stroustrupが Meta Object Compiler をどう考えているのか気になる。ある意味では、QtはC++の独自方言のように感じる。
    • Qtには Qt Creator があるので、より良くなった方向だと思う。
    • ユーザー定義のラッパーライブラリを使うので、実際のQtがどれほど露出するのかはよく分からない。
    • 試したAIコーディングアシスタント4つ(claude3、gemini、gpt4、deepseek)すべてに、C++でboidsとGame of Lifeを書いてくれと頼んだら、グラフィックスに SFML を使った。
      クロスプラットフォームだからなのか、それともこれらのモデルが学習したコードに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:: の中身は非常に大きく、さらに大きくなり続けているので、名前衝突の可能性そのものを避けたい。
      コードは一度書くが何度も読まれるので、名前空間込みで短い名前を選ぶのは、効率面で悪い選択に見える。
    • 名前衝突がないのは良いことだ。とはいえ、どういうわけか 他の言語はこの問題を解決 している。
    • C++モジュールがきちんと定着すれば、これはもう議論の対象ではなくなるのではないかと思う。
    • std 自体より、二重コロン :: が醜悪だ。なぜ他の言語のように単にドット1つを使えなかったのか、理解できたことがない。
    • Windowsでプログラミングを学んだのだと思う。
  • 10年以上C++を使っていないが、この本の以前の版を本当に深く学んだ記憶がある。大学で4年間、ほぼ99% C++を使った後だったにもかかわらずそうだった。
    本当に良い本だ。本の中のC++を時間をかけてきちんと理解すると、世の中がなぜあれほどC++を恐れていたのか、少し悲しく感じるほどだ。
    もちろんその後、こういう本をまったく読まずにひどいC++コードを書く人たちに山ほど出会うことになった。

  • C++で仕事をしていた頃が懐かしい。以前より開発スタックのさらに低い層に降りた感じがする。昔はUI、APIのパース、ほとんどすべてを**C++**で処理していた。

    • しばらくFortranが懐かしかったが、30分ほど書いてみたらすぐに治った。C++でJSONパースを一度やってみて、その懐かしさがその過程に耐えられるか見ればいい。
    • 自分も本当に懐かしい。そんなに昔でもないのに、クライアントとサーバーがどちらもC++のアプリがあり、UIもAPIも何もかもC++だった。本当に汎用言語が到来したように感じた。
      完璧だったとは言わないが、仕事は面白かったし、そのスタックで働ける高いレベルの人たちと一緒にいられるのが楽しかった。ブレードサーバーでdistccを動かしてビルドをずっと速くしたときほど興奮する昼休みはなかった。Linuxの熱心なユーザーが自分だけではなかったのも楽しかった。
    • うちの会社ではUIを除くほぼすべてがC++だ。UIだけがC++でない唯一の理由は、新卒がC++の訓練を受ける前でもすぐ作業できるコードベースの一部を残しておくためだと思っている。
    • C++欲を満たすために、今でも個人プロジェクトでゲームエンジンを少しずつ触っている。あらゆる批判があっても、C++を書くのが本当に好きだ。
    • ただPythonで仕事をしないことを願うだけだ。
  • この1年で第2版の大半を終えた。本当に素晴らしい本で、長年プログラミングでぶつかってきたいくつもの精神的な壁を越える助けになった。
    今回の版が薄くなった主な理由は、Part IV: Broadening the Viewが抜けたためだ。テキスト処理、数値計算、組み込みシステムといった追加トピックを扱っていたこの部分は、今ではオンラインで提供されている。該当する章は今でも関連性があり、C++11/14を使っているため、第2版から更新されてはいない。

  • モダンC++を継続的に更新している本、C++ Annotationsも共有しておく: http://www.icce.rug.nl/documents/cplusplus/

    • エミュレータプロジェクトで、クラス付きCにスマートポインタとautoだけを加えて使う程度なら、かなり悪くないアプローチなのか気になる。
      以前、C++には4つの構成要素があると聞いたことがある。第一は「C」、第二はオブジェクト指向、第三はSTLやテンプレートのような生産性と柔軟性、最後はvolatileasmのような特殊な状況向け、という分類だった。その人は1番は慎重に使い、4番を使わなければならない状況は避けるよう勧めていたが、これが筋の通った話なのか気になる。
    • 404になる。
  • もっと分厚い鈍器本になると思っていたが、驚いたことに半分になっていた。
    第2版はペーパーバックで1312ページ、重さ4.81ポンド、第3版はペーパーバックで656ページ、重さ2.71ポンドだ。

    • 序文を見ると、参考資料のかなりの部分を本から外して、インターネット上のC++ドキュメントに移したようだ。
      “Programming: Principles and Practice Using C++” 第3版は第2版の半分ほどの大きさで、本を持ち歩かなければならない学生は軽くなった重量を歓迎するだろう、とある。薄くなった理由は、C++と標準ライブラリに関するより多くの情報がWeb上にあるためだとされている。
    • C++の知識をポンド単位で数えているのを見るのはいい。
    • 文字どおり正確に半分だ。フォントを小さめに選んだのか気になる。
  • Bjarneはなぜ#includeの後にスペースを入れるときと入れないときがあるのか気になる。
    https://www.stroustrup.com/PPPheaders.h

    • 手入力したヘッダーとIDEが自動挿入したヘッダーが混ざっていて、さらにimportをデフォルトで折りたたむ設定があったり、保存時にclang-formatを走らせていなかったりしたなら、見落としてもおかしくない。
  • 新しい版が出たのは本当に楽しみだ。C++に興味がない人や、すでに熟練したプログラマーであっても、この本は読む価値がある。
    私の知る限り、技術文書とコンピュータプログラミング教育の最良の事例の一つだ。