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 :

Definition 69 (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#

Definition 70 (Assembleur)

L” assembleur est le langage que comprend directement l’ordinateur. Chaque instruction correspond à une opération élémentaire que peut effectuer le processeur.

Example 58

  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#

Definition 71 (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 :

  1. L’utilisateur saisit une instruction source

  2. L”interpréteur la convertit en succession d”instructions machine

  3. 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 :

  1. L’utilisateur saisit un programme source

  2. Le compilateur convertit tout le programme en un programme objet (écrit en binaire)

  3. 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

  1. Énoncé du problème

  2. Formalisation (quel est le problème précisément ?)

  3. Recherche d’un algorithme (comment résoudre le problème ?)

  4. Programmation (implantation)

  5. Interprétation / Compilation

  6. Exécution

  7. 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.