Cycle de vie d’un programme#
Revenons à la recette de la mousse au chocolat#
Est-ce bien un programme ?
Pour répondre à cette question, revenons à la définition :
Définition : 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.
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
« Préparer une mousse au chocolat »
Trop abstrait et non informatif
« avec deux cuillères d’eau »
Ambigu : c’est combien une cuillère ?
« Zwei Eiweiß in Eischnee schlagen »
Dans quelle langue ?
Cela nous amène naturellement à la question suivante :
Quelles sont les instructions compréhensibles par un ordinateur ?
Au commencement était l’assembleur#
Définition : Assembleur
L” assembleur est le langage que comprend directement l’ordinateur. Chaque instruction correspond à une opération élémentaire que peut effectuer le processeur.
Exemple
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)
Voyons cet exemple de plus près.
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.
Cycle de vie d’un programme#
Motivation#
Ce que je veux :
« Calculer la puissance quatrième d’un nombre »
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)
...
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.
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.
Problème
« Calculer la puissance quatrième d’un nombre »
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 »
Recherche d’un algorithme
Comment on résout le problème ?
Quel traitement appliquer à l’entrée pour obtenir la sortie désirée ?
On note que \(x^4=x * x * x * x = (x^2)^2\)
Cela nous donne un algorithme :
calculer \(x*x\)
prendre le résultat et faire de même
Digression : La notion d’algorithme#
Définition : 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
Quelle différence entre un algorithme et un programme ?
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
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 !
Écriture d’un programme :
En assembleur ???
Trop détaillé
Non portable
Illisible pour l’humain !
En C++ :
Entrée :
int x = 3;
Traitement :
int xCarre = x * x;
int xPuissanceQuatre = xCarre * xCarre;
Sortie :
xPuissanceQuatre
Niveaux de langages de programmation#
Langage machine (binaire) :
Un programme y est directement compréhensible par la machine
Langage d’assemblage (ou assembleur) :
Un programme y est traduisible mot-à-mot en langage machine
Langage de programmation :
En général, un programme doit être transformé pour être compris par la machine
Comment faire cette transformation ? À la main ?
Transformer en binaire#
Les interpréteurs#
Exemple : interpréteur C++ dans Jupyter (xeus-cling) :
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
Exemples de langages de programmation avec un interpréteur : Basic, Javascript, LISP, Perl, Python, C++, …
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
Exemple :
Observez le contenu de puissance-quatre.s
, et retrouvez les
instructions assembleur étudiées plus haut.
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, …
Exécution et mise au point#
Exécuter le programme
Autant de fois que l’on veut !
Tester que le programme fonctionne
En n’oubliant pas les cas particuliers !!!
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)
À chaque fois, on reboucle sur l’étape de compilation, voire de conception, d’où le terme de cycle de vie.
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
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)
Suite#
Maintenant que nous avons clarifié la notion de compilation, vous êtes prêts pour la compilation séparée.