1 Punkte von GN⁺ 2024-04-20 | 1 Kommentare | Auf WhatsApp teilen
  • Die 3. Auflage von „Programming: Principles and Practice Using C++“ richtet sich vor allem an Leser, die Programmieren zum ersten Mal lernen, kann aber auch für Leser mit etwas Erfahrung als Einführung in modernes C++ sowie besseren Stil und bessere Techniken dienen
  • Im Mittelpunkt des Buches stehen nicht das Auswendiglernen von Details der C++-Syntax, sondern grundlegende Programmierprinzipien und praktische Techniken; es behandelt prozedurale, objektorientierte und generische Programmierung gemeinsam
  • PPP3 ist gegenüber PPP2 auf etwa die Hälfte des Umfangs geschrumpft; die Grundlagenkapitel für einen einsemestrigen Kurs wurden gestärkt, zugleich werden C++20/C++23 sowie Qt-basierter Graphics/GUI-Code berücksichtigt
  • Spezialisiertere Kapitel und reine Referenzmaterialien wurden ins Web verlagert, damit man sie bei Bedarf konsultieren kann; aktuelle Referenzinformationen werden durch Web-Ressourcen wie cppreference.com ergänzt
  • Beispiel-PDFs, PPP-Module und -Header, Qt-GUI-Code, Vorlesungsfolien, ein Coding Style Guide und weitere Materialien stehen bereit und lassen sich sowohl im Unterricht als auch zum Selbststudium nutzen

Ziel des Buches und Zielgruppe

  • „Programming: Principles and Practice Using C++ (3rd Edition)“, kurz PPP3, ist ein Einführungsbuch für Menschen ohne Programmiererfahrung
  • Auch Leser, die bereits ein wenig programmiert haben, können es nutzen, um ihren Stil und ihre Techniken zu verbessern oder modernes C++ zu lernen
  • Es wurde für den Unterricht konzipiert, aber auch mit Blick auf Selbststudium geschrieben
  • Frühere Auflagen wurden unter anderem in ersten Programmierkursen für Studierende der Elektrotechnik, Computertechnik und Informatik an der Texas A&M University sowie an vielen anderen Orten eingesetzt

Wie Programmieren vermittelt wird

  • Das Ziel des Buches ist, dass Leser am Ende gute Programme schreiben können, die andere Menschen verwenden und warten können
  • Der Fokus liegt auf grundlegenden Konzepten und Techniken, weniger auf nebensächlichen technischen Details der Sprache
  • Es ist nicht einfach eine Einführung in die Sprache C++, sondern als Einführung in das Programmieren allgemein aufgebaut
    • prozedurale Programmierung
    • objektorientierte Programmierung
    • generische Programmierung
  • Neben modernen High-Level-Techniken behandelt es auch Low-Level-Techniken, die nötig sind, um Hardware effizient zu nutzen
  • Es bietet eine Grundlage, um nützlichen, korrekten, typsicheren, wartbaren und effizienten Code zu schreiben
  • Es deckt zentrale Konzepte, Design- und Programmiertechniken, Sprachfeatures und Bibliotheken breit ab

Was sich in der 3. Auflage geändert hat

  • PPP3 ist im Vergleich zu PPP2 etwa halb so umfangreich
  • Der Umfang wurde reduziert, indem die Grundlagenkapitel gestärkt wurden, die in einem einsemestrigen Kurs üblicherweise behandelt werden
    • Es nutzt zentrale Teile von C++20 und C++23
    • Der Code der Graphics/GUI-Kapitel wurde auf Basis von Qt neu aufgebaut, um Portabilität in Umgebungen wie Browsern und Mobiltelefonen zu berücksichtigen
  • Die spezialisierteren Kapitel, die in PPP2 als „broadening the view“ bezeichnet wurden, wurden ins Web ausgelagert, damit sie bei Bedarf genutzt werden können
  • Reines Referenzmaterial wurde entfernt
    • Umfangreichere und aktuellere Materialien lassen sich im Web finden; als Beispiel wird cppreference.com genannt

Umfang von C++-Standard und Bibliotheken

  • Das Buch verwendet C++20 und C++23
  • Es behandelt Entwurf und Nutzung eingebauter Typen und benutzerdefinierter Typen
    • Eingabe
    • Ausgabe
    • Berechnungen
    • einfache Grafik/GUI
  • Eine Einführung in Container und Algorithmen der C++-Standardbibliothek ist ebenfalls enthalten

