La saga du C++

Un langage de haut niveau

Les langages informatiques se divisent en deux catégories :

  • Les langages de bas niveau correspondent aux langages dont les instructions sont proches du langage du processeur. Le langage de bas niveau par excellence est l’assembleur car le code associé utilise le jeu d’instructions du processeur.

  • Les langages de haut niveau correspondent à des langages offrant une abstraction significative des détails du fonctionnement de l’ordinateur. Ils simplifient l’écriture d’un programme et rendent plus compréhensible le code source par rapport à un langage de bas niveau.

Lorsque le C et le C++ apparaissent successivement en 1972 et 1983, ils furent perçus comme des langages de haut niveau. Puis, plus tard émergèrent de nouveaux langages plus étoffés comme Python (1991), PHP (1994), Java (1995), JavaScript (1996) et dernièrement C# (2001) qui sont venus concurrencer le C++. Cependant, les langages C et C++ sont toujours restés très populaires dans beaucoup de domaines d’applications comme l’embarqué, le temps réel, l’écriture de drivers, les systèmes d’exploitation ou encore la programmation GPU car ils permettent une optimisation fine du code en utilisant des spécificités techniques du processeur ou du système sous-jacent. Ainsi, certaines personnes voient aujourd’hui le C et le C++ plutôt comme des langages de niveau intermédiaire.

Indiquez si les affirmations suivantes sont vraies ou fausses :

  1. Pour créer un programme pouvant fonctionner sur des processeurs différents, un langage de haut niveau est requis.

  2. L’utilisation d’un langage de bas niveau permet d’optimiser les performances.

  3. Un langage de bas niveau est indépendant du processeur de la machine.

Un typage statique

Lorsque vous examinez la fiche d’un langage sur Wikipédia, on vous indique en premier s’il s’agit d’un langage de bas niveau ou de haut niveau. Ensuite, on vous indique s’il dispose d’un typage statique ou dynamique. Voici à quoi correspond cette information :

  • Typage statique : dans cette configuration, le type de chaque variable est donnée avant l’exécution du programme. Aucune variable n’est autorisée à changer de type durant l’exécution du programme, d’où le terme de statique. Comme tous les types des variables sont connus avant l’exécution du programme, il est alors possible de vérifier si le code utilise des opérations conformes par rapport aux types choisis.

  • Typage dynamique : dans cette configuration, le type d’une variable est déterminé pendant l’exécution du programme. Indirectement, le typage dynamique sous-entend qu’une variable peut être associée à différents types au fil du temps. Ainsi, contrairement au typage statique, des erreurs dues à des types incompatibles peuvent se produire durant l’exécution du programme.

Vous pouvez bien sûr vous aider de Wikipédia.

Javascript

C++

Python

PHP

Java

# Programme Python
c = 3
print(type(c))  # ==>> <class 'int'>
c = 4.0
print(type(c))  # ==>> <class 'float'>
c = "TOTO"
print(type(c))  # ==>> <class 'str'>

Dans l’exemple en Python ci-dessus, nous constatons que le type de la variable c évolue en fonction des affectations successives.

Une tel comportement n’est pas envisageable en C++ :

#include <iostream>

int main()
{

        int x;
        x = 5;
        std::cout << typeid(x).name();          ==>> x: int

        x = 6.2;
        std::cout << typeid(x).name();          ==>> x: int  et conversion 6.2 => 6
}

Dans l’exemple en C++ ci-dessus, nous affectons la valeur 6.2 de type double à la variable x de type entier. Comme le type de la variable x est statique, le langage choisit alors de convertir cette valeur en valeur entière ce qui donne 6. Après cette affectation, la variable x vaut ainsi 6.

Le type statique permet, lors de la traduction du code source en programme, de connaître ou de déterminer le type de toutes les variables du programme. Cela a deux avantages :

  • Si les types des variables sont connus dès le départ, aucun temps n’est perdu à analyser les types durant l’exécution, d’où un gain de performance.

  • Cela permet de détecter toutes les opérations non autorisées entre types incompatibles avant la création du programme.

