Générer un programme
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
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 :
Si le langage utilise le typage statique, les variables ne peuvent pas changer de valeur.
Le typage statique permet de détecter toutes les erreurs dans un programme.
Le typage statique interdit à une variable d’avoir plusieurs types durant l’exécution.
Le typage statique permet de détecter des erreurs entre types incompatibles avant l’exécution du programme.
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++ :
Le 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 trait _ de soulignement. 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 littéraux des nombres entiers
4897 : forme décimale
0b110101010 : forme binaire
0xFF23 : forme hexadécimale
- Les littéraux des nombres flottants
8.235 : nombre flottant de type double
- Les littéraux booléens
true/false : valeurs booléennes
- Les littéraux de tableau de caractères
"Bonjour" : tableau de caractères
Les signes
Il existe une liste de signes en C++ appelés Ponctuators (anglicisme) : ! % ^ & * ( ) - + = { } | ~ [ ] ; “ : » < > ? , . /
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 :
8.235 est un littéral.
for, while sont des mots-clefs du C++.
On peut choisir int comme nom de variable.
Le C++ est un langage non sensible à la casse.
Une paire de parenthèses correspond toujours à un appel de fonction.
Le développeur peut définir de nouveaux mots-clefs.
Les accolades sont des signes du langage C++.
La génération
La génération d’un programme (build en anglais) désigne le processus consistant à transformer des codes sources au format texte en programme exécutable sur un type de machines donné. Ce processus repose sur deux actions :
La compilation qui transforme 1 fichier source (.cpp) en 1 fichier objet avec l’extension .obj sous Windows et .o sous Linux. Un fichier objet correspond grosso-modo à un morceau du programme final. Un utilitaire pouvant accomplir cette tâche est appelé compilateur.
La liaison (ou link en anglais) qui fusionne les différents fichiers objets pour obtenir le programme exécutable final. Un utilitaire pouvant effectuer cette tâche s’appelle un éditeur de liens (linker en anglais).
Le compilateur et l’éditeur de liens peuvent être des programmes séparés ou un même programme, cela n’a pas d’importance pour le processus.
Voici un schéma qui représente le traitement des différents fichiers sources et des fichiers objets durant l’étape de Build :
Note
Les fichiers sources sont compilés indépendamment. Cela signifie que lorsqu’un fichier source est compilé, il n’a pas connaissance du contenu des autres fichiers sources ! Cela peut vous paraître étrange, mais il y a un avantage à cela. En effet, lorsqu’on modifie un fichier source et que l’on relance la séquence de Build, seul ce fichier source est recompilé, les autres fichiers objets sont conservés tels quels. L’étape de liaison doit, dans tous les cas, reprendre la totalité de ses traitements dès qu’un fichier source est modifié.
- Pour mettre en place l’étape de Build, plusieurs approches sont possibles :
Le terminal dans lequel vous lancez manuellement ces opérations.
L’utilisation d’un utilitaire (comme Make ou CMake) automatisant le process de build en utilisant des fichiers texte pour décrire les étapes à effectuer.
L’utilisation d’un environnement de développement vous permettant par un clic sur l’icône de Build de générer le projet complet.
Avertissement
Dans le langage oral, on remplace souvent l’expression « générer un programme » par l’expression « compiler un programme ». Cela vient du fait que lors d’un build, l’étape de compilation prend le plus de temps, l’étape de liaison étant rapidement effectuée à la fin du processus.
L’étape de compilation produit des erreurs de compilation ! Ces dernières concernent essentiellement la syntaxe du programme. Chaque erreur de syntaxe est localisée dans un fichier source à une position précise. L’étape de liaison produit des erreurs de liaison ! Par exemple, une erreur de liaison se produit lorsqu’une fonction est appelée dans le programme alors qu’aucun code associé à cette fonction n’a été trouvé dans l’ensemble des fichiers sources.
Indiquez si les affirmations suivantes sont vraies ou fausses :
L’étape de compilation traduit un fichier objet en fichier exécutable.
Si vous avez 3 fichiers .cpp et un fichier .exe, vous aurez 4 fichiers objets.
L’étape de liaison a lieu avant l’étape de compilation.
Un fichier source est recompilé lorsqu’il est mis à jour.
Un build représente la traduction du code source en programme exécutable.