Générer un programme

  • Your native language: with Chrome, right-click on the page and select « Translate into … »

  • English version:

Un typage statique

Le langage C++ dispose d’un typage statique. Cela signifie que les types de toutes les variables sont déterminés au moment de la compilation, plutôt qu’à l’exécution. Ainsi, le type de chaque variable doit être soit:

  • déclaré explicitement par le programmeur

  • inféré par le compilateur (par exemple le résultat de 5+6.0 est un double)

Cela implique qu’aucune variable n’est autorisée à changer de type durant l’exécution du programme, d’où le terme de statique. De cette façon, aucun temps n’est perdu durant l’exécution du programme à effectuer des vérifications sur les types des variables, d’où un gain de performance.

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 avant l’exécution du programme.

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

Les éléments présents dans le code C++

Nous précisons ci-dessous les principaux éléments de la structure du C++ :

  • Les commentaires

  • Les noms (identifiants)

  • Les mots-clefs

  • Les littéraux

  • Les signes

Les commentaires

Plusieurs possibilités :

  • Soit placés en fin de ligne et précédés par //

  • Soit sur plusieurs lignes et délimités par /* et */

Les noms

Le C++ permet au programmeur de nommer librement les variables, les tableaux, les fonctions, les structures et les classes. Ces noms (name) sont appelés aussi des identifiants (identifiers). Les identifiants doivent respecter les mêmes règles :

  • Un identifiant doit commencer par une lettre ou par un caractère _ de soulignement (underscore). En conséquence, aucun identifiant ne peut commencer par un chiffre.

  • Pas de caractères spéciaux ou d’espaces à l’intérieur d’un identifiant.

  • Pas de mots-clés.

Note

En C++, les caractères majuscules et minuscules ont des significations différentes. On dit que le langage est sensible à la casse. Ainsi, Total et total sont considérés comme deux identifiants différents, associés par exemple à deux variables distinctes.

Les mots-clefs

Un mot-clef (keyword) appelé aussi un mot réservé, représente un mot appartenant à la liste des mots réservés du langage. Cette liste est établie par la norme du langage qui évolue en fonction des versions du C++. Il est interdit d’utiliser ces mots-clefs comme identifiant. Dans le tableau ci-dessous, nous vous présentons les plus classiques qui vous seront sûrement déjà familiers.

Exemple de mots-clefs du C++

bool

char

class

do

double

else

false

float

for

if

int

return

unsigned

this

true

void

while

Les mots-clefs tiennent différents rôles :
  • true et false : correspondent à des constantes de type booléen.

  • bool, char, float, double, int, void : sont associés aux types du C++.

  • if, for, while : représentent des instructions du langage servant à gérer le flux de contrôle d’un programme.

Les littéraux

Un littéral (literal) désigne une valeur écrite dans le code source du programme. On trouve aussi le terme de constante (constant) utilisé de manière similaire dans la communauté. Ils sont divisés en sous-catégories :

Les signes

Il existe une liste de signes en C++ appelés Ponctuators (anglicisme) : ! % ^ & * ( ) - + = { } | ~ [ ] ; “ :  » < > ? , . / regroupés en deux grandes catégories :

  • Les délimiteurs — signes qui structurent le code, par exemple : { }, ( ), ;, ,, : …

  • Les opérateurs — signes qui servent aux calculs ou aux manipulations, par exemple : +, -, *, /, =, <, > …

Chacun de ces signes, suivant le contexte où il est utilisé, peut prendre des significations différentes. Prenons le cas de la paire de parenthèses :

  • Dans l’écriture : a = fnt(), elles représentent un appel de fonction.

  • Dans l’écriture : 4/(5-a), elles indiquent l’ordre dans lequel un calcul sera effectué.

  • Dans l’écriture : void fnt(int a), elles permettent de lister les paramètres d’une fonction.

Vous pouvez retrouver pour chaque signe sa liste d’interprétations possibles.

Par exemple, les accolades { } sont des signes servant de délimiteurs pour isoler un bloc de code. Comme autres signes fréquemment utilisés, on trouve les opérateurs arithmétiques : + - /

Indiquez si les affirmations suivantes sont vraies ou fausses :

  1. 8.235 est un littéral.

  2. for, while sont des mots-clefs du C++.

  3. On peut choisir int comme nom de variable.

  4. Le C++ est un langage non sensible à la casse.

  5. Une paire de parenthèses correspond toujours à un appel de fonction.

  6. Le développeur peut définir de nouveaux mots-clefs.

  7. Les accolades sont des signes du langage C++.

La génération

Principe

La génération d’un programme (build en anglais) désigne le processus qui transforme les fichiers sources (texte) en programme exécutable sur une machine donnée. Ce processus repose deux étapes principales :

  • La compilation : chaque fichier source (.cpp) est traduit en un fichier objet avec l’extension .obj sous Windows et .o sous Linux. Chacun de ces fichiers représente une portion du programme final. L’utilitaire accomplissant cette tâche s’appelle un compilateur.

  • La liaison (ou link en anglais) : les différents fichiers objets sont fusionnés pour obtenir le programme exécutable final. L’utilitaire effectuant cette tâche s’appelle un éditeur de liens (linker en anglais).

Le compilateur et l’éditeur de liens peuvent être des programmes distincts ou intégrés dans un même outil, cela n’a pas d’importance pour le processus.

Avertissement

Dans l’usage courant, on emploie souvent l’expression compiler un programme à la place de générer un programme. Cette confusion s’explique par le fait qu’au cours du build, l’étape de compilation est généralement la plus longue et apparaît donc comme l’étape principale.

Voici un schéma qui représente le traitement des différents fichiers sources et des fichiers objets durant l’étape de Build :

../_images/_compil.png

Indépendance des fichiers sources

Chaque fichier source est compilé indépendamment : il n’a pas connaissance du contenu des autres fichiers. Cette approche permet de ne recompiler que les fichiers modifiés, ce qui accélère la génération du programme. En revanche, l’étape de liaison doit toujours être rejouée dans son intégralité.

Les erreurs

La compilation produit des erreurs de compilation, liées à la syntaxe et localisées précisément dans les fichiers sources.

L’étape de liaison produit des erreurs de liaison comme par exemple lorsqu’une fonction est utilisée dans le programme alors que son code n’existe dans aucun des fichiers sources.

Outils de build

Pour exécuter ce processus, plusieurs approches sont possibles :

  • Exécuter manuellement les commandes dans un terminal,

  • Utiliser un utilitaire (comme Make ou CMake) qui automatise le build à l’aide de fichiers de configuration,

  • Recourir à un environnement de développement (IDE) permettant de lancer le build en un clic.

Indiquez si les affirmations suivantes sont vraies ou fausses :

  1. L’étape de compilation traduit un fichier objet en fichier exécutable.

  2. Si vous avez 3 fichiers .cpp et un fichier .exe, vous aurez 4 fichiers objets.

  3. L’étape de liaison a lieu avant l’étape de compilation.

  4. Un fichier source est recompilé lorsqu’il est mis à jour.

  5. Un build représente la traduction du code source en programme exécutable.