Logo de SAASF

I - 1. Les bases du C++

Cette première partie est particulièrement importante pour comprendre le reste du cours. Dans cette partie, je vais vous raconter les bases du C++, et même, plus généralement, de la programmation. Cette étape sera très utilise pour ceux qui ne connaissent pas bien le domaine. D'ailleurs, nous ne parlerons pas que d'informatique. Mais pour savoir pourquoi et comment, il faut que je vous explique quelques petits trucs avant.
Contenu

A. Les bases de la programmation

Avant de s'attaquer au langage de programmation, nous allons faire un petit détour vers les bases de ce qu'est la programmation.

a. Pourquoi programmer ?

Cette question peut paraître particulièrement débile. Cependant, vous l'aviez vous déjà posé ? La première réponse qui peut vous venir en tête est "Je veux faire quelque chose à l'aide d'un ordinateur". Cette réponse est tout à fait juste et satisfaisante. Cependant, on va un peu plus creuser le concept pour comprendre ce que l'on va faire.

Par définition, selon la définition 1 du Larousse, la programmation est "Action de programmer quelque chose". Cependant, programmer signifie, selon la définition 2 du Larousse, "Établir à l'avance une suite d'opérations". Ces définitions collent parfaitement à ce qu'on veut faire. En effet, on veut créer une suite d'action, exécutée par ordinateur, permettant de faire quelque chose.

Cette logique s'inscrit dans la logique d'automatisation. Selon IBM, l'automation d'un processus est le fait de faire à ce que cette tâche se réalise toute seule, grâce à une machine. Par soucis de facilité, il est aussi recommandé de faire à ce que l'utilisateur est le moins possible besoin d'intervenir dans ce processur. Par exemple, on peut automatiser un calcul, comme 547856+554478/44775, grâce à une calculatrice. Cependant, une machine, même automatique, n'est pas forcément programmable. En effet, elle peut ne seulement exécuter qu'un programme défini par son architecture, et donc, non modifiable. Heuresement, certaines machines peuvent modifier leur comportement selon un programme donné par l'utilisateur. Ces machines sont appelées machine programmable. Donc, la programmation est un moyen d'automatisation d'une tâche en utilisant une machine programmable.

Une chose, peu importante, est que la programmation n'est pas que informatique. En effet, n'importe quel objet programmable peut utiliser un programme. Cependant, certains de ces objets ne sont pas nécessairement informatique. Par exemple, selon Wikipédia, la machine à tisser "Métier Jacquard" est une machine programmeable, mais sans informatique. Elle utilise un ingénieux système de carte programmable, qui exécute des actions sans électronique, mais par la seule ingéniosité de la mécanique qui la constitue. Bien évidemment, dans ce cours, je ne parlerai pas de ce genre de programmation, mais plutôt de programmation électronique.

Une chose qu'il est assez important de rappeler est une explication de "Mais comment c'est possible ?". En effet, vous, moi, peut être vos parents ou animaux de compagnies nous sommes posés cette question. Comment est-il possible de créer une machine programmable ? L'idée en général d'une machine programmable est d'incorporer dans son architecture tout ce qu'elle peut faire physiquement. En suite, le programme doit être physiquement fait de telle façon qu'il puisse faire à ce que la machine effectue la tâche adéquat. Par exemple, en utilisant habilement des rouages, il est possible de créer une calculatrice mécanique, comme la machine à calculer de Blaise Pascal, la pascaline, faite il y a presque 400 ans. Le mouvement des rouages permet de provoquer le calcul demandé. Ce concept est le même pour toutes machine programmable, avec seulement les mécaniques qui effectuent les tâches de différentes.

La mécanique derrière ces machines programmables peuvent être différents, mais ne s'éloignent jamais vraiment entre elles. En général, c'est une représentation dans la vraie vie de concepts mathématiques. Par exemple, dans la pascaline vue plus haut, la mécanique de l'addition est une très simple mécanique, ou une unité représente un dizième de tour de rouage. Donc, un tour complet de rouage représente 10, provoquant par ailleurs l'annulation de cette dizaine et l'augmentation de la dizaine de haut dessus, comme dans l'addition que l'on apprend en primaire. Ces concepts mathématiques sont utilisés dans toutes les machines programmables, plus ou moins différement.

Pour conclure cette partie, nous allons dire que nous allons programmer sur ordinateur, donc créer une suite de tâches automatiques sur un appareil programmable.

b. Comment programmer sur ordinateur ?

Pour cette partie, nous allons devoir revoir quelques bases des ordinateurs, et même plus globalement, de l'électronique. En effet, comme nos programmes s'éxecuterons grâce à ça, elles auront un rôle racine, qu'il est important de connaître.

