Paradigme – L’impératif

La programmation impérative est un style de programmation qui consiste à fournir une séquence d’instructions qui vont être exécutées les unes à la suite des autres et qui vont par ce biais entraîner la modification de l’état du programme. Ce style de programmation est celui qui est à l’heure actuelle le plus répandu, sûrement pour deux raisons principales :

  • Elle est très intuitive et accessible à l’homme car elle représente la manière classique d’exécuter une tâche dans la réalité (la réalisation d’une recette de cuisine par exemple).
  • Les processeurs des ordinateurs actuels fonctionnent principalement sur le principe d’exécution de suite d’instructions et sur la modification de l’état de la machine (état de la mémoire).

Le langage impératif de plus bas niveau est l’assembleur.

Exemple concret

A titre d’exemple, j’aimerais présenter ce petit cas de figure qui montre que nous sommes tous susceptibles de faire de la programmation impérative un jour ou l’autre dans notre vie même sans être développeur.

Le problème :

J’aimerais envoyer une boite de dix biscuits à chacun de mes amis pour Noël. J’ai dix amis au total et pour « simplifier », on va considérer qu’ils s’appellent tous Jack.

État du programme au départ :

  • 10 Boites
  • 100 Biscuits

Instructions du programme :

  1. Je prend une boite (j’en retire donc une du total)
  2. Je l’ouvre et je met 10 biscuit dedans (j’en retire donc 10)
  3. Je l’envoie à mon ami Jack
  4. Je répète l’opération tant qu’il reste assez de boîtes et assez de biscuits.

Avec l’exemple ci-dessus on comprends bien, je l’espère, comment fonctionne la programmation impérative. On effectue une liste d’actions qui vont modifier l’état du programme tout au long de son exécution. Ici le nombre de boites et de biscuits vont décrémenter par pas de 10 pour les biscuits et de 1 pour les boites à chaque répétition de l’opération.

Instructions impératives

On trouve quatre types principaux d’instructions impératives.

La séquence d’instruction

La séquence d’instruction est tout simplement une suite d’instruction exécutés à la suite les unes des autres.

Javascript


console.log('Bonjour');
console.log('Au revoir');

C++

printf("Bonjour");
printf("Au revoir");

Il s’agit d’une séquence de deux instructions effectués l’une après l’autre. L’ordre dans lequel les instructions sont écrite est très important car il s’agira de l’ordre d’exécution, ce qui n’est pas forcément le cas lors d’un traitement parallèle par exemple.

L’affectation

L’affectation est une instruction classique et centrale du paradigme impératif. Elle va permettre d’associer une valeur à une variable, c’est cette instruction qui va permettre la modification de l’état du programme.

Javascript


var a = 10;
a = a + 1;

C++

int a = 10 ;
a += a + 1 ;

Les branchements conditionnels

Le fameux branchement conditionnel, celui que j’aime le plus au monde au vu des programmes que j’ai pu côtoyer qui en débordaient de toute part. Rejoignez la campagne anti-if sur antiifcampaign.com ! Les branchements conditionnels permettent d’exécuter une séquence d’instruction ou une autre selon le résultat d’une condition. Il s’agit malheureusement dans la plupart des cas d’une véritable horreur utilisée à tort et à travers pour tenter de répondre à toutes les possibilités d’une situation donnée. Le nombre de fois où j’ai pu voir des piles et des piles de if dans un programme pour tenter de gérer tout les cas possibles, rien que d’y penser ça me donne la nausée. Enfin bon, je l’avoue il est difficile de s’en passer dans certaines situation et dans certains langages, en fait il serait possible de se passer du if, else, else if… , mais difficile de se passer de la notion de conditionnel qui est le pilier central de la logique informatique et du calcul propositionnel.

En javascript, C et C ++ :

if (10 == 10) {
    console.log('normal'); // Ou printf pour C/C++
} else {
    console.log('bizarre...'); // Ou printf pour C/C++
}

Les boucles