Indiquez si les affirmations suivantes sont vraies ou fausses :

  1. Si le langage utilise le typage statique, les variables ne peuvent pas changer de valeur.

  2. Le typage statique permet de détecter toutes les erreurs dans un programme.

  3. Le typage statique interdit à une variable d’avoir plusieurs types durant l’exécution.

  4. Le typage statique permet de détecter des erreurs entre types incompatibles après l’exécution du programme.

  5. Le typage statique permet une efficacité accrue des programmes.

L’apparition du langage C

Dans les années 70-80, parmi les langages les plus répandus, on trouvait :

  • Des langages assembleur, chaque langage assembleur permettant de programmer spécifiquement dans le langage d’un processeur. Le premier langage assembleur apparaît en 1950 et de multiples langages suivirent au rythme des sorties de nouveaux processeurs. La programmation assembleur a toujours été ardue car le code très long reste difficile à lire. Par exemple, l’opération a=b+c nécessite en assembleur une dizaine de lignes de code.

  • Le langage FORTRAN, acronyme de mathematical FORmula TRANslator, créé en 1957 spécialement pour effectuer du calcul scientifique et des simulations numériques. Ceci le rend difficilement exploitable pour d’autres applications.

  • Des langages BASIC, acronyme de Beginner’s All-purpose Symbolic Instruction Code, représentant une série de langages ayant pour objectif d’être facile à prendre en main. Le premier BASIC date de 1964 et dans les années 85, chaque machine sur le marché grand-public dispose de sa propre version du BASIC : GW-BASIC (PC-1983), Locomotive BASIC (Amstrad CPC-1984), BASIC 1 (MO5-TO7-1984), AmigaBASIC (Amiga-1985), GFA-BASIC(Atari-1986) ou encore le TI-BASIC (Calculatrice Texas Instrument). Les nombreuses fonctions graphiques et la syntaxe simplifiée rendent très attractifs les langages BASIC auprès des débutants mais ces langages restent relativement lents par rapport à leurs concurrents. A noter que les langages BASIC disparaissent progressivement dans les années 90.

Code assembleur

Code FORTRAN

Code BASIC

../_images/_codeASM.png ../_images/_codeFortran.png ../_images/_codeBASIC.png

Ainsi dans l’écosystème des langages informatiques des années 70, il n’existe pas de langage à la fois performant, de haut niveau et polyvalent. L’apparition du langage C va venir combler ce besoin.

La société AT&T, le plus grand fournisseur de services téléphoniques aux États-Unis, fonde en 1925 les Laboratoires Bell implantés dans le New Jersey (USA). Ce centre de recherche prit une importance majeure dans les domaines des télécoms et de l’informatique en développant plus de 29 000 brevets avec des technologies comme le transistor, le laser, les capteurs photo ou encore la communication par fibre optique.

Au sein des laboratoires Bell au cours de l’année 1972, furent inventés et développés en parallèle le langage C et le système Unix par Dennis Ritchie et Kenneth Thompson. Pour ces travaux, ils obtiendront le prix Turing (l’équivalent en informatique du prix Nobel) ainsi que la médaille nationale américaine des Technology and Innovation pour avoir permis d’énormes avancées en informatique et stimulé l’économie de ce secteur.

Par la suite en 1978, Brian Kernighan, professeur d’informatique à l’université de Princeton (New Jersey), publie avec l’aide de Dennis Ritchie le livre : The C Programming Language. Ce livre marque la communauté informatique car il décrit en une centaine de pages les bases du langage ainsi que l’intégralité de sa syntaxe et de sa grammaire. En conséquence, à partir de ce livre, tout ingénieur de l’époque avait toutes les informations nécessaires pour se lancer dans la création d’un compilateur C pour n’importe quelle machine. Ce livre, avec sa couverture très reconnaissable, fut surnommé le K&R et devint un incontournable des étagères (il n’y avait pas encore l’internet !).