Le premier concept à comprendre est comment et pourquoi l'ordinateur est une machine programamble. Comme vu plus haut, l'ordinateur, en tant que machine programmable, contient dans son architecture de quoi effectuer physiquement des tâches. Pour cela, il utilise la mécanique de l'électricité, ou électronique. L'idée est d'utiliser l'électricité pour assurer ces tâches. L'utilisation de ce type de mécanique est qu'il est facile de créer des systèmes physiques extrêmement petits et rapide. Ces systèmes physiques peuvent aussi être appelés une puce électronique / circuit intégré. Ces puces électroniques utilisent différents types de composants, mais je ne rentrerai pas dans les détails. Le processus de retrécissement de ces composants est appelée la miniaturisation. Plus il y a de composant, plus la puce est puissante.

Comme vu plus haut, cette mécanique doit être la représentation d'un concept mathématique. Le concept mathématique utilisé nécessite une base numérique 2 constituée de 2 chiffres : 0 et 1. Cette base 2 est la célèbre base binaire. En général, en électronique, les chiffres, appelés "bits", sont regroupés en paquets de 8 bits, nommés "octets", ou "bytes" en anglais. Cette base permet d'utiliser un concept mathématique très important : l'algèbre de Boole. De plus, cette algèbre permet de réaliser tous les calculs mathématiques immagineables, dans une certaine mesure. Pour représenter tout cela physiquement, les puces électroniques utilisent 2 types de courants : courants forts et courants faibles (mais non nul). Pour pouvoir appliquer l'algèbre de Boole, elles utilisent des composants spéciaux, comme transistors, combinées aux courants donnés. L'avantage de cette algèbre est qu'elle peut être entièrement représentée grâce à des composants de ce genre, et donc permettre de mener des tâches. Une ingénieuse disposition de ces composants permet de rendre la puce programmable. Pour finir, la combinaison électronique / algèbre de Boole permet de rendre un ordinateur pleinement programmable.

Ces tâches sont réalisées, en général, par un composant nommé le processeur. Il est possible, grâce à un protocole dépendant du matériel, de l'OS... de donner une suite d'octets au processeur, pour qu'il réalise les tâches qu'on veuille qu'il réalise. Ces octets que nous allons donner au processeur correspondent au code source en langage machine du programme à exécuter. Cependant, "donner un code source en langage machine à exécuter au processeur" dépend lui aussi de beaucoup de choses très complexes. Il existe cependant un moyen plus simple de faire, c'est de lancer un programme dans un fichier exécutable, au titre le plus littéral du terme. Votre système d'exploitation s'occupera du reste, et les tâches s'exécuteront. La programmation sur ordinateur consiste donc à créer ce code source en langage machine de 0 et de 1 / octets pour pouvoir l'exécuter en suite sur l'ordinateur.

c. Les langages de programmation

