- 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
- Links: Links zu C++-Implementierungen und Entwicklungsumgebungen sowie kurze Ratschläge für den Einstieg
- How to use modules?: enthält eine Anleitung, wie man mit
PPP_support.hdas module PPP baut - module PPP: PPP-Modul, das verwendet wird, wenn Module verfügbar sind
- header "PPP.h": Header für die einfachste Nutzung von
stdund demPPP-Modul - header "PPPheaders.h": Header für den Fall, dass man wieder auf Header-Dateien zurückgreifen muss
- GUI support: enthält die Graphics/GUI-User-Interface-Bibliothek für die Kapitel 10 bis 14 von PPP3
- Für die Ausführung ist eine Installation von Qt erforderlich
- Auch The User Manual wird bereitgestellt
- Sample code from the various chapters: Beispielcode aus verschiedenen Kapiteln, als TBD markiert
- Errata: Errata
- Lectures based on PPP: für PPP3 aktualisierte Vorlesungsfolien
- PPP Coding Style Guide
- Exercise Material: als TBD markiert
Im Web verbliebene PPP2-Kapitel
- Einige Kapitel aus PPP2 wurden mit C++14 geschrieben, sind aber weiterhin korrekt und führen sinnvoll in die jeweiligen Themen ein
- Bereitgestellte PPP2-Materialien:
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
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-tsnicht, 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 vonclang++17erscheintmodule '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.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 mitg++ a.cppbaut und./a.outausfü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.
Deshalb muss man derzeit zuerst eine passende Moduldatei schreiben, damit
importfunktioniert. 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.
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 mitgccgo,rustcoderjavac.https://www.kitware.com/import-std-in-cmake-3-30/
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, 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 allesstd::zu setzen, wie instd::every std::last std::bloody std::thing, macht einen wahnsinnig.using namespacefü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 vonstd::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.
stdselbst als der doppelte Doppelpunkt::. Ich habe nie verstanden, warum man nicht einfach wie in anderen Sprachen einen Punkt verwenden konnte.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.
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
distccauf Blade-Servern zum Laufen brachten und die Builds dadurch viel schneller wurden. Schön war auch, dass ich nicht der einzige Linux-Enthusiast war.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/
autohinzuzunehmen.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
volatileundasm. Er empfahl, Nummer 1 vorsichtig zu verwenden und Situationen zu vermeiden, in denen man Nummer 4 braucht. Ich frage mich, ob das sinnvoll ist.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.
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.
Ich frage mich, warum Bjarne manchmal nach
#includeein Leerzeichen setzt und manchmal nicht.https://www.stroustrup.com/PPPheaders.h
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.