Bjarne Stroustrup n’a pas conçu C++ pour
remplacer le langage C par une théorie plus élégante. Il cherchait un
outil capable de décrire de grands systèmes sans perdre le contrôle des
performances, de la mémoire et du matériel.
Cette tension définit C++ depuis ses débuts : offrir des abstractions de
haut niveau tout en restant utilisable là où chaque ressource compte.
Elle explique à la fois sa longévité, sa puissance et sa réputation de
langage complexe.
Le problème des grands programmes efficaces
Bjarne Stroustrup naît en 1950 à Aarhus, au Danemark. Il étudie les
mathématiques et l’informatique à l’université d’Aarhus, puis prépare un
doctorat à Cambridge sur les systèmes distribués.
Pendant ce travail, il utilise Simula, langage pionnier des classes
et de la programmation orientée
objet. Les abstractions de
Simula l’aident à représenter les composants d’un système, mais les
outils disponibles ne fournissent pas les performances attendues. Pour
une expérience suivante, il se tourne vers BCPL, plus proche de la
machine, mais constate que la perte d’abstraction rend le programme
difficile à organiser.
Cette expérience lui donne une direction : combiner les mécanismes de
structuration de Simula avec le modèle de compilation et l’efficacité de
C.
De « C with Classes » à C++
Stroustrup rejoint les Bell Labs en 1979. Il y commence C with
Classes, une extension de C dotée de classes, de constructeurs, de
destructeurs, de contrôle d’accès et de vérification renforcée des
types. Les premières versions sont transformées en C par un
préprocesseur nommé Cfront, puis compilées avec les outils existants.
Le choix d’étendre C est pragmatique. Les Bell Labs disposent déjà de
systèmes, de bibliothèques et de programmeurs formés à ce langage. La
compatibilité facilite l’expérimentation et l’adoption. Elle transmet
aussi à C++ plusieurs traits difficiles à simplifier par la suite :
syntaxe dense, conversions implicites et gestion directe de la mémoire.
En 1983, le langage prend le nom C++, référence à l’opérateur
d’incrément de C. Les fonctions virtuelles permettent le polymorphisme
dynamique, tandis que la surcharge d’opérateurs aide les types définis
par les utilisateurs à se comporter comme des types intégrés. La
première édition de The C++ Programming Language paraît en 1985.
L’abstraction sans coût imposé
L’idée centrale de Stroustrup n’est pas que tout programme doit être
orienté objet. C++ est progressivement devenu multiparadigme :
programmation procédurale, classes, programmation générique, fonctions
et calcul à la compilation peuvent coexister.
Son principe d’« abstraction sans surcoût » se comprend en deux règles.
Les fonctionnalités inutilisées ne doivent pas coûter de temps ou de
mémoire. Lorsqu’une abstraction est utilisée, son implantation doit
pouvoir rivaliser avec un code spécialisé écrit à la main. Ce n’est pas
une promesse automatique : une mauvaise conception peut rester lente. Le
langage cherche plutôt à donner aux bibliothèques les moyens de proposer
des abstractions efficaces.
Les templates illustrent ce projet. Ils permettent d’écrire un
algorithme pour une famille de types, le compilateur produisant les
versions nécessaires. La Standard Template Library, intégrée à la
bibliothèque standard, associe conteneurs, itérateurs et algorithmes
sans imposer une hiérarchie de classes commune.
C++ développe aussi un modèle déterministe des ressources. Un objet peut
acquérir une ressource dans son constructeur et la libérer dans son
destructeur. Cette technique, connue sous le nom de RAII, ne
concerne pas seulement la mémoire : fichiers, verrous et connexions
peuvent suivre la durée de vie d’un objet. Les pointeurs intelligents
modernes rendent ce modèle plus sûr sans supprimer la possibilité d’un
contrôle bas niveau.
De la bibliothèque à un langage multiparadigme
Un langage ne devient réellement utilisable à grande échelle que lorsque
ses abstractions peuvent être partagées sous forme de bibliothèques. Au
début de C++, les classes servent surtout à représenter des objets et à
protéger leur état. Les templates élargissent ensuite cette ambition :
ils permettent de décrire des familles d’algorithmes et de structures de
données sans fixer à l’avance le type manipulé.
Le travail d’Alexander Stepanov et de Meng Lee sur la Standard
Template Library joue ici un rôle décisif. La STL n’est pas conçue
comme une hiérarchie d’objets. Elle sépare les conteneurs, les
algorithmes et les itérateurs, qui servent d’interface entre eux. Un
même algorithme de tri peut ainsi fonctionner avec plusieurs
représentations de données, sans dépendre d’une classe de base commune.
Son intégration à la bibliothèque standard dans les années 1990 confirme
que C++ ne se réduit plus à « C avec des classes ». La programmation
générique devient l’un de ses axes majeurs. Plus tard, les concepts
cherchent à exprimer explicitement les exigences imposées aux paramètres
d’un template, afin de rendre les interfaces et les erreurs de
compilation plus compréhensibles.
Cette évolution illustre la manière de travailler de Stroustrup. Il ne
cherche pas à imposer un paradigme unique : il veut permettre à
l’utilisateur de choisir l’abstraction adaptée, puis au compilateur d’en
éliminer autant que possible le coût d’exécution.
Standardiser un langage vivant
À mesure que plusieurs compilateurs apparaissent, une définition commune
devient indispensable. Le premier standard ISO de C++ est publié en
1998. La normalisation transforme le langage en œuvre collective :
Stroustrup conserve une influence importante, mais les évolutions sont
discutées et votées par un comité international.
C++11 marque une modernisation majeure avec les déplacements d’objets,
les expressions lambda, les outils de concurrence et de nombreuses
améliorations de bibliothèque. Les éditions suivantes adoptent un rythme
régulier et ajoutent notamment concepts, modules, plages et coroutines.
Cette accumulation répond à des besoins réels, mais elle a un coût
pédagogique. Plusieurs styles historiques coexistent, et du code correct
selon une ancienne pratique peut ne plus représenter la manière la plus
sûre d’écrire du C++ moderne. La compatibilité protège des
investissements logiciels considérables ; elle limite en retour la
possibilité de repartir d’une page blanche.
Ce que C++ permet — et ce qu’il exige
C++ est employé lorsque les performances, la latence ou l’accès au
matériel comptent : moteurs de jeu, navigateurs, bases de données,
outils de création, systèmes embarqués et infrastructures financières.
Il permet de construire des abstractions riches sans interdire le
contrôle précis de la représentation des données.
Cette liberté transfère une responsabilité importante au programmeur.
Les accès mémoire invalides, comportements indéfinis et erreurs de durée
de vie restent possibles. Les recommandations modernes privilégient les
conteneurs, les objets possédant leurs ressources, les contrôles
statiques et les bibliothèques éprouvées plutôt qu’un recours
systématique aux pointeurs nus.
Comparer C++ à Java ou Python revient
donc moins à désigner un vainqueur qu’à comparer des contrats. Java
confie davantage de décisions à une machine virtuelle ; Python
privilégie une boucle de développement très directe ; C++ expose plus
largement les coûts et les choix de représentation.
Pourquoi Bjarne Stroustrup compte encore
Stroustrup a montré qu’une abstraction n’est pas nécessairement
l’ennemie de l’efficacité. Cette idée influence C++ mais aussi la
conception de langages plus récents, qui cherchent eux aussi à rendre
les garanties et les coûts visibles.
Son héritage comprend également une leçon moins confortable : un langage
adopté pendant des décennies devient une infrastructure sociale autant
que technique. Le faire évoluer exige de concilier innovation, sécurité,
outils, enseignement et milliards de lignes existantes.
Chronologie
- 1950 : naissance de Bjarne Stroustrup à Aarhus, au Danemark.
- 1975 : diplôme de l’université d’Aarhus.
- 1979 : doctorat à Cambridge et arrivée aux Bell Labs.
- 1979 : début du travail sur C with Classes.
- 1983 : adoption du nom C++.
- 1985 : première édition de The C++ Programming Language.
- 1989 : publication de C++ 2.0.
- 1990 : parution de The Annotated C++ Reference Manual.
- 1998 : premier standard international de C++.
- 2011 : publication de C++11, étape majeure du C++ moderne.
- 2014–2023 : nouveaux standards selon un rythme
approximativement triennal.
- Aujourd’hui : Stroustrup poursuit ses travaux sur la conception,
l’enseignement et la sûreté de C++.
Questions fréquentes
Bjarne Stroustrup a-t-il créé C++ seul ?
Il a lancé et dirigé sa conception initiale. Le langage est ensuite
devenu le produit de compilateurs, de bibliothèques, d’utilisateurs et
d’un comité ISO international.
Pourquoi C++ porte-t-il ce nom ?
En C, l’opérateur ++ incrémente une valeur. Le nom suggère donc un C «
augmenté », sans prétendre qu’il s’agit simplement d’une version
officielle suivante de C.
C++ est-il seulement un langage orienté objet ?
Non. Il prend en charge les styles procédural, orienté objet, générique
et fonctionnel. Stroustrup le décrit comme un langage multiparadigme.
C++ est-il compatible avec C ?
Une grande quantité de code C peut être adaptée ou compilée en C++, mais
les langages ne sont pas entièrement compatibles. Chacun possède ses
propres normes et certaines constructions valides dans l’un ne le sont
pas dans l’autre.
Pourquoi C++ reste-t-il difficile à apprendre ?
Il combine plusieurs paradigmes, conserve de nombreux choix historiques
et laisse au programmeur un contrôle étendu. L’apprentissage gagne à
commencer par les pratiques modernes plutôt que par la gestion manuelle
systématique de la mémoire.
Dans quels domaines C++ reste-t-il pertinent ?
Dans les logiciels où performance, latence, empreinte mémoire ou
intégration matérielle sont décisives : jeux, navigateurs, bases de
données, calcul scientifique, embarqué et infrastructures.