Blog 5 min de lecture

La route vers la cinquième génération du C++

Share this article
La route vers la cinquième génération du C++

Depuis sa création, le C++ n'a cessé d'évoluer et a franchi de nombreuses étapes majeures, du « C with Classes » à l'avènement des nouvelles normes. Quelle sera la prochaine étape de l'évolution du C++ ? Examinons d'abord comment le C++ a évolué au fil des ans :

Première génération du C++ : le C with Classes

Avant sa normalisation initiale en 1998, le C++ avait été développé par Bjarne Stroustrup aux Bell Labs depuis 1979, comme une extension du langage C, car il voulait un langage efficace et flexible offrant des performances comparables à celles du C.

En 1983, « C with Classes » fut rebaptisé « C++ », avec 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 sur le tas à typage sûr (new/delete) et une vérification des types améliorée.

Voici un extrait de code de la première génération :

WriteFraction(n) long n;
{
   unsigned short i, low, digit; unsigned long k;
   putchar(n < 0 ? '-' : ' '); n = abs(n);
   putchar((n>>fractionBits) + '0'); putchar('.');
   low = k = n << (longBits-fractionBits); /* align octal point at left */
   k >>= 4; /* shift to make room for a decimal digit */
   for (i=1; i<=8; ++i)
   {
      digit = (k *= 10L) >> (longBits-4);
      low = (low & 0xf) * 10;
      k += ((unsigned long) (low>>4)) - ((unsigned long) digit <<   (longBits-4));
      putchar(digit+'0');
   }
}

Voici un autre extrait de code issu de « Microsoft Word 1.1 », récemment publié par le Computer History Museum.

c1

Deuxième génération du C++ : la révolution de la POO

En 1989, C++ 2.0 est sorti, suivi en 1991 de la deuxième édition mise à jour de The C++ Programming Language. Les nouveautés de la version 2.0 comprenaient l'héritage multiple, les classes abstraites, les fonctions membres statiques, les fonctions membres const et les membres protégés. En 1990, The Annotated C++ Reference Manual fut publié, et cet ouvrage devint la base de la future norme. Dans les années 1990, la POO est devenue très populaire, et de nombreux développeurs ont adopté ce paradigme. Herb Sutter, dans son article, a décrit l'adoption de la POO comme une révolution :

Rappelons que les gens pratiquent la programmation orientée objet au moins depuis l'époque de Simula, à la fin des années 1960. Mais la POO n'est devenue une révolution, dominante dans le courant dominant, que dans les années 1990. Pourquoi alors ? La raison pour laquelle la révolution a eu lieu tient principalement au fait que notre industrie était poussée par le besoin d'écrire des systèmes toujours plus grands, résolvant des problèmes toujours plus vastes et exploitant des ressources de CPU et de stockage toujours plus importantes qui devenaient disponibles. Les atouts de la POO en matière d'abstraction et de gestion des dépendances en ont fait une nécessité pour réaliser un développement logiciel à grande échelle, économique, fiable et reproductible.

Troisième génération du C++ : la programmation générique et la métaprogrammation

Les templates ont été introduits en 1991, et à l'époque, seuls quelques experts C++ s'intéressaient au paradigme de la programmation générique, et peu de publications en parlaient.

Alexander Stepanov fut un expert C++ pionnier qui explora les possibilités de la programmation générique pour offrir une approche moderne du développement de projets C++.

Voici un document intéressant intitulé « Algorithm-Oriented Generic Libraries », publié en 1993 par Alexander A. Stepanov et David R. Summer.

Voici la motivation du document, telle qu'expliquée par les auteurs :

We outline an approach to construction of software libraries in which generic algorithms (algorithmic abstractions) play a more central role than in conventional software library technology or in the object-oriented programming paradigm. Our approach is to consider algorithms first, decide what types and access operations they need for efficient execution, and regard the types and operations as formal parameters that can be instantiated in many different ways, as long as the actual parameters satisfy the assumptions on which the correctness and efficiency of the algorithms are based. The means by which instantiation is carried out is language dependent; in the C + + examples in this paper, we instantiate generic algorithms by constructing classes that define the needed types and access operations. By use of such compile-time techniques and careful attention to algorithmic issues, it is possible to construct software components of broad utility with no sacrifice of efficiency.

Grâce aux efforts et au travail remarquable d'Alexander Stepanov, David Musser, Meng Lee et du comité de normalisation C++, la première version de la STL est sortie en 1994.

La STL fut une bouffée d'air frais pour les développeurs C++ ; elle fournissait de nombreuses fonctionnalités utiles pour moderniser le code C++, ce qui a rendu les implémentations d'algorithmes C++ nettement différentes de leurs homologues C.

En 1998, un proposition d’un site web de dépôt de bibliothèques C++ fut publié par Beman G. Dawes pour développer Boost.

Boost est un ensemble de bibliothèques pour le langage de programmation C++ qui prend en charge des tâches et des structures telles que l'algèbre linéaire, la génération de nombres pseudo-aléatoires, le multithreading, le traitement d'images, les expressions régulières et les tests unitaires. Il contient plus de quatre-vingts bibliothèques individuelles.

Quatrième génération du C++ : les nouvelles normes

De 1991 à 2011, le langage a évolué lentement, et cette évolution venait de bibliothèques comme la STL et Boost. À partir de 2011, de nombreuses fonctionnalités ont été ajoutées à la norme : C++11, C++14, C++17 et le futur C++20.

Voici un extrait de code de la bibliothèque Folly, qui utilise abondamment les fonctionnalités des normes récentes.

c0

Cinquième génération du C++ : la rupture avec l'héritage

Le C++ évolue actuellement très vite. De nombreuses nouvelles fonctionnalités intéressantes sont ajoutées, et d'autres sont dépréciées. Il est peut-être temps de retirer certaines fonctionnalités du langage, même si cela casse du code existant.

Jusqu'à présent, le comité de normalisation a choisi de ne pas apporter de modifications cassantes aux fonctionnalités C++ antérieures. Cependant, cette approche pourrait changer dans un avenir proche — en effet, cette proposition récemment mise à jour traite de la stabilité du langage et tente de répondre à ces questions :

  • Le C++ est-il un langage fait de nouvelles fonctionnalités excitantes ?
  • Le C++ est-il un langage réputé pour sa grande stabilité sur une longue période ?
  • Croyons-nous que passer à une nouvelle version du langage devrait être sans effort ?
  • Si oui, comment concilier ces mises à niveau sans effort avec le besoin pratique de faire évoluer le langage ?
  • Si au contraire nous privilégions la stabilité avant tout, sommes-nous condamnés à avancer lentement — en n'effectuant un changement que lorsque nous sommes certains qu'il est correct et n'aura jamais besoin de corrections futures ?

De cette proposition, nous tirons cette suggestion :

Le comité devrait accepter d'examiner la conception et la qualité des propositions même si elles peuvent entraîner un changement de comportement ou un échec de compilation pour le code existant.

Peut-être la cinquième génération sera-t-elle une rupture avec l'héritage du C++, en retirant certaines des fonctionnalités héritées du C.

Share this article