Dans les années 80, le langage C devient le langage incontournable ceci pour plusieurs raisons :

  • Par rapport à l’assembleur, il représente un langage de haut niveau et le code C est bien plus lisible qu’un code assembleur.

  • Le langage est normalisé, le langage C donne l’espoir d’un langage portable entre différentes plateformes.

  • Il est très rapide, quasiment autant que l’assembleur.

  • Il dispose, en standard, de quelques librairies permettant de gérer les entrées/sorties clavier/disque, l’heure, les allocations mémoire, les chaînes de caractères et les fonctions mathématiques ; mais pas la souris, le son, le graphisme ou le joystick par exemple.

Fort de ce succès, le langage se répand et en 1989, l’Institut national américain de normalisation (ANSI) édite la norme dite ANSI C ou C89. L’ANSI C représente une évolution du C décrit dans le livre K&R mais elle reste très compatible. D’autres versions du langage C verront le jour, notamment avec la norme C99 en 1999 et la norme C11 en 2011 offrant à chaque fois un rafraîchissement du langage C qui reste cependant toujours un langage non orienté objet.

Pourquoi le langage C continue-t-il à coexister aujourd’hui à côté du langage C++ ? Plusieurs raisons à ceci :

  • Le langage C reste plus facile à apprendre que le langage C++.

  • Le langage C semble plus propice pour un développeur voulant maîtriser tous les aspects du langage.

  • L’étape de transformation d’un code source en programme exécutable est bien plus rapide en C qu’en C++ et lorsque le programme fait plusieurs millions de lignes, cela se ressent.

  • Tout système dispose d’un compilateur C mais pas forcément d’un compilateur C++.

  • Le langage C apparaît comme plus établi, plus standard, donc moins de risque de le voir prendre un virage à 90°.

Kenneth Thompson

Brian Kernighan

Dennis Ritchie

Le livre du langage C

../_images/_kenneth.jpg ../_images/_kernigham.jpg ../_images/_ritchie.png ../_images/_bookC.jpg

Indiquez si les affirmations suivantes sont vraies ou fausses :

  1. Le C est un langage permettant d’obtenir des programmes très rapides.

  2. Ritchie et Thompson sont à l’origine du système Windows.

  3. La librairie du C contient des fonctions mathématiques.

  4. La librairie du C permet de gérer les entrées/sorties clavier.

  5. La librairie du C permet de gérer la souris.

  6. Kernighan et Ritchie écrivirent le livre de référence sur le langage C.

  7. Le langage C a connu une seule version normalisée.

  8. Le C-89 est la dernière version normalisée en date du langage.

  9. Le langage C++ a remplacé le langage C définitivement.

  10. Le langage C a contribué à l’essor économique des secteurs de l’IT.

Note

Nous avons cité à plusieurs reprises des laboratoires Bell. Sachez qu’en 1988, Yann LeCun, ancien diplômé de l’ESIEE-Paris, rejoint les laboratoires Bell pour y développer ses premières méthodes de deep learning supervisé. Ses travaux lui vaudront en 2019 le prix Turing et l’accession au poste de directeur de la recherche en intelligence artificielle de Facebook.

Pour la petite histoire, en 1991, Linus Torvalds (finlandais de naissance) alors étudiant en master informatique, se lance dans la création du noyau Linux en utilisant le langage C et ce projet atteindra le succès que vous lui connaissez aujourd’hui. En effet, bien que les ordinateurs personnels utilisent principalement le système Windows, 97% des 500 plus grands supercalculateurs utilisent Linux ainsi que la quasi-totalité des serveurs internet.

L’avènement du C++

En 1980, Bjarne Stroustrup, danois de naissance, part après ses études d’informatique aux laboratoires Bell. Il y développera le langage C++ permettant d’apporter plus de fonctionnalités au langage C notamment le paradigme objet. En 1985, il publie le livre The C++ Programming Language de 700 pages. Cette fois, nous ne trouvons pas une description complète du langage mais plutôt un livre pédagogique présentant les concepts objets et leur mise en place. Il faut se rappeler qu’à cette époque, la programmation objet est peu usitée. Ainsi, pour convaincre les développeurs d’utiliser le C++ comme nouveau langage, il faut aussi les former. Ce livre servira pendant des années de référence jusqu’à la parution de la norme ISO en 1998. Mais Bjarne Stroustrup ne s’arrête pas là. En 1991, il a alors 41 ans et il publie la deuxième édition reflétant les évolutions du langage. Une troisième édition viendra en 1997. Finalement à la suite de l’évolution majeure du langage C++11, une quatrième édition sera disponible en 2013 avec la bagatelle de 1376 pages ! Fait remarquable, en 2022, Bjarne Stroustrup est toujours de ce monde et actif dans la communauté C++.

Bjarne Stroustrup: Why I Created C++ (4 minutes interview) :

Le langage C++ est en perpétuelle évolution, ainsi on compte aujourd’hui sept normalisations du langage :

Année

Code Norme

Nom donné à cette version du C++

1998

ISO/IEC 14882:1998

C++98 version majeure

2003

ISO/IEC 14882:2003

C++03

2011

ISO/IEC 14882:2011

C++11 version majeure

2014

ISO/IEC 14882:2014

C++14

2017

ISO/IEC 14882:2017

C++17

2020

ISO/IEC 14882:2020

C++20

2023

En préparation

C++23

Les évolutions du langage C++ ne se font pas toujours dans la continuité. Certaines syntaxes sont modifiées, parfois à 180°, souvent par bon sens mais parfois non. Cela implique que si un programme a été écrit en C++98 avec 300 000 lignes de code, le compiler en C++11 posera problème. En effet, certaines lignes de code produiront des erreurs. Mais pire encore, d’autres lignes ne produiront aucune erreur mais changeront de comportement à l’exécution produisant des bugs difficiles à détecter. Ainsi, il sera plus sage de continuer à maintenir ce programme en C++98 pour éviter toute mauvaise surprise.

Mais pourquoi n’apprend-on pas le C++ en étudiant sa norme ? Ce document n’est pas un livre pédagogique comme le K&R. En effet, il est avant tout destiné à des professionnels maintenant des compilateurs C++. Si vous cherchez à découvrir ce monde et à être au courant des dernières évolutions du langage, vous pouvez consulter le site dédié aux discussions sur le standard C++.

Beaucoup de programmeurs décrient les langages C et C++ car ils sont parmi les plus vieux langages encore en activité, pour d’autres, le langage C++ représente un langage particulièrement difficile à prendre en main et difficile à maîtriser. D’autres langages existent, plus modernes, plus accessible, alors pourquoi se lancer dans l’apprentissage du C++ ?

  • Il ne faut pas oublier que ce langage est un langage historique ayant influencé bon nombre de ses successeurs. On peut par exemple citer le langage Java qui s’est présenté comme une version améliorée du C++ dont les principaux défauts et faiblesses auraient été retirés.

  • Il ne faut pas oublier que les noyaux des systèmes actuels : Linux (donc Androïd), Windows et Mac sont écrits principalement en C et en C++. Il en est de même pour l’interpréteur Python ainsi que l’environnement d’exécution de Java.

  • Même si vous ne voyez pas au jour le jour des lignes de code écrites en C++, vous utilisez des logiciels écrits dans ces langages : notepad++, VLC, Word/Excel, 7Zip, Photoshop, Illustrator, Blender, Chromium (Chrome), Mozilla Firefox, Apache…

  • La majorité des moteurs de jeu (PC/Consoles) sont écrits en C++ : source (Counter Strike), Electronic Art’s game engine, Unreal Engine 4, GTAV Game Engine ou encore CryEngine V.

Ainsi, même si le langage C++ semble assez vieux avec plus d’une trentaine d’années d’existence, dès que l’on cherche à faire des projets d’envergure ou à obtenir des performances, le langage C++ devient un incontournable.

Linus Torvalds

Yann LeCun

Bjarne Stroustrup

Le langage C++

../_images/_linus.jpg ../_images/_lecun.jpg ../_images/_stroustrup.jpg ../_images/_bookcpp.jpg

Cependant, le C et le C++ n’arriveront pas à être des langages parfaitement portables ce qui causera de nombreux problèmes pour les projets professionnels. En effet, porter un code existant sur une plateforme différente amène à reprendre 10% du code ce qui engendre un surcoût. Pourquoi cela ? En effet, le langage C et le langage C++ disposent de librairies, certes, mais en nombre insuffisant pour des langages aussi populaires. Par exemple, ils ne savent pas, de base, gérer la souris, ce qui est relativement embêtant. Ils doivent donc intégrer du code tiers dialoguant avec le système d’exploitation. Une telle contrainte amène deux scénarios : soit vous trouvez une librairie multi-plateforme pour gérer la souris mais vous êtes dépendant d’un code tiers, soit vous écrivez un code pour chaque système d’exploitation et chaque version de ce système. Ce manque de portabilité sera un des moteurs de la création du langage Java qui 10 ans plus tard viendra empiéter sur les parts de marché du C++. La concurrence sera rude mais le langage C++ préservera sa popularité dans certains domaines comme les jeux vidéo, les applications multimédia ou le système embarqué.

Indiquez si les affirmations suivantes sont vraies ou fausses :

  1. Le C++ est un langage permettant d’obtenir des programmes très rapides.

  2. Le C++ garantit une portabilité à 100% du code vers un autre système d’exploitation.

  3. Le langage C++ est apparu après le langage Java.

  4. La librairie C++ permet de gérer la souris.

  5. Bjarne Stroustrup a publié de nombreux livres sur le langage C++

  6. Le langage C++ a été conçu comme une extension du langage C.

  7. Le C++ est un langage en perpétuelle évolution.

  8. Un code en C++11 fonctionnera parfaitement en C++17.

On peut aussi citer rapidement le langage Objective-C (1983, Brad Cox) arrivant dans le même contexte que celui du C++ : fournir une extension du langage C. Pendant plusieurs années, ce langage a été considéré comme un concurrent du C++, en effet, il est devenu populaire lorsque Steve Jobs le choisit comme langage de référence pour les Macintosh et plus récemment pour l’iPhone. Cependant, en 2014, la firme Apple choisira de mettre en avant un nouveau langage nommé Swift…

Note

Si un de vos amis vous prend de haut en vous expliquant que lui, il programme vraiment, en faisait du C++++. Alors, regardez le droit dans les yeux et demandez-lui : « Quelle version ? ». Soit c’est un troll et il s’enfuira en courant, soit c’est un geek et il vous respectera. Dans tous les cas, vous êtes gagnant.

Note

Y-a-t il une différence entre le compilateur C gcc et le compilateur C++ g++ ? La suite de compilateur GCC (GNU Compiler Collection) est divisé en deux parties : un frontend et un backend. Cette séparation permet la réutilisation du backend comme du front-end. En effet, la suite GCC supporte une variété de langages comme le C, le C++, le Fortran ou encore Java. Grâce à cette séparation, pour introduire un nouveau langage dans la GCC, il suffit de créer un nouveau frontend pour ce langage. Le frontend transforme le code source en un code intermédiaire indépendant du langage choisi et indépendant du processeur cible. Ensuite, on sélectionne le backend permettant de transformer le code intermédiaire en code machine correspondant à l’architecture ciblée comme par exemple Intel 64bits. Si vous voulez compiler un code source, quel que soit son langage d’origine, pour une nouvelle architecture de processeur, il suffit de développer un nouveau backend spécifique transformant le code intermédiaire en code machine pour cette nouvelle architecture.

Note

A noter que GCC (tout en majuscule) désigne une collection de compilateurs pour plusieurs langages, alors que gcc (tout en minuscule) désigne spécifiquement le compilateur C de la suite de compilateurs GCC.

../_images/_gcc.png