Cycle de vie d’un programme#

Revenons à la recette de la mousse au chocolat#

Ingrédients

250 g de chocolat, 125 g de beurre, 6 œufs, 50 g de sucre, café

Étapes

  • 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

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 (assembly language) 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.

Exercice

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\)

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 :

  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.