Öffentlich verfügbare Beispielmaterialien

  • Preface: behandelt, was das Buch verspricht und was nicht
  • Table of Contents: PDF mit dem Inhaltsverzeichnis
  • Chapter 0: Notes to the Reader: Einführung in den Ansatz des Buches
  • Chapter 10: A Display Model: Beispielkapitel
    • Für komplette Anfänger ist es besser, dieses Kapitel noch nicht zu lesen
    • Es soll Lehrenden und erfahrenen Lesern zeigen, welches Niveau das Buch bei zwei Kapiteln pro Woche nach etwa fünf Wochen erreicht
    • Außerdem soll es einen Teil von modernem C++ demonstrieren

Unterstützende Materialien und Code

Im Web verbliebene PPP2-Kapitel

Stand der Übersetzungen

  • Eine Übersetzung von PPP3 gibt es noch nicht
  • Übersetzungen früherer Auflagen sind auf der book covers page zu finden

1 Kommentare

 
GN⁺ 2024-04-20
Hacker-News-Kommentare
  • Ich finde es ziemlich problematisch, dass das „klassische erste Programm“ dieses Buchs gleich in der ersten Zeile import std; verwendet. Soweit ich weiß, unterstützt das außer vielleicht MSVC kein Compiler im Auslieferungszustand richtig.
    Unter Debian funktioniert es auch mit g++ --std=c++23 -fmodules-ts nicht, und laut https://en.cppreference.com/w/cpp/23 ist der relevante Vorschlag P2465R3, wobei selbst clang++ 17 nur „teilweise Unterstützung“ bietet. Selbst nach der Installation von clang++17 erscheint module 'std' not found.
    Ich verstehe, dass import std; ein sehr neues Feature ist, aber dieses Buch richtet sich an C++-Einsteiger; ich frage mich, wie der durchschnittliche Anfänger darauf reagieren wird. Dasselbe Problem habe ich vor ein bis zwei Jahren auch beim Lesen von „Tour of C++“ gesehen.

    • Guter Punkt, und ich habe dasselbe erlebt. Mein g++ gibt exakt denselben Fehler samt Hinweis aus.
      Die hier diskutierte neueste Ausgabe von Stroustrup habe ich nicht gelesen, aber eine frühere Ausgabe habe ich gelesen, als ich täglich C++ verwendet habe. Auch 20 Jahre später bevorzuge ich immer noch Accelerated C++ von Koenig und Moo. Vielleicht sind seitdem bessere Bücher erschienen, aber ich habe sie nicht gelesen.
      Soweit ich mich erinnere, sah das Hello World in diesem Buch etwa so aus: #include, int main(), std::cout << "Hello, world!" << std::endl;; und auch heute unter Arch Linux funktioniert es unverändert, wenn man es mit g++ a.cpp baut und ./a.out ausführt.
      Das ganze Buch war hervorragend darin aufgebaut, mit modernem C++ einen einfachen, sauberen Stil nachzuahmen, der fast wie Pseudocode wirkte, ohne die Pointer-Arithmetik von C. Es hatte etwas von der aufgeräumten Anmutung des frühen Python; auf Python-Seite gab es solche Elemente damals nicht, bis pandas später Wrapper-Bibliotheken um C++ wie numpy und scipy mitbrachte.
      In der Praxis habe ich kaum sauberen C++-Code gesehen. Ich habe nicht bei FAANG gearbeitet, und bei schnellen Prototypen gab es selten Code-Reviews, daher weiß ich nicht, wie weit sich die Art der Anleitung von Koenig und Moo außerhalb der Greenfield-Welt, die ich erlebt habe, verbreitet hat. Bereiche wie Strahlentherapie, in denen man nicht zum nächsten Therac-25 werden will, könnten Ausnahmen sein.
    • Die aktuelle Dokumentation zu GCC 13.2.1 sagt, dass die Standardbibliothek nicht als importierbare Header-Units bereitgestellt wird. Um solche Units zu importieren, muss man sie zuerst explizit bauen; und wenn man nicht aufpasst, können doppelte Deklarationen entstehen, die der Modul-Mechanismus zusammenführen muss, sodass der Ressourcenverbrauch des Compilers davon beeinflusst werden kann, wie Header-Dateien aufgeteilt sind.
      Deshalb muss man derzeit zuerst eine passende Moduldatei schreiben, damit import funktioniert. Allerdings dürfte die Aktualisierung der Standard-C++-Bibliothek in GCC nicht ewig dauern, sodass man dieses neue Buch später wohl direkt unverändert verwenden kann.
      Für jemanden, der altes C++ bereits kennt und nur sein Wissen auffrischen will, kann es sogar eine gute Lernerfahrung sein, diese Moduldatei selbst zu schreiben.
    • Inzwischen ist es unrealistisch, interessante C++-Programme ohne Build-System zu pflegen. Trotzdem ist es gut möglich, dass der gezeigte g++-Aufruf irgendwann durch eine Sonderbehandlung im Compiler funktioniert, sobald jemand einen Patch in GCC einbringt.
      Abgesehen von Forschungsbeispielen ist es im Großen und Ganzen nicht mehr realistisch, g++-Aufrufe direkt zusammenzustecken. Auch bei anderen kompilierten Sprachen hantiert man eher mit Systemen wie gobuild, cargo oder Maven statt direkt mit gccgo, rustc oder javac.
      https://www.kitware.com/import-std-in-cmake-3-30/
    • Dieses Dokument, auf das die Buchseite verweist, könnte beim Modulproblem helfen: https://www.stroustrup.com/module_use.html
  • Im GUI-Kapitel wurde FLTK durch Qt ersetzt. Da Qt in der Industrie breit eingesetzt wird, ist das eine ziemlich große Änderung und dürfte gut ankommen; wie sich die Lernkurve dadurch verändert, weiß ich allerdings nicht.

    • Ich frage mich, was Stroustrup vom Meta Object Compiler hält. In gewisser Weise fühlt sich Qt wie ein eigener C++-Dialekt an.
    • Da es Qt Creator gibt, sehe ich das eher als Verbesserung.
    • Da eine benutzerdefinierte Wrapper-Bibliothek verwendet wird, weiß ich nicht genau, wie viel vom eigentlichen Qt sichtbar wird.
    • Ich habe vier KI-Coding-Assistenten, die ich ausprobiert habe (claude3, gemini, gpt4, deepseek), gebeten, Boids und Game of Life in C++ zu schreiben, und alle haben für die Grafik SFML verwendet.
      Ich frage mich, ob das daran liegt, dass es plattformübergreifend ist, oder ob es in dem Code, mit dem diese Modelle trainiert wurden, mehr SFML-Beispiele gibt. SFML scheint mir vergleichsweise neuer zu sein als Qt oder FLTK, daher wäre es seltsam, wenn es mehr Trainingsdaten dazu gäbe; und merkwürdig ist auch, dass alle vier übereinstimmend SFML für C++-Grafik vorgeschlagen haben.
  • Was mir an Stroustrups Code gefällt, ist using namespace std;. Die Konvention, vor alles std:: zu setzen, wie in std::every std::last std::bloody std::thing, macht einen wahnsinnig.

    • Es kommt darauf an. In Header-Dateien sollte man using namespace für keinen Namespace jemals einsetzen. Damit erzeugt man genau die Namenskollisionen, die Namespaces eigentlich verhindern sollen.
      Auch in Implementierungsdateien mag ich persönlich using namespace std; nicht. Ich finde, es verschlechtert die Lesbarkeit des Codes, und da der Inhalt von std:: sehr groß ist und immer weiter wächst, möchte ich schon die Möglichkeit von Namenskollisionen vermeiden.
      Code wird einmal geschrieben, aber viele Male gelesen; deshalb wirkt es aus Effizienzsicht wie eine schlechte Wahl, kurze Namen inklusive Namespace zu bevorzugen.
    • Es ist gut, keine Namenskollisionen zu haben. Aber irgendwie haben andere Sprachen dieses Problem gelöst.
    • Ich vermute, sobald sich C++-Module richtig etabliert haben, wird das nicht mehr Gegenstand von Debatten sein.
    • Hässlich ist weniger std selbst als der doppelte Doppelpunkt ::. Ich habe nie verstanden, warum man nicht einfach wie in anderen Sprachen einen Punkt verwenden konnte.
    • Klingt, als hättest du Programmieren unter Windows gelernt.
  • Ich habe C++ seit über zehn Jahren nicht mehr benutzt, erinnere mich aber daran, dass ich die frühere Ausgabe dieses Buchs wirklich intensiv studiert habe. Und das, obwohl ich danach im Studium vier Jahre lang fast zu 99 % C++ verwendet hatte.
    Es ist ein wirklich gutes Buch. Wenn man sich die Zeit nimmt, das C++ im Buch richtig zu verstehen, wird einem fast ein wenig traurig bewusst, warum die Welt so große Angst vor C++ hatte.
    Natürlich bin ich danach haufenweise Leuten begegnet, die solche Bücher überhaupt nicht lesen und schrecklichen C++-Code schreiben.

  • Ich vermisse die Zeit, in der ich mit C++ gearbeitet habe. Es fühlt sich an, als wäre man damit weiter unten im Entwicklungs-Stack gewesen als heute. Früher haben wir UI, API-Parsing, fast alles in C++ gemacht.

    • Eine Weile habe ich Fortran vermisst, aber nach etwa 30 Minuten Programmieren war ich sofort geheilt. Man muss nur einmal JSON-Parsing in C++ ausprobieren und sehen, ob die Nostalgie diesen Prozess übersteht.
    • Ich vermisse es auch wirklich. Es ist noch gar nicht so lange her, da gab es eine App, bei der sowohl Client als auch Server in C++ geschrieben waren; UI, API, alles war C++. Es fühlte sich wirklich so an, als wäre eine Universalsprache angekommen.
      Ich würde nicht sagen, dass es perfekt war, aber die Arbeit machte Spaß, und es war schön, mit sehr fähigen Leuten zusammenzuarbeiten, die in diesem Stack arbeiten konnten. Keine Mittagspause war so aufregend wie die, in der wir distcc auf Blade-Servern zum Laufen brachten und die Builds dadurch viel schneller wurden. Schön war auch, dass ich nicht der einzige Linux-Enthusiast war.
    • In unserem Unternehmen ist fast alles außer der UI C++. Der einzige Grund, warum die UI nicht in C++ ist, dürfte sein, dass man einen Teil der Codebase behalten wollte, an dem frisch eingestellte Absolventen sofort arbeiten können, noch bevor sie in C++ geschult wurden.
    • Um meinen C++-Durst zu stillen, bastle ich privat immer noch ein wenig an einer Game Engine. Trotz aller Kritik schreibe ich wirklich gern C++.
    • Ich hoffe einfach, nicht mit Python arbeiten zu müssen.
  • Im vergangenen Jahr habe ich den Großteil der 2. Ausgabe durchgearbeitet. Es ist ein wirklich hervorragendes Buch und hat mir geholfen, mehrere mentale Hürden zu überwinden, auf die ich über Jahre beim Programmieren gestoßen war.
    Der Hauptgrund, warum diese Ausgabe kürzer geworden ist, ist der Wegfall von Part IV: Broadening the View. Dieser Teil behandelte zusätzliche Themen wie Textverarbeitung, numerische Berechnungen und Embedded Systems und ist nun online verfügbar. Die entsprechenden Kapitel sind weiterhin relevant und verwenden C++11/14, daher wurden sie gegenüber der 2. Ausgabe nicht aktualisiert.

  • Ich teile auch C++ Annotations, ein Buch, das laufend für modernes C++ aktualisiert wird: http://www.icce.rug.nl/documents/cplusplus/

    • Ich frage mich, ob es für ein Emulator-Projekt ein ziemlich vernünftiger Ansatz wäre, im Grunde C mit Klassen zu verwenden und nur Smart Pointer sowie auto hinzuzunehmen.
      Früher habe ich einmal gehört, C++ bestehe aus vier Bestandteilen: erstens „C“, zweitens Objektorientierung, drittens Produktivität und Flexibilität durch STL und Templates, und schließlich Dinge für Spezialfälle wie volatile und asm. Er empfahl, Nummer 1 vorsichtig zu verwenden und Situationen zu vermeiden, in denen man Nummer 4 braucht. Ich frage mich, ob das sinnvoll ist.
    • Gibt 404 zurück.
  • Ich hatte erwartet, dass es ein dickerer Wälzer wird, aber überraschenderweise ist es auf die Hälfte geschrumpft.
    Die 2. Ausgabe hatte als Paperback 1312 Seiten und wog 4,81 Pfund, die 3. Ausgabe hat als Paperback 656 Seiten und wiegt 2,71 Pfund.

    • Dem Vorwort nach scheint ein erheblicher Teil des Referenzmaterials aus dem Buch herausgenommen und in die C++-Dokumentation im Internet verlagert worden zu sein.
      Dort heißt es, die 3. Ausgabe von „Programming: Principles and Practice Using C++“ sei ungefähr halb so groß wie die 2. Ausgabe, und Studierende, die das Buch mit sich herumtragen müssen, würden das geringere Gewicht begrüßen. Als Grund für die Kürzung wird genannt, dass es im Web mehr Informationen zu C++ und der Standardbibliothek gibt.
    • Schön, C++-Wissen in Pfund zu messen.
    • Es ist buchstäblich exakt die Hälfte. Ich frage mich, ob sie eine kleinere Schrift gewählt haben.
  • Ich frage mich, warum Bjarne manchmal nach #include ein Leerzeichen setzt und manchmal nicht.
    https://www.stroustrup.com/PPPheaders.h

    • Wenn sich manuell eingegebene Header mit automatisch von der IDE eingefügten Headern mischen, dazu noch eine Einstellung vorhanden war, die Imports standardmäßig einklappt, oder beim Speichern clang-format nicht ausgeführt wurde, kann so etwas leicht durchrutschen.
  • Ich freue mich wirklich, dass eine neue Version erschienen ist. Selbst wenn man kein Interesse an C++ hat oder bereits ein erfahrener Programmierer ist, lohnt es sich, dieses Buch zu lesen.
    Soweit ich es beurteilen kann, ist es eines der besten Beispiele für technisches Schreiben und Informatik- bzw. Programmierdidaktik.