-
Nicolas M. Thiéry authoredNicolas M. Thiéry authored
- Cycle de vie d'un programme
- Revenons à la recette de la mousse au chocolat
- Oui, mais c'est quoi une instruction ?
- Au commencement était l'assembleur
- Cycle de vie d'un programme
- Motivation
- Cycle de vie d'un programme
- Digression : La notion d'algorithme
- Cycle de vie d'un programme : implantation
- Niveaux de langages de programmation
- Transformer en binaire
- Les interpréteurs
- Les compilateurs
- Exécution et mise au point
- Cycle de vie d'un programme : résumé
- Suite
jupytext:
text_representation:
extension: .md
format_name: myst
format_version: 0.13
kernelspec:
display_name: C++17
language: C++17
name: xcpp17
rise:
auto_select: first
autolaunch: false
centered: false
controls: false
enable_chalkboard: true
height: 100%
margin: 0
maxScale: 1
minScale: 1
scroll: true
slideNumber: true
start_slideshow_at: selected
transition: none
width: 90%
Cycle de vie d'un programme
Revenons à la recette de la mousse au chocolat
:::{admonition} Ingrédients :icon: false 250 g de chocolat, 125 g de beurre, 6 œufs, 50 g de sucre, café :::
:::{admonition} Étapes :icon: false
- Faire fondre le chocolat avec deux cuillères d'eau
- Ajouter le beurre, laisser refroidir puis ajouter les jaunes
- Ajouter le sucre et comme parfum un peu de café
- Battre les blancs jusqu'à former une neige uniforme
- Ajouter au mélange :::
+++ {"slideshow": {"slide_type": "fragment"}}
Est-ce bien un programme ?
+++ {"slideshow": {"slide_type": "fragment"}}
Pour répondre à cette question, revenons à la définition :
:::{prf:definition} Programme (rappel) Séquence d'instructions qui spécifie, étape par étape, les opérations à effectuer pour obtenir, à partir des entrées, un résultat, la sortie. :::
+++ {"slideshow": {"slide_type": "slide"}}
Oui, mais c'est quoi une instruction ?
Prenons quelques candidats :
- « Lever le bras de 10 cm, tendre la main vers la gauche,
prendre la casserole rouge, ... »
Trop détaillé, illisible, non portable
+++ {"slideshow": {"slide_type": "fragment"}}
- « Préparer une mousse au chocolat »
Trop abstrait et non informatif
+++ {"slideshow": {"slide_type": "fragment"}}
- « avec deux cuillères d'eau »
Ambigu : c'est combien une cuillère ?
+++ {"slideshow": {"slide_type": "fragment"}}
- « Zwei Eiweiß in Eischnee schlagen »
Dans quelle langue ?
+++ {"slideshow": {"slide_type": "fragment"}}
Cela nous amène naturellement à la question suivante :
Quelles sont les instructions compréhensibles par un ordinateur ?
+++ {"slideshow": {"slide_type": "slide"}}
Au commencement était l'assembleur
:::{prf:definition} Assembleur L'assembleur est le langage que comprend directement l'ordinateur. Chaque instruction correspond à une opération élémentaire que peut effectuer le processeur. :::
+++ {"slideshow": {"slide_type": "fragment"}, "tags": []}
:::{prf:example}
mov -0x1c(%rbp), %edx
mov -0x1c(%rbp), %eax
imul %edx, %eax
mov %eax, -0x18(%rbp)
mov -0x18(%rbp), %eax
imul -0x18(%rbp), %eax
mov %eax, -0x14(%rbp)
:::
+++ {"slideshow": {"slide_type": "fragment"}}
Voyons cet exemple de plus près.
:::{exercise}
Exécuter ce fragment d'assembleur en suivant les indications suivantes :
-
%eax, %edx
sont des registres (cases mémoire du processeur)
l'analogue des variables -
-0x14(%rbp), ..., -0x1c(%rbp)
: autres cases mémoire -
mov a, b
: copier le contenu de la case a dans la case b -
imul a, b
: multiplier le contenu de a par celui de b et mettre le résultat dans b - Initialiser le contenu de la case
%-0x1c(%rbp)
à 3 :::
+++ {"slideshow": {"slide_type": "fragment"}}
Vous avez réussi ? Bravo, vous pourrez dire que vous avez fait de l'assembleur ! Comme vous le constatez, rien de magique. Mais on est bien content de ne pas avoir à programmer tout le temps en assembleur.
+++ {"slideshow": {"slide_type": "slide"}}
Cycle de vie d'un programme
+++ {"slideshow": {"slide_type": "fragment"}}
Motivation
Ce que je veux :
« Calculer la puissance quatrième d'un nombre »
+++ {"slideshow": {"slide_type": "fragment"}}
Ce que l'ordinateur sait faire :
...
mov -0x1c(%rbp), %edx
mov -0x1c(%rbp), %eax
imul %edx, %eax
mov %eax, -0x18(%rbp)
mov -0x18(%rbp), %eax
imul -0x18(%rbp), %eax
mov %eax, -0x14(%rbp)
...
+++ {"slideshow": {"slide_type": "fragment"}}
Passer de l'un à l'autre ne va pas se faire tout seul. Il va falloir un peu de méthode.
C'est le cycle de vie d'un programme.
+++ {"slideshow": {"slide_type": "slide"}}
Cycle de vie d'un programme
Nous allons passer en revue les différentes étapes du cycle de vie d'un programme, partant d'un problème à résoudre jusqu'à un programme fonctionnel.
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Problème « Calculer la puissance quatrième d'un nombre » :::
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Formalisation
-
Spécification des entrées et des sorties
-
Scénario d'utilisation : « l'utilisateur saisit au clavier un nombre entier x ; l'ordinateur affiche la valeur de x^4 à l'écran » :::
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Recherche d'un algorithme
- Comment on résout le problème ?
- Quel traitement appliquer à l'entrée pour obtenir la sortie désirée ? :::
+++ {"slideshow": {"slide_type": "fragment"}}
On note que x^4=x * x * x * x = (x^2)^2
+++ {"slideshow": {"slide_type": "fragment"}}
Cela nous donne un algorithme :
- calculer x*x
- prendre le résultat et faire de même
+++ {"slideshow": {"slide_type": "slide"}}
Digression : La notion d'algorithme
:::{prf:definition} Algorithme
- Description formelle d'un procédé de traitement qui permet, à partir d'un ensemble d'informations initiales, d'obtenir des informations déduites
- Succession finie et non ambiguë d'opérations clairement posées :::
+++ {"slideshow": {"slide_type": "fragment"}}
Quelle différence entre un algorithme et un programme ?
+++ {"slideshow": {"slide_type": "fragment"}}
Un algorithme:
- doit toujours se terminer !
- est conçu pour communiquer entre humains
- est un concept indépendant du langage dans lequel il est écrit
+++ {"slideshow": {"slide_type": "slide"}}
Cycle de vie d'un programme : implantation
Et maintenant ?
L'algorithme s'adresse à un humain
On veut l'expliquer à un ordinateur ...
... qui est stupide ; et ne comprend pas le français !
+++ {"slideshow": {"slide_type": "fragment"}}
Écriture d'un programme :
En assembleur ???
- Trop détaillé
- Non portable
- Illisible pour l'humain !
+++ {"slideshow": {"slide_type": "fragment"}}
En C++ :
Entrée :
int x = 3;
Traitement :
int xCarre = x * x;
int xPuissanceQuatre = xCarre * xCarre;
Sortie :
xPuissanceQuatre
+++ {"slideshow": {"slide_type": "slide"}}
Niveaux de langages de programmation
+++ {"slideshow": {"slide_type": "fragment"}, "tags": []}
Langage machine (binaire) :
Un programme y est directement compréhensible par la machine
+++ {"slideshow": {"slide_type": "fragment"}, "tags": []}
Langage d'assemblage (ou assembleur) :
Un programme y est traduisible mot-à-mot en langage machine
+++ {"slideshow": {"slide_type": "fragment"}, "tags": []}
Langage de programmation :
En général, un programme doit être transformé pour être compris par la machine
+++ {"slideshow": {"slide_type": "fragment"}, "tags": []}
Comment faire cette transformation ? À la main ?
+++ {"slideshow": {"slide_type": "slide"}}
Transformer en binaire
+++ {"slideshow": {"slide_type": "fragment"}}
Les interpréteurs
Exemple : interpréteur C++ dans Jupyter (xeus-cling) :
+++ {"slideshow": {"slide_type": "fragment"}}
Chaîne de production :
- L'utilisateur saisit une instruction source
- L'interpréteur la convertit en succession d'instructions machine
- Le processeur exécute les instructions
+++ {"slideshow": {"slide_type": "fragment"}}
Exemples de langages de programmation avec un interpréteur : Basic, Javascript, LISP, Perl, Python, C++, ...
+++ {"slideshow": {"slide_type": "slide"}}
Les compilateurs
Exemple : compilation en C++ :
- Programme source :
puissance-quatre.cpp
- Compilation :
clang++ puissance-quatre.cpp -o puissance-quatre
- Programme objet (ou binaire) :
puissance-quatre
- Exécution :
./puissance-quatre
- Fabrication de l'assembleur :
clang++ -S puissance-quatre.cpp
- Programme en assembleur :
puissance-quatre.s
+++ {"slideshow": {"slide_type": "fragment"}}
Exemple :
Observez le contenu de puissance-quatre.s
, et retrouvez les
instructions assembleur étudiées plus haut.
+++ {"slideshow": {"slide_type": "fragment"}}
Chaîne de production :
- L'utilisateur saisit un programme source
- Le compilateur convertit tout le programme en un programme objet (écrit en binaire)
- L'utilisateur lance l'exécution du programme objet
Exemples de langages de programmation avec un compilateur : ADA, C, C++, FORTRAN, Java, Pascal, ...
+++ {"slideshow": {"slide_type": "slide"}}
Exécution et mise au point
:::{admonition} Exécuter le programme
- Autant de fois que l'on veut ! :::
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Tester que le programme fonctionne
- En n'oubliant pas les cas particuliers !!! :::
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Mise au point
- Correction d'erreurs
- Optimisation du programme (consommation de ressources: temps, mémoire, énergie, ...)
- Optimisation de l'algorithme
- Amélioration du programme (lisibilité, généralisation) :::
+++ {"slideshow": {"slide_type": "fragment"}}
À chaque fois, on reboucle sur l'étape de compilation, voire de conception, d'où le terme de cycle de vie.
+++ {"slideshow": {"slide_type": "slide"}}
Cycle de vie d'un programme : résumé
Passer d'un problème à résoudre que l'on a en tête à un programme exécutable par l'ordinateur est un grand saut. Heureusement, on peut s'appuyer sur un peu de
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Méthodologie
- Énoncé du problème
- Formalisation (quel est le problème précisément ?)
- Recherche d'un algorithme (comment résoudre le problème ?)
- Programmation (implantation)
- Interprétation / Compilation
- Exécution
- Mise au point (test, débogage, optimisation, diffusion) :::
+++ {"slideshow": {"slide_type": "skip"}}
Suite
Maintenant que nous avons clarifié la notion de compilation, vous êtes prêts pour la compilation séparée.