Cependant, créer un jeu vidéo en 0 et en 1 est une tâche complexe, voir impossible. En effet, si je vous dis "01010011 01100001 01101100 01110101 01110100", bonne chance pour lire ce message. C'est pour ça que les développeurs ont crée quelque chose d'extraordinaire : les langages de programmation. L'idée est de définir chaque octets nécessaires dans le programme par un mot bien humain, qu'il faudra ensuite convertir en 0 et 1, selon ce que le mot représente. Le langage qui correspond exactement à cette définition est l'assembleur. Par exemple (le même que celui de Wikipédia), l'instruction "10110000 01100001" représente en assembleur " movb $0x61,%al" (seulement certains types de CPU lirait l'instruction comme ça, tout dépend de comment ils sont faits). Ce langage est dit "bas niveau", ce qui veut dire qu'il est très proche du langage machine. À l'inverse, un langage "haut niveau" comme Python est assez loin du langage machine. Les langages de programmation représentent donc une manière humainement lisible de représenter les instructions d'un matériel informatique.

Cependant, l'assembleur n'est pas parfait. En effet, le premier problème est que chaque processeur a son propre assembleur. L'ensemble des instructions que possèdent un processeur s'appele un jeu d'instructions. Il existe cependant des normes permettant d'avoir des jeux d'instructions similaires, comme AMD64 ou ARM. De plus, il existe des versions étendues (CISC), réduites (RISC)... Pour donner le coup de grâce, le système d'exploitation peut complexifier le tout. Donc, l'assembleur à beau être un langage compréhensible pour l'humain, il est très peu portable et compréhensible (sauf si vous aimez vous faire du mal). Heuresement, des langages plus haut niveau existent, comme le C++. L'idée de ces langages est de pouvoir faire des instructions plus simple et compréhensible, tout en permettant l'adaptation et la portabilité en assembleur. Pour être plus précis, ces langages demandent la conversion du code en code assembleur adéquat, puis en langage machine, tout en état plus simple à utiliser. C'est le cas par exemple du C ou du C++.

Les langages utilisant ce procédé doivent donc être convertis en assembleur avant de finir en langage machine exécutable. Pour cela, les développeurs ont crée deux outils formidables : le compilater (ou compiler en anglais) et le l'éditeur de lien (linker en anglais). Ces langages sont appelés langages compilés. Comme tout les développeurs ont l'habitude de faire, j'appellerai ces programmes par leur nom anglais. Le compiler doit transformer le code C++ en langage machine, et le lieur doit s'occuper de proprement lié tous les codes générés pour faire un bel exécutable tout propre. En effet, le compiler va en général créer plusieurs fichiers de code source, dans un langage nommé "le code objet". Nous verrons plus tard comment se fait plus précisément cette génération en C++. Le linker va prendre tous les fichiers en code objet générés, supprimer les doublons si il y en a, et s'assurer que tout s'exécute comme voulu. Il va ensuite générer le fichier en exécutable. Cette manière de faire peuvent provoquer des erreurs assez peu détaillées de temps en temps, mais nous analyserons tout ça plus tard. En définitif, pour utiliser un langage compilé, il faut absolument un compiler et un linker (à noter que le linker est souvent fourni avec le compiler).

Il est important de noter que certains langages ne fonctionnent pas comme ça. En effet, certains langages, comme Python, ne convertissent pas leur tâches en code source, mais les font exécuter par un outil nommé un interpréteur. Ces langages sont appelés langages interprétés.

Un autre outil nécessaire pour développer est un endroit où écrire le code, comme LibreOffice mais pour le code. Il est aussi pratique d'y ajouter des outils pour coder plus facilement, comme la mise en évidence de certains mots importants ou l'option de compilation intégré. Pour cela, il faut IDE (integrated development environment). Il existe beaucoup d'IDE, certains open source et d'autres non.

Les langages de programmation peuvent utiliser des mécaniques propres à eux pour fonctionner. Par exemple, certains concepts de certains langages diffèrent de concepts d'un autre langage. Ces concepts sont appelés des paradigmes de programmation.

Avec tout ça, on peut commencer à voir pour le C++.

Contenu

B. Les bases du C++

Après toutes ces définitions, la définition du C++ devient extrêmement simple, et ne nécessite seulement que de piocher dans les définitions déjà énoncées plus haut.

a. Qu'est ce qu'est le C++ ?

Le C++ est un langage de programmation compilé. C'est un langage qui est considéré comme étant assez bas niveau, bien que bien plus haut niveau que l'assembleur. En tant que langage bas niveau, il est un langage très rapide, permettant de développer des jeux vidéos, logiciels... Il est dérivé du langage C, et s'inspire en grande partie de ce dernier. Il est la base de presque tout ce que représente la programamtion de nos jours. En effet, sa syntaxe et son utilisation ont su ravir une grande quantité de développeurs. Il est tellement populaire que, selon l'index TIOBE, le C++ est le 3ème langage le plus utilisé au monde en 2024.

Le C++ est constitué de 3 paradigmes principaux : la programmation générique, la programmation orientée objet et la programmation procédurale. Nous verrons précisément plus tard ce que ces mots veulent dire. Ils constituent la base du langage, et ce pourquoi le langage est si populaire.

b. Comment utiliser du C++ ?

Comme nous l'avons vu, les langages de programmations nécessitent un IDE pour fonctionner. Il vous faudra donc un IDE pour faire marcher votre code C++. De plus, comme le C++ est un langage compilé, utiliser un IDE permettant d'utiliser facilement le compiler est recommandé? Il existe des milliers de listes d'IDEs C++ sur Internet, qui vous les présentent et vous conseillent sur lequel choisir, de manière plus ou moins réussies. Je ne vous parlerai ici que des IDEs que je connais personnellement et que j'ai eu l'occasion d'utiliser. Le plus simple est l'IDE de Microsoft Visual Studio, qui est fourni avec un installeur de grande qualité, pour moduler tout ce dont vous aurez besoin. Cependant, il n'est pas Open Source, et seule la version "Communauté" est gratuite. L'autre IDE que j'ai beaucoup utilisé est QT Creator, qui est aussi fourni avec un très bon installeur, et le framework C++ proposé par QT. De plus, il est Open Source sous la licence LGPL, bien que seule la version "Communauté" est gratuite. Finalement, le dernier IDE que j'ai utilisé, et que j'utilise toujours, et l'IDE Open Source Code::Block. Il est entièrement gratuit, même si il est malheuresement assez prise de tête pour les nouveaux venues. De plus, il n'a pas de Dark Mode facilement implémentable. La dernière chose à dire sur ces IDEs est qu'ils, en général, utilisent un système de projets pour pouvoir utiliser le C++. Nous verrons pourquoi ces systèmes de projets sont nécessaires pour pleinement utiliser le C++. Au final, le choix de votre IDE ne dépend que de vous, et de ce que vous préférez.

Si vous choisissez Visual Studio ou QT, en général, le compiler et le linker sont fournis dans le téléchargement. Cependant, si ce n'est pas le cas, comme sur Code::Block, il vous faudra l'installer vous même. C'est une opération plus simple qu'il n'y paraît. Le compiler le plus utilisé est le compiler proposé par GNU (la même entreprise que Linux), GCC. Il est entièrement libre et Open Source. Cependant, ce qui nous intéresse en particulier est l'environnement complet de GCC, nommé "MinGW". Si vous êtes sur Linux, il devrait être automatiquement installé de base. Sur Windows, pour l'installer, il vous faut vous rendre sur le Github de MinGW, et sélectionner la version qui vous convient (en général, " w64devkit-1.23.0.zip"). Il vous faut ensuite indiquer à votre IDE les liens nécessaires. Sur Code::Block, il vous faut aller dans "Paramètres" (en haut), puis "Compilateur", puis "Toolchain executable". Dans "Compiler's installation directory", vous devez renseigner le chemin d'accès vers le dossier principale de votre compilateur. Vous renseignez en suite "gcc.exe" dans "Compilateur C", et "g++.exe" dans "Compilateur C++" et "Linker for dynamics libs". Le linker est utilisé automatiquement avec ces programmes. Une fois que tout cela est fait, vous pouvez commencer à faire du C++.

c. Votre premier programme C++

La toute première étape pour créer un programme en C++ est de créer un projet avec votre IDE. Vous devriez choisir entre pleins de choses différentes, selon l'IDE choisi. Dans Code::Block, il faut choisir un projet C++ avec console. Pour le reste, rentrez le nom de votre projet, son chemin d'accès, et laissez le reste par défaut. Après ça, vous aurez un fichier dans votre projet, nommé "main.cpp". Ce fichier est un fichier source en C++, ou fichier "cpp". Ce fichier devrait ressembler à ça :

#include <iostream>

using namespace std;

int main()
{
        cout << "Hello world!" << endl;
        return 0;
}
Lors de la compilation du programme, tous les fichiers "cpp" contenus dans le projet (d'où l'importance du projet) vont être compilés, et chaque fichier va générer un fichier en code objet, comme nous l'avons vu plus haut. Le linker va avoir pour rôle d'unifier tous les fichiers sources dans un fichier exécutable. Après tout cela, vous aurez un fichier exécutable contenant votre programme, que vous pourrez en suite lancer pour exécuter le programme. Cependant, nous verrons comment faire tout ça dans quelques lignes. Le plus important est de savoir que votre fichier "main.cpp" contient pour l'instant le code source de votre programme.

En général, les IDEs offrent une interface rendant tout cela très simple. Il y a souvent 3 boutons différents : compiler le projet, lancer la dernière version compilée du projet ou compiler puis lancer le projet. Le bouton lancer est en général un triangle vert, là où le bouton compiler est soit un petit marteau soit un engrenage. Il peut aussi existe un bouton permettant de recréer tous les fichiers objets si nécessaire, à utiliser si vous modifier un fichier qui n'est pas présent dans le projet (ce qui est néanmoins déconseillé). Vous pouvez aussi choisir dans quelle version compiler le projet, grâce à une petit boite de texte, contenant en général "Debug" et "Realase". Il s'agit de 2 façons différentes de compiler le code. "Debug" permet d'utiliser un outil inclu dans MinGW, nommé le "déboggueur", pour tracer d'éventuelles erreurs provoquant un crash dans votre code. L'exécutable final est cependant beaucoup plus lourd à stocker. "Release" ne permet pas d'utiliser cette outil, mais offre une version de l'exécutable adapté à la distribution. L'exécutable final est par conséquent beaucoup moins lourd et beaucoup plus rapide. Il est conseillé d'utiliser le "Debug" tant que votre code est en production. Pour lancer le code, utilisez "Compiler puis lancer le projet", et votre code se lancera tout seul grâce à l'IDE.

Dés que tout cela est fait, nous pouvons commencer les choses sérieuses.