Les boucles permettent d’effectuer une séquence d’instruction tant qu’une condition n’as pas été vérifiée. Je n’ai rien contre elle, même si elle contient une condition en son cœur, ce n’est pas de sa faute…

Javascript / C++

var i = 0; // Ou int à la place de var pour C++

while (true) {
    console.log(i); // Ou printf pour C++
    i++;
}

ou encore :

Javascript / C++

for (var i = 0 ; i < 10 ; i++) // ou int à la place de var pour C/C++
    console.log(i) ; // Ou printf pour C/C+

Les sauts

Gotooooo ! The best instruction in the world ! Vraiment laissez tomber cet article, foncez et faites du goto++ tout les autres langages sont hasbeen ! Non ? Bon, les sauts permettent de transférer l’exécution d’un point à un autre du programme, ils ne concernent pas que le goto mais je préférais vous en parler avant. Ils concernent aussi le break qui permet de quitter une boucle, éventuellement avec une étiquette, mais aussi les appels à une fonction, méthode, sous programme, module, etc… Ils sont donc essentiels à la programmation procédurale dont nous parlerons tout à l’heure.

Ce qu’il faut retenir du paradigme impératif

Ce paradigme autorise la mutabilité des variables (leur modification) et les effets de bords, le fait qu’une portion de code puisse avoir un comportement différent lorsqu’elle appelée à un moment différent ou dans un contexte différent.

Mutabilité

Le paradigme impératif étant basé sur les changements d’états autorise la modification des variables, on parle de mutabilité. C’est peut-être évident pour vous, mais sachez que certains langages n’acceptent pas la mutabilité des variables (Haskell par exemple). Mutabilité est un terme très large qui correspond dans notre exemple au fait qu’une valeur associée à un symbole donné peut-être modifié ou pour de l’impératif objet (paradigme impératif + paradigme objet) que l’état d’un objet peut être modifié (un de ses champs par exemple).

Exemple

C#

var a = 0;
a += 1;

L’opération ci-dessus est autorisée en programmation impérative mais proscrite dans un langage fonctionnel pur.

Effets de bords

En programmation impérative rien n’interdit l’introduction et l’utilisation des effets de bords, vous savez, le truc qui généralement fou la m… dans vos programmes ! En fait à partir du moment ou un programme accepte la modification de son état, il peut être soumis aux effets de bords. Les effets de bords se manifestent par le fait que l’exécution de deux portions de code identiques peuvent avoir un comportement différent selon le moment où elles sont utilisées et l’état général du programme ou du système à cet instant.

Cela est du au fait qu’une variable utilisée qui défini le comportement d’un processus peut être modifiée par un autre processus. Les effets de bords ne sont pas forcément négatifs, en fait ils sont même utilisé dans des tâches basiques tel que la lecture d’un fichier – pensez au readline – ou encore la fonction random, etc.

Exemple du readline :

C#

while ((var line = streamReader.ReadLine()) != null)
{
    Console.WriteLine(line);
}

Vous remarquerez que la fonction readline ne renvoie pas le même résultat à chaque appel, en effet, elle nous donne à chaque appel la ligne suivante si elle existe. Cette fonction utilise les effets de bords.

Exemple de random :

C#

var random = new Random();
var a = random.Next();
var b = random.Next();
...

La fonction random est une fonction à effet de bord : a chaque appel de la fonction, on obtiendra un nombre différent. Cela parce que cette fonction est basé soit sur un générateur utilisant des variables système constament modifié (par exemple l’heure) ou sur une variable interne qui permet de contrôler la position dans un flux de nombres pseudo-aléatoire générés en amont.

Les fonctions que l’on peut définir avec le paradigme impératif ne sont pas forcément des fonctions mathématiques au sens propre du terme. Une fonction mathématique est déterminée, pour des paramètres d’entrée X le résultat de sortie sera toujours Y, ici ce n’est pas forcément le cas.

C’est principalement par la mutabilité des variables et les effets de bords que le paradigme impératif se distingue du paradigme fonctionnel ou logique.


One thought on “Paradigme – L’impératif

Laisser un commentaire