Program build ************* .. include:: ../BoutonGoogleTrad.rst Aperçu de la grammaire du C++ ============================= Lorsque le compilateur parcourt votre programme, il découpe le code source en différents éléments et analyse leur organisation. En pratique, l’essentiel d’un programme C++ se compose de commentaires, de directives du préprocesseur, de mots-clés, d’identifiants, de symboles et de littéraux. Nous les présentons plus en détail ci-dessous : Les commentaires ---------------- Le C++ possède deux formes de commentaires (:cppterm:`comments`) : .. code-block:: cpp // Commentaire sur une ligne /* Commentaire sur plusieurs lignes */ Les commentaires servent uniquement aux programmeurs et ne sont pas pris en compte lors de l’analyse du code. Les directives du préprocesseur ------------------------------- .. code-block:: cpp #include Les directives du préprocesseur (:cppterm:`preprocessing directives`) font partie du langage C++, mais elles sont traitées avant l'étape de compilation. Durant cette étape de prétraitement (:cppterm:`preprocessing`), elles sont repérées puis interprétées. Par exemple, la directive :cpp:`#include` insère le contenu d'un fichier dans le code source actuel. Lorsque la compilation commence réellement, toutes les directives du préprocesseur ont été traitées et ne figurent plus dans le code source. Les noms -------- Les noms donnés aux variables, fonctions, classes, etc. sont appelés des **identifiants** (:cppterm:`identifiers`). Un identifiant doit notamment respecter les règles suivantes : * Commencer par une lettre ou par le symbole :cpp:`underscore _` * Ne pas contenir d'espace ni de caractère spécial * Ne pas être un mot-clé réservé * Respecter la casse : :cpp:`Total` et :cpp:`total` sont deux identifiants différents. Les mots-clés ------------- Un **mot-clé** (:cppterm:`keyword`) est un mot réservé par le langage. La liste des mots-clés est définie par la `norme du langage `_. Chaque version du C++ dispose ainsi de sa propre liste de mots-clefs. Les mots-clés jouent différents rôles. Par exemple : * :cpp:`true` et :cpp:`false` sont des littéraux booléens * :cpp:`bool`, :cpp:`char`, :cpp:`float`, :cpp:`double`, :cpp:`int` représentent des types * :cpp:`if`, :cpp:`for`, :cpp:`while` contrôlent le déroulement du programme Les littéraux ------------- Un **littéral** (:cppterm:`literal`) est une valeur écrite directement dans le code source. Il en existe plusieurs catégories : * Entiers : :cpp:`4897`, :cpp:`0b110101010`, :cpp:`0xFF23` * Flottant : :cpp:`8.235` * Booléens : :cpp:`true`, :cpp:`false` * Caractère : :cpp:`\'a\'` * Chaînes de caractères : :cpp:`\"Bonjour\"` Les symboles ------------ Le C++ utilise de nombreux symboles appelés :cppterm:`punctuators`, par exemple : .. code-block:: text ! % ^ & * ( ) - + = { } | ~ [ ] \ ; ' : " < > ? , . / On peut notamment rencontrer : * des **délimiteurs**, qui structurent certaines constructions : :cpp:`{ } ( ) [ ] ;` * des **opérateurs** : :cpp:`+ - / = < >...` * des **types** comme :cpp:`int &` pour une référence vers un entier Un même symbole peut avoir plusieurs significations selon le contexte. Prenons l'exemple des parenthèses : * :cpp:`a = fnt()` : appel d'une fonction * :cpp:`4 / (5 - a)` : regroupement d'une expression * :cpp:`void fnt(int a)` : contient les paramètres d'une fonction Vous pouvez retrouver `les différentes utilisations des ponctuateurs `_ dans la documentation C++. .. quiz:: Keywordcpp :title: La syntaxe du C++ Indiquez si les affirmations suivantes sont vraies ou fausses : #) :quiz:`{"type":"TF","answer":"T"}` :cpp:`8.235` est un littéral. #) :quiz:`{"type":"TF","answer":"T"}` :cpp:`for`, :cpp:`while` sont des mots-clefs du C++. #) :quiz:`{"type":"TF","answer":"F"}` On peut choisir int comme nom de variable. #) :quiz:`{"type":"TF","answer":"F"}` Le C++ est un langage non sensible à la casse. #) :quiz:`{"type":"TF","answer":"F"}` Une paire de parenthèses correspond toujours à un appel de fonction. #) :quiz:`{"type":"TF","answer":"F"}` Le développeur peut définir de nouveaux mots-clefs. #) :quiz:`{"type":"TF","answer":"T"}` Les accolades sont des signes du langage C++. #) :quiz:`{"type":"TF","answer":"F"}` La paire de parenthèses désigne uniquement un appel de fonction. * :cppterm:`Donnez le terme C++` désignant la catégorie associée à :cpp:`x`, :cpp:`sin()`, :cpp:`vector` - ne pas utiliser de majuscules : :quiz:`{"type":"FB","answer":"identifier"}` * :cppterm:`Donnez le terme C++` désignant la catégorie associée à :cpp:`4.22` :cpp:`true` :cpp:`false` - ne pas utiliser de majuscules : :quiz:`{"type":"FB","answer":"literal"}` La génération ============= Principe -------- La **génération** d'un programme (:cppterm:`build`) 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** (:cppterm:`compilation`) : chaque fichier source (.cpp) est traduit en un **fichier objet** (:cppterm:`object file`) avec l'extension :cpp:`.obj` sous Windows et :cpp:`.o` sous Linux. Chacun de ces fichiers représente une portion du programme final. L'utilitaire accomplissant cette tâche s'appelle un **compilateur** (:cppterm:`compiler`). * La **liaison** (:cppterm:`link`) : 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** (:cppterm:`linker`). 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. .. warning:: Dans l’usage courant, on emploie souvent l’expression compiler un programme (:cppterm:`compile a program`) à la place de générer un programme. Cette confusion vient du fait que la compilation constitue l’étape la plus longue et la plus visible. Voici un schéma qui représente le traitement des différents fichiers sources et des fichiers objets durant l'étape de Build : .. image:: _compil.png :scale: 50% :align: center 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 effectuée dans son intégralité à chaque fois. Les erreurs ----------- La compilation produit des **erreurs de compilation** (:cppterm:`compile-time errors`), liées à la syntaxe et localisées précisément dans les fichiers sources. L'étape de **liaison** produit des erreurs de liaison (:cppterm:`linker errors`). Par exemple, appeler une fonction dont la définition est absente du programme provoque une erreur de liaison. Outils de build --------------- Pour exécuter ce processus, plusieurs approches sont possibles : * Exécuter manuellement les commandes dans un terminal, * Utiliser un utilitaire (comme :cpp:`Make` ou :cpp:`CMake`) qui automatise le build à l’aide de fichiers de configuration, * Recourir à un environnement de développement (:cpp:`IDE`) permettant de lancer le build en un clic (:cpp:`Visual Studio`). .. quiz:: Trad :title: Traduction Indiquez si les affirmations suivantes sont vraies ou fausses : #) :quiz:`{"type":"TF","answer":"F"}` L'étape de compilation traduit un fichier objet en fichier exécutable. #) :quiz:`{"type":"TF","answer":"F"}` Si vous avez 3 fichiers :cpp:`.cpp` et un fichier :cpp:`.exe`, vous aurez 4 fichiers objets. #) :quiz:`{"type":"TF","answer":"F"}` L'étape de liaison a lieu avant l'étape de compilation. #) :quiz:`{"type":"TF","answer":"T"}` Un fichier source est recompilé lorsqu'il est mis à jour. #) :quiz:`{"type":"TF","answer":"T"}` Un build représente la traduction du code source en programme exécutable.