Avant sa normalisation initiale en 1998, le C++ était développé par Bjarne Stroustrup aux Bell Labs depuis 1979, comme une extension du langage C, car il voulait un langage efficace et flexible similaire au C.
En 1983, « C with Classes » a été renommé « C++ », en ajoutant de nouvelles fonctionnalités dont les fonctions virtuelles, la surcharge des noms de fonctions et des opérateurs, les références, les constantes, l'allocation mémoire typée sur le tas (new/delete) et une vérification des types améliorée.
Les années 1990 ont été l'âge d'or du C++ : il était très populaire, et de nombreux projets ont été développés avec, surtout après la révolution de la POO. Mais après 1998, le C++ a stagné pendant de nombreuses années. Et entre 2000 et 2010, aucune grande entreprise n'a soutenu l'évolution du langage. Microsoft s'est davantage concentré sur sa nouvelle technologie .NET.
Étonnamment, après 2010, on a commencé à parler d'une « Renaissance du C++ ». Il faut admettre que Microsoft a été un acteur majeur de ce mouvement ; je me souviens de cette vidéo où Craig Symonds et Mohsen Agsen en parlaient.
En 2011, Microsoft a annoncé le retour du C++ dans de nombreux articles, et des experts Microsoft C++ comme Herb Sutter ont donné de nombreuses conférences expliquant pourquoi le C++ est de retour, recommandant surtout l'utilisation du C++ moderne. Au même moment, la norme C++11 a été approuvée, et nous avons commencé à parler du C++ comme d'un nouveau langage.
Cependant, en 2011, le C++ avait déjà plus de 30 ans d'histoire. Et il n'est pas facile de convaincre les développeurs que le nouveau C++ a simplifié de nombreux aspects frustrants du langage et qu'il existe une nouvelle façon, moderne, d'améliorer le code C++.
Prenons la gestion de la mémoire comme exemple — peut-être le mécanisme le plus critiqué du C++. Pendant de nombreuses années, l'allocation d'objets se faisait avec le mot-clé new, et les développeurs devaient se souvenir d'invoquer delete quelque part dans le code. Le « C++ moderne » a résolu ce problème et encourage l'utilisation des pointeurs intelligents.
Mais malheureusement, tous les efforts de la communauté C++ active et des experts reconnus n'ont pas suffi. Morale de l'histoire : si vous donnez à quelqu'un la possibilité de faire quelque chose avec un langage ou un outil, ne soyez pas surpris qu'il le fasse.
C'est ce qui s'est passé avec le C++ : nous avons toujours la possibilité d'utiliser new et delete, et bien sûr nous ne pouvons pas supprimer cette possibilité pour de nombreuses raisons. Même si le C++ moderne encourage l'utilisation des pointeurs intelligents depuis de nombreuses années, l'allocation d'objets avec new continuera d'être utilisée pendant de nombreuses années.
Le passé du C++ influence fortement la façon dont il est utilisé, même pour les projets nouvellement créés, et de nombreux développeurs pensent encore que ce langage est très complexe.
Comment le passé du C++ affecte-t-il le langage ?
Pour le savoir, faisons un test : recherchez simplement sur le web « C++ object allocation » et regardez les résultats — presque tous les liens de la première page parlent de new/delete, voire de malloc.
Un autre test intéressant consiste à aller dans n'importe quelle bibliothèque universitaire, à demander un livre sur le C++ et à lire le chapitre sur l'allocation d'objets : il parle surtout du mot-clé new.
Pour résumer, si un nouveau développeur C++ veut apprendre le langage, il trouvera plus de ressources sur le « C with classes » que sur le C++ moderne.
Comment limiter l'impact du passé du C++ ?
Il n'y a pas de solution magique. On peut espérer que les compilateurs C++ nous aident en émettant des avertissements sur les pratiques obsolètes, comme les anciennes fonctions de manipulation de chaînes (strcpy, strcat,…). Mais cette solution à elle seule n'aura pas beaucoup d'impact. Le C++ moderne, c'est surtout de nouveaux idiomes à apprendre et à pratiquer.
Une autre solution serait de considérer que le C++ a changé de nom pour devenir «Modern C++». Même si cette solution est très simple, le résultat est très intéressant. Et pour en être convaincu, refaisons la même recherche web qu'avant, mais cette fois avec « Modern C++ object allocation » : le premier lien parle des pointeurs intelligents.
Un conseil aux nouveaux développeurs C++ : considérez que le C++ a changé de nom, et pour toutes vos recherches sur le web, utilisez toujours « Modern C++ » au lieu de C++ — les résultats seront très différents, car une recherche avec C++ seul renverra surtout des informations sur des pratiques anciennes.
