1 points par GN⁺ 2024-04-20 | 1 commentaires | Partager sur WhatsApp
  • 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

Chapitres de PPP2 encore disponibles sur le web

É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

 
GN⁺ 2024-04-20
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éfaut
    Même sur Debian, g++ --std=c++23 -fmodules-ts ne 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 obtient module 'std' not found
    Je 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 ans

    • Bonne remarque, et j’ai vécu exactement la même chose. Mon g++ affiche la même erreur et les mêmes indications
      Je 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 avec g++ a.cpp puis qu’on lance ./a.out, ça fonctionne tel quel
      Dans 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
    • La documentation actuelle de GCC 13.2.1 indique que la bibliothèque standard n’est pas fournie sous forme d’unités d’en-tête importables. Pour importer de telles unités, il faut d’abord les construire explicitement, et si l’on n’y prend pas garde, le mécanisme des modules peut se retrouver avec des déclarations dupliquées à fusionner, ce qui fait que l’utilisation des ressources du compilateur dépend de la manière dont les fichiers d’en-tête sont découpés
      Donc pour le moment, il faut d’abord écrire le fichier de module approprié pour que import fonctionne. 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, directement
      Pour 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
    • Aujourd’hui, il n’est plus réaliste de maintenir un programme C++ intéressant sans système de build. Cela dit, l’appel g++ donné en exemple finira probablement un jour par fonctionner grâce à un traitement spécial du compilateur si quelqu’un soumet un patch à GCC
      En 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 moins gccgo, rustc ou javac directement qu’on n’utilise des systèmes comme gobuild, cargo ou Maven
      https://www.kitware.com/import-std-in-cmake-3-30/
    • Ce document référencé sur la page du livre pourrait aider sur la question des modules : https://www.stroustrup.com/module_use.html
  • 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 ce que Stroustrup pense du Meta Object Compiler. D’une certaine manière, Qt donne l’impression d’être son propre dialecte du C++
    • Il y a Qt Creator avec Qt, donc je dirais que c’est plutôt une amélioration
    • Comme ils utilisent une bibliothèque d’encapsulation personnalisée, je ne sais pas très bien à quel point Qt réel est exposé
    • J’ai demandé aux 4 assistants de codage IA que j’ai essayés (claude3, gemini, gpt4, deepseek) d’écrire boids et le Game of Life en C++, et ils ont tous utilisé SFML pour les graphismes
      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 chaque std::every std::last std::bloody std::thing avec std:: rend fou

    • Ça dépend des cas. Il ne faut jamais mettre using namespace dans 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 éviter
      Mê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 de std:: est immense et continue de grossir, je préfère éviter toute possibilité de collision de noms
      On é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é
    • C’est bien de ne pas avoir de collisions de noms. Mais d’une manière ou d’une autre, les autres langages ont résolu ce problème
    • J’ai l’impression que si les modules C++ s’installent vraiment, ce ne sera plus un sujet de débat
    • Plus que std lui-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 langages
    • On dirait que quelqu’un a appris à programmer sous Windows
  • Cela 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++

    • Fortran m’a manqué pendant un temps, puis j’ai essayé d’en écrire pendant 30 minutes et ça m’a vite guéri. Il suffit d’essayer de parser du JSON en C++ pour voir si la nostalgie tient le coup
    • Ça me manque vraiment aussi. Ce n’est même pas si ancien, mais il y avait des applis où le client et le serveur étaient tous deux en C++, où l’UI, l’API, tout était en C++. On avait vraiment l’impression que le langage généraliste était enfin arrivé
      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 distcc sur des blade servers pour accélérer énormément les builds. C’était aussi agréable de ne pas être le seul passionné de Linux
    • Dans notre entreprise, presque tout est en C++ à part l’UI. Je pense que la seule raison pour laquelle l’UI n’est pas en C++, c’est pour laisser une partie de la base de code sur laquelle les jeunes diplômés peuvent travailler immédiatement, avant même leur formation en C++
    • Pour assouvir mon envie de C++, je continue encore à bricoler un moteur de jeu sur un projet perso. Malgré toutes les critiques, j’adore vraiment utiliser C++
    • Je veux juste ne pas travailler en Python
  • J’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/

    • Je me demande si, dans un projet d’émulateur, utiliser essentiellement du C avec des classes, en y ajoutant juste des smart pointers et auto, est une approche plutôt correcte
      J’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 volatile et asm. 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 route
    • J’obtiens une 404
  • Je 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

    • D’après la préface, il semble qu’une bonne partie des références ait été retirée du livre et déplacée vers la documentation C++ sur Internet
      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
    • J’aime bien l’idée de mesurer les connaissances en C++ au poids
    • C’est littéralement exactement la moitié. Je me demande s’ils ont choisi une police plus petite
  • Je me demande pourquoi Bjarne met parfois un espace après #include et parfois non
    https://www.stroustrup.com/PPPheaders.h

    • Si des headers saisis à la main se sont retrouvés mélangés à des headers insérés automatiquement par l’IDE, qu’en plus il y avait peut-être un réglage repliant les imports par défaut, ou que clang-format n’a pas été lancé à l’enregistrement, ça peut facilement passer inaperçu
  • 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