Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. C++
  3. Introduction
Extrait - C++ Des fondamentaux du langage aux applications (3e édition)
Extraits du livre
C++ Des fondamentaux du langage aux applications (3e édition) Revenir à la page d'achat du livre

Introduction

Notions clés

1. Principales caractéristiques du langage C++

Le langage C++ est apparu officiellement en 1983, date de ses premières utilisations hors du laboratoire AT&T qui l’a fait naître. Son concepteur, Bjarne Stroustrup, avait débuté ses travaux plusieurs années auparavant, sans doute vers 1980. Le langage C++ - appelé jusque-là "C avec des classes" - a été élaboré en conservant la plupart des concepts du langage C, son prédécesseur. Les deux langages se sont ensuite mutuellement échangé des concepts.

Comme le langage C, C++ adopte une vision très proche de la machine. Il a été destiné en premier lieu à l’écriture de systèmes d’exploitation mais ses caractéristiques lui ont ouvert d’autres perspectives.

Le langage est formé d’instructions très explicites, courtes, dont la durée d’exécution peut être prévue à l’avance, au moment de l’écriture du programme.

Le nombre d’instructions et de notations étant volontairement limité, les interprétations des constructions sémantiques sont multiples et c’est sans doute ce que le concepteur du langage C++ désigne sous le terme d’expressivité.

Toutefois, Bjarne Stroustrup a veillé à contourner certains écueils du langage C, et notamment sa tendance à tout ramener au niveau de l’octet, quantité numérique limitée et totalement obsolète dans l’histoire de l’informatique, même en 1980. Pour obtenir ce résultat, le langage s’est enrichi de classes qui décrivent des types de données adaptés aux différents besoins du programmeur. La visibilité du langage combinée à l’abstraction des classes fournit des programmes de haut niveau.

Les classes (et la programmation orientée objet) n’ont pas été inventées à l’occasion de C++. L’inventeur du langage s’est efforcé d’adapter des concepts de haut niveau introduits par le langage Simula en 1967, à une plate-forme très explicite, le langage C.

Il résulte de cette double filiation...

Bases de la programmation C++

Nous allons maintenant découvrir comment C++ permet d’implémenter des algorithmes. Ce langage appartient à la famille des langages procéduraux, ce qui signifie que les instructions d’un programme sont regroupées pour former des procédures - que l’on appelle aussi fonctions.

Un programme C++ utilise d’une part des variables pour ranger des valeurs et d’autre part des instructions pour faire évoluer ces valeurs. Ce n’est pas l’aspect le plus original de C++ puisqu’il partage cette base "algorithmique" avec le langage C. De ce fait, de nombreux types de données sont communs aux deux langages et les instructions de base sont également identiques. Ceci facilite l’apprentissage du langage C++ et améliore la portabilité ascendante.

Signalons aussi que la syntaxe C++ est un peu plus souple que celle du C, notamment en ce qui concerne la déclaration des variables et des paramètres. La relecture des programmes s’en trouve naturellement améliorée.

Pour le lecteur qui découvre la programmation orientée objet avec C++ il est essentiel d’assimiler pleinement la programmation fonctionnelle, c’est-à-dire à base de fonctions. Connaître les algorithmes de base - recherches, tris - est un très bon moyen d’y parvenir. La programmation orientée objet est un sur ensemble de la programmation fonctionnelle, une façon particulière de la structurer, de l’exploiter. Mais les règles de base demeurent les mêmes.

Avant toute instruction et toute déclaration de variable, expliquons la notation des commentaires.

Les commentaires sont des annotations rédigées par celui qui programme. Ils facilitent la relecture et rappellent parfois le rôle de certaines variables ou de certains blocs d’instructions.

Le langage C++ connaît deux types de commentaires : les commentaires sur une seule ligne et ceux qui occupent plusieurs lignes.

Pour le premier type, on utilise la barre oblique redoublée. Le compilateur qui reconnaît cette séquence // ignore tout ce qui suit jusqu’à la fin de la ligne.

Le second type est délimité par les séquences /* et */, ce qui autorise l’annotation sur plusieurs...

Exceptions

1. Les approches de bas niveau

Tout programme est soumis aux aléas de l’environnement qui le fait fonctionner. Il peut intervenir des défaillances matérielles, certains processus bloquent des ressources critiques, la mémoire n’est pas inépuisable...

Pour qu’un programme entre dans la catégorie des logiciels, il doit être tolérant vis-à-vis de ces événements et ne pas se bloquer, ou pire, s’interrompre brutalement.

Les anciens langages de programmation sont en général assez mal pourvus pour traiter les situations problématiques, et les développeurs se sont souvent appuyés sur les dispositifs prévus par leur environnement.

a. Drapeaux et interruptions

Certains microprocesseurs disposent d’instructions destinées à déclencher des sous-programmes - des fonctions en langage C - lorsque certaines conditions sont réunies : une division par zéro, un dépassement de capacité, une faute dans la gestion de la mémoire paginée... Il n’est pas rare de voir une partie de ces interruptions laissées à l’entendement du programmeur système. Ainsi, le système d’exploitation MS-DOS a-t-il programmé sur l’interruption n°19 le redémarrage du système. Il existe des pilotes de périphériques qui emploient ces interruptions pour synchroniser des échanges de données. Citons les pilotes de disques durs, d’affichage et ceux prenant en charge les cartes d’acquisition numérique ou les cartes son.

À l’aide des instructions adéquates, qui peuvent être symbolisées par l’appel d’une fonction de l’API mise à disposition par le système d’exploitation, le programme enregistre l’adresse d’une fonction dite callback pour un numéro d’interruption donné.

Cette interruption peut ensuite être déclenchée directement par le microprocesseur - en cas de division par zéro par exemple - ou par un programme. Lorsque l’interruption est déclenchée, le microprocesseur appelle automatiquement la fonction callback. Lorsque c’est un programme qui est à l’origine du déclenchement de l’interruption...

Travaux pratiques

1. Prise en main de l’interprète tiny-lisp

Tout au long de l’ouvrage est étudié le code source de l’interprète tiny-lisp. Quelques dizaines de lignes de C++ suffisent pour analyser et évaluer des expressions basées sur la syntaxe de LISP.

Au cours des prochains TP, nous allons découvrir la structure du projet C++ tiny-lisp, avant de le faire fonctionner de deux façons. La première approche consiste en une application console capable de charger et d’exécuter des scripts. La deuxième méthode fait tourner l’interprète tiny-lisp à partir d’un éditeur de scripts fenêtré.

a. Structure de la solution

Après avoir téléchargé les fichiers complémentaires de cet ouvrage, ouvrez dans Visual Studio la solution tiny-lisp.sln qui se compose de trois projets :

  • Le projet C++ tiny-lisp comprenant le code de l’interprète.

  • Le projet C# tinylisplab comprenant le code de l’éditeur de code source tiny-lisp.

  • Le projet C# WinFormsSyntaxHighlighter comprenant des extensions destinées à appliquer de la coloration syntaxique pour le composant RichTextBox.

images/01NEWRI01.png

Nous allons nous concentrer sur le projet C++ tiny-lisp et présenter les principaux dossiers (aussi appelés "filtres" dans Visual Studio).

b. Le dossier config

L’essentiel du code est organisé sous forme de classes C++ décrites dans des fichiers d’en-têtes .h et des fichiers sources .cpp.

Le dossier config comprend la classe Configuration servant à activer des modules d’extensions pour le langage tiny-lisp.

images/01NEWRI02.png

c. Le dossier framework

Le dossier framework comporte plusieurs classes utilitaires pour la gestion des couleurs, des fichiers, ou la communication inter-objet.

images/01NEWRI03.png

d. Le dossier jsonlib

Le format JSON (JavaScript Object Notation) tend à remplacer XML ; le dossier jsonlib comporte une adaptation du code json11 pour convertir des objets C++ en flux JSON et réciproquement.

images/01NEWRI04.png

e. Le dossier langage

C’est un peu le noyau de l’interprète tiny-lisp, ce dossier comporte la majorité des classes C++ du projet. Les principaux fichiers sont type.h dans lequel figurent les classes Variant et Environment, ainsi que Parser.h/Parser.cpp

L’analyseur d’expressions...