3e édition révisée de « Programming: Principles and Practice Using C++ » de Stroustrup
(stroustrup.com)- La 3e édition de « Programming: Principles and Practice Using C++ » s’adresse avant tout aux lecteurs qui apprennent la programmation pour la première fois, mais elle peut aussi servir d’introduction au C++ moderne et à de meilleurs styles et techniques pour ceux qui ont déjà un peu d’expérience
- Le cœur du livre n’est pas la mémorisation des détails de syntaxe du C++, mais les principes fondamentaux de la programmation et les techniques pratiques, en couvrant à la fois la programmation procédurale, orientée objet et générique
- PPP3 a été ramené à environ la moitié de la taille de PPP2, tout en renforçant les chapitres de base traités dans un cursus semestriel et en intégrant du code Graphics/GUI basé sur Qt ainsi que C++20 et C++23
- Les chapitres plus spécialisés et les simples documents de référence ont été déplacés sur le web pour une consultation à la demande, les informations de référence les plus récentes étant désormais complétées par des ressources web comme cppreference.com
- Un PDF d’exemple, les modules et en-têtes PPP, du code GUI Qt, des slides de cours et un guide de style de code sont fournis, utilisables aussi bien en cours qu’en autoformation
Objectif du livre et lectorat
- « Programming: Principles and Practice Using C++ (3rd Edition) », abrégé en PPP3, est un livre d’introduction destiné aux personnes sans expérience en programmation
- Les lecteurs ayant déjà un peu programmé peuvent aussi l’utiliser pour améliorer leur style et leurs techniques, ou comme ressource pour apprendre le C++ moderne
- Il a été conçu pour l’enseignement, mais aussi rédigé en pensant à l’autoformation
- Les éditions précédentes ont été utilisées dans le premier cours de programmation destiné aux étudiants en génie électrique, génie informatique et informatique de la Texas A&M University, ainsi qu’ailleurs
La manière d’enseigner la programmation
- Le livre vise à amener le lecteur à écrire, au final, des programmes de qualité suffisante pour être utilisés et maintenus par d’autres
- L’accent est mis sur les concepts et techniques fondamentaux plutôt que sur des détails secondaires du langage
- Ce n’est pas simplement une introduction au langage C++, mais une introduction à la programmation en général
- programmation procédurale
- programmation orientée objet
- programmation générique
- Il couvre des techniques modernes de haut niveau, ainsi que les techniques de bas niveau nécessaires pour utiliser efficacement le matériel
- Il fournit les bases pour écrire du code utile, correct, sûr du point de vue des types, maintenable et efficace
- Il traite largement des concepts essentiels, des techniques de conception et de programmation, des fonctionnalités du langage et des bibliothèques
Ce qui change dans la 3e édition
- PPP3 représente environ la moitié de la taille de PPP2
- Le volume a été réduit en renforçant les chapitres de base généralement couverts dans un cursus semestriel
- utilisation des parties essentielles de C++20 et C++23
- réécriture du code des chapitres Graphics/GUI sur une base Qt, en tenant compte de la portabilité vers des environnements comme les navigateurs et les téléphones
- Les chapitres plus spécialisés, appelés « broadening the view » dans PPP2, ont été placés sur le web pour être utilisés selon les besoins
- Les documents de pure référence ont été supprimés
- on trouve sur le web des ressources plus nombreuses et plus à jour, avec par exemple cppreference.com
Standards C++ et périmètre des bibliothèques
- Le livre utilise C++20 et C++23
- Il couvre la conception et l’utilisation des types intégrés et des types définis par l’utilisateur
- entrée
- sortie
- calcul
- graphiques/GUI simples
- Il comprend aussi une introduction aux conteneurs et algorithmes de la bibliothèque standard C++
Exemples de documents publiés
- Preface : ce que le livre promet et ce qu’il ne promet pas
- Table of Contents : PDF de la table des matières
- Chapter 0: Notes to the Reader : présentation de l’approche du livre
- Chapter 10: A Display Model : chapitre d’exemple
- les vrais débutants ont intérêt à ne pas encore le lire
- il sert à montrer aux enseignants et aux lecteurs expérimentés le niveau atteint dans le livre vers la 5e semaine, à raison d’environ 2 chapitres par semaine
- il vise aussi à montrer certains aspects du C++ moderne
Ressources de support et code
- Links : liens vers des implémentations C++ et des environnements de développement, avec quelques conseils simples pour démarrer
- How to use modules? : inclut la manière de construire module PPP avec
PPP_support.h - module PPP : module PPP à utiliser quand les modules sont disponibles
- header "PPP.h" : en-tête pour utiliser le plus simplement possible les modules
stdetPPP - header "PPPheaders.h" : en-tête à utiliser lorsqu’il faut revenir à l’usage de fichiers d’en-tête
- GUI support : inclut la bibliothèque d’interface utilisateur Graphics/GUI des chapitres 10 à 14 de PPP3
- l’installation de Qt est nécessaire pour l’exécuter
- The User Manual est également fourni
- Sample code from the various chapters : code d’exemple de plusieurs chapitres, indiqué comme TBD
- Errata : errata
- Lectures based on PPP : slides de cours mises à jour pour PPP3
- PPP Coding Style Guide
- Exercise Material : indiqué comme TBD
Chapitres de PPP2 encore disponibles sur le web
- Certains chapitres de PPP2 ont été écrits en C++14, mais restent corrects et présentent raisonnablement bien les sujets concernés
- Ressources PPP2 disponibles :
État des traductions
- Il n’existe pas encore de traduction de PPP3
- Les traductions de l’édition précédente peuvent être consultées sur la page des couvertures de livres
1 commentaires
Commentaires sur Hacker News
Je trouve assez problématique que le « programme classique de départ » de ce livre utilise
import std;dès la première ligne. À ma connaissance, à part peut-être MSVC, aucun compilateur ne le prend correctement en charge dans sa configuration par défautMême sur Debian,
g++ --std=c++23 -fmodules-tsne fonctionne pas, et si l’on regarde https://en.cppreference.com/w/cpp/23, la proposition correspondante est P2465R3, tandis que clang++ 17 n’offre qu’une « prise en charge partielle ». Même après avoir installéclang++17, on obtientmodule 'std' not foundJe comprends que
import std;soit une fonctionnalité toute récente, mais ce livre s’adresse aux débutants en C++, donc je me demande comment un débutant moyen va réagir. J’avais déjà vu le même problème en lisant « Tour of C++ » il y a un ou deux ansg++affiche la même erreur et les mêmes indicationsJe n’ai pas lu cette dernière édition de Stroustrup dont on parle ici, mais j’avais lu les anciennes éditions à l’époque où j’utilisais le C++ au quotidien. Vingt ans plus tard, je préfère toujours Accelerated C++ de Koenig et Moo. De meilleurs livres sont peut-être sortis depuis, mais je n’ai pas eu l’occasion de les lire
Si je me souviens bien, le Hello World de ce livre ressemblait à
#include,int main(),std::cout << "Hello, world!" << std::endl;, et aujourd’hui encore sur Arch Linux, si on compile avecg++ a.cpppuis qu’on lance./a.out, ça fonctionne tel quelDans l’ensemble, le livre était remarquablement construit, avec un style moderne du C++ qui restait simple et propre, presque comme du pseudo-code, sans l’arithmétique des pointeurs du C. Cela me rappelait aussi la sobriété du Python des débuts, sauf que du côté de Python ce genre d’éléments n’est arrivé que plus tard, avant que pandas n’embarque des bibliothèques d’encapsulation C++ comme numpy ou scipy
En pratique, j’ai rarement vu du C++ propre. Je n’ai pas travaillé dans une FAANG, et dans les prototypes rapides il y avait rarement des revues de code, donc je ne sais pas à quel point cette approche à la Koenig et Moo est répandue en dehors du monde greenfield que j’ai connu. Des domaines comme la radiothérapie, où l’on veut éviter le prochain Therac-25, sont peut-être une exception
Donc pour le moment, il faut d’abord écrire le fichier de module approprié pour que
importfonctionne. Cela dit, je ne pense pas que la mise à jour de la bibliothèque standard C++ de GCC prendra très longtemps, donc plus tard on pourra sans doute utiliser ce nouveau livre tel quel, directementPour quelqu’un qui connaît déjà le vieux C++ et veut simplement remettre ses connaissances à jour, écrire soi-même ce fichier de module peut d’ailleurs être une bonne expérience d’apprentissage
g++donné en exemple finira probablement un jour par fonctionner grâce à un traitement spécial du compilateur si quelqu’un soumet un patch à GCCEn général, en dehors des exemples de recherche, assembler directement des appels
g++n’est plus vraiment réaliste. Même dans d’autres langages compilés, on manipule moinsgccgo,rustcoujavacdirectement qu’on n’utilise des systèmes comme gobuild, cargo ou Mavenhttps://www.kitware.com/import-std-in-cmake-3-30/
Dans le chapitre GUI, ils ont remplacé FLTK par Qt. C’est un changement assez important et qui sera probablement bien accueilli, puisque Qt est largement utilisé dans l’industrie, mais je ne sais pas comment cela change la courbe d’apprentissage
Je me demande si c’est parce que c’est multiplateforme, ou parce qu’il y a davantage d’exemples d’usage de SFML dans le code sur lequel ces modèles ont été entraînés. SFML me semble relativement plus récent que Qt ou FLTK, donc l’idée qu’il y ait plus de données d’entraînement est étrange, et le fait que les 4 aient tous convergé vers SFML pour les graphismes en C++ est curieux
Ce que j’aime dans le code de Stroustrup, c’est
using namespace std;. Cette convention qui consiste à préfixer chaquestd::every std::last std::bloody std::thingavecstd::rend fouusing namespacedans un fichier d’en-tête, quel que soit l’espace de noms. Sinon on recrée immédiatement les collisions de noms que les espaces de noms sont justement censés éviterMême dans les fichiers d’implémentation, personnellement je n’aime pas
using namespace std;. Je trouve que cela nuit à la lisibilité du code, et comme le contenu destd::est immense et continue de grossir, je préfère éviter toute possibilité de collision de nomsOn écrit le code une fois mais on le lit plusieurs fois, donc choisir des noms courts en omettant même l’espace de noms me semble être un mauvais compromis en termes d’efficacité
stdlui-même, c’est le double deux-points::qui est monstrueux. Je n’ai jamais compris pourquoi on ne pouvait pas simplement utiliser un point, comme dans les autres langagesCela fait plus de 10 ans que je n’ai pas utilisé C++, mais je me souviens avoir étudié très en profondeur une précédente édition de ce livre. Et pourtant, j’avais déjà passé 4 ans à utiliser presque exclusivement C++ à l’université.
C’est vraiment un excellent livre. Si on prend le temps de bien comprendre le C++ présenté dedans, on en vient presque à trouver triste que le monde ait eu si peur de C++
Bien sûr, après ça, j’ai croisé des tas de gens qui n’avaient jamais lu ce genre de livre et écrivaient un code C++ épouvantable
L’époque où je travaillais en C++ me manque. J’ai l’impression qu’on est descendu plus bas dans la pile de développement qu’avant. À l’époque, on faisait l’UI, le parsing d’API, presque tout en C++
Je ne dirais pas que c’était parfait, mais le travail était intéressant, et j’aimais travailler avec des gens très compétents capables d’évoluer sur cette stack. Je n’ai jamais eu de pause déjeuner plus excitante que lorsqu’on faisait tourner
distccsur des blade servers pour accélérer énormément les builds. C’était aussi agréable de ne pas être le seul passionné de LinuxJ’ai terminé la majeure partie de la 2e édition au cours de l’année écoulée. C’est vraiment un excellent livre, et il m’a aidé à dépasser plusieurs blocages mentaux auxquels je me heurtais en programmation depuis des années
La principale raison pour laquelle cette édition a rétréci, c’est la suppression de Part IV: Broadening the View. Cette section, qui couvrait des sujets supplémentaires comme le traitement de texte, le calcul numérique et les systèmes embarqués, est désormais disponible en ligne. Ces chapitres restent pertinents et utilisent toujours C++11/14, donc ils n’ont pas été mis à jour depuis la 2e édition
Je partage aussi C++ Annotations, un livre continuellement mis à jour sur le C++ moderne : http://www.icce.rug.nl/documents/cplusplus/
auto, est une approche plutôt correcteJ’avais entendu autrefois que C++ se composait de quatre éléments. Le premier, c’était « C », le deuxième l’orienté objet, le troisième la productivité et la flexibilité avec des choses comme la STL et les templates, et le dernier les cas spéciaux comme
volatileetasm. On m’avait recommandé d’utiliser le point 1 avec prudence et d’éviter les situations où il faut recourir au point 4. Je me demande si ça tient la routeJe pensais que ce serait un pavé encore plus épais, mais à ma surprise il a été réduit de moitié
La 2e édition faisait 1312 pages en broché et pesait 4,81 livres, tandis que la 3e fait 656 pages en broché et pèse 2,71 livres
Il est indiqué que la 3e édition de “Programming: Principles and Practice Using C++” fait environ la moitié de la taille de la 2e, et que les étudiants qui doivent transporter le livre apprécieront son poids réduit. La raison invoquée est qu’il existe désormais davantage d’informations sur C++ et la bibliothèque standard sur le Web
Je me demande pourquoi Bjarne met parfois un espace après
#includeet parfois nonhttps://www.stroustrup.com/PPPheaders.h
Je suis vraiment enthousiaste de voir arriver cette nouvelle version. Même si on ne s’intéresse pas à C++ ou qu’on est déjà un programmeur expérimenté, ce livre mérite d’être lu
À ma connaissance, c’est l’un des meilleurs exemples d’écriture technique et d’enseignement de la programmation informatique