Cet article sur le paradigme impératif structuré est la suite de l’article sur les Paradigmes de programmation.

Quelques exemples

Si le paradigme impératif structuré est pratiqué par les humains depuis très très longtemps… Dans les faits, on part d’un état initial. Par conséquent, on applique une succession d’instructions qui chacune va modifier l’état jusqu’à obtenir le résultat souhaité.

Recette de cuisine

recette de cuisine

En effet, une recette de cuisine est un excellent exemple du paradigme impératif : on part d’un état (les ingrédients) et chaque instruction modifie l’état.

Donner un itinéraire

Quand un passant vous demande son chemin et que vous lui indiquer, alors :

  • Avant tout, aller tout droit dans cette direction
  • Deuxièmement, tourner à gauche à la deuxième intersection
  • Aussi, poursuivre jusqu’au rond-point
  • Puis prendre la seconde sortie
  • Enfin avancer sur 30m, vous êtes arrivés

C’est donc un algorithme impératif ! 😊

Notice de montage de meuble

notice de montage de meuble

Quant à chaque étape du montage, on exécute une instruction qui modifie l’état du meuble. C’est une forme de programmation impérative.

Paradigme impératif : Principes

De fait, La grande majorité des processeurs, qui équipent les ordinateurs aujourd’hui, sont de nature impérative : ils sont faits pour exécuter une suite d’instructions élémentaires, codées sous forme d’opcodes (pour operation-codes). Par ailleurs l’ensemble des opcodes forme le langage machine spécifique à l’architecture du processeur. L’état du programme à un instant donné est défini par le contenu de la mémoire centrale à cet instant. C’est donc tout naturellement que les premiers langages qui ont été créés ont implémenté ce paradigme : par exemple FORTRAN en 1954…

Paradigme impératif : Catégories

Là-dessus, les langages de haut niveau (FORTRAN, C, etc…) ont cinq catégories d’instructions principales :

  • L’affectation ou assignation
  • La séquence d’instruction
  • L’instruction conditionnelle (si … alors … sinon … fin si)
  • La notion de boucle (tant que/pour chaque)
  • Les branchements

Voici ce que cela donnerait en langage algorithmique.

Paradigme impératif : Assignation/affectation

A ce sujet, cette opération sert à changer l’état du programme en stockant une information en mémoire en vue d’en faire un usage ultérieur. En langage algorithmique on écrirait :

x <- 3
y <- 2 * x

On commence par stocker la valeur 3 dans l’emplacement mémoire nommé x. Puis on calcule deux fois x et on stocke le résultat dans y.

Paradigme impératif : Instruction conditionnelle

Ces instructions permettent de n’exécuter des instructions que si une condition prédéterminée est réalisée. Il y a plusieurs formes possibles :

  • si condition alors
        (instructions1)
    fin si

  • si condition alors
        (instructions1)
    sinon
        (instructions2)
    fin si

  • si condition1 alors
        (instructions1)
    sinon si
    condition2 alors
        (instruction2)

    sinon si
    conditionn alors
       
    (instructionn)
    sinon
       
    (instructionn+1)
    fin si

Paradigme impératif : Instruction de bouclage

Elles permettent de répéter un nombre prédéterminé de fois une séquence d’instructions. Il y a plusieurs formes disponibles même si elles ne sont pas forcément supportées par tous les langages.

  • tant que condition faire
        (instructions1)
    fin tant que

  • pour i de 1 à n faire
        (instructions)
    fin pour

  • pour chaque x dans séquence faire
        (instructions)
    fin pour

  • répéter
        (instructions)
    jusqu’à
    condition

Paradigme impératif : Branchement inconditionnel

Ce type d’instruction permet alors de quitter la séquence d’instructions courantes pour sauter à un autre endroit du programme. Les GOTO/GOSUB ont fait les joies et les nœuds au cerveau des développeurs BASIC : l’apogée de la programmation spaghetti. Quand à lui, l’appel de fonction n’est rien d’autres qu’un passage d’arguments avec 2 branchements inconditionnels (un aller et un retour)…

Bien que toujours disponible en C, l’instruction goto est à éviter pour écrire du code propre…

Paradigme impératif : Histoire

C’est le premier paradigme qui a été implémenté dans les compilateurs/langages. Nous allons donc parler de ceux qui ont le plus marquer l’histoire de l’informatique.

  • Fortran (1954)
    D’une part, John Backus a développé Fortran (FORmula TRANslator) pour IBM. Fortran est dédié au calcul et après plusieurs normes (77, 90 et 2005) il est en effet toujours employé pour le calcul intensif.
  • Algol (1958)
    Ce langage a été développé par un consortium américano-européen pour concurrencer Fortran (qui était propriétaire). Ce langage fut également à l’origine de nombreux autres langages.
  • Cobol (1959)
    Développé par Grace Murray Hopper (militaire américaine) qui a aussi développé le premier compilateur, il est principalement dédié aux applications de gestion. Il est toujours utilisé sur les gros systèmes des banques de détails.
  • Basic (1963)
    Conçu comme une version simplifiée du Fortran pour permettre l’apprentissage de la programmation. Il a d’ailleurs été déployé dans les premiers micro-ordinateurs disponibles pour les particuliers. J’ai, moi-même, appris à programmer sur le Super-Basic du Sinclair QL en 1984. Malheureusement, la pauvreté des branchements a entraîné l’usage intensif de la programmation spaghetti rendant les codes peut évolutifs et maintenables. Un article de Edsger Dijkstra a dénoncé les ravages causés par ce langage et entraîné son abandon au profit du Pascal.
  • C (1969)
    Inventé pour servir à développer le système d’exploitation Unix au sein des laboratoires Bell par Dennis Ritchie. Il a été conçu pour rester proche du matériel grâce notamment à sa gestion des pointeurs.
  • Pascal (1970)
    Niklaus Wirth a développé ce langage pour enseigner la programmation structurée et modulaire aux étudiants. Il n’a pas percé dans l’industrie mais a été utilisé pour faire des applications de gestion. M. Wirth a dérivé Pascal en Modula-2, Modula-3 et Oberon.
  • Ada (1971)
    Langage développé par une équipe française pour répondre à un cahier des charges du département de la défense américaine, il est extrêmement sécurisé et utilisé en aéronautique par exemple. Il a popularisé la généricité et le multi-tâches temps-réel.

Paradigme impératif : Organigramme

Voici alors un exemple de représentation graphique d’un algorithme de calcul de PGCD pour un programme en BASIC.

représentation graphique d’un algorithme de calcul PGCD

Dès que l’algorithme devient un peu complexe, ce type de représentation est inadaptée.

Paradigme impératif : Avantages & défauts

Enfin, ce paradigme étant très utilisé dans de nombreux pans de nos vies (cuisine, etc…), il est le plus simple à comprendre et à utiliser. Cependant si les appels de fonctions sont disponibles, ce paradigme ne permettait pas de résoudre la récursivité : les parcours d’arbres ou les algorithmes sur les graphes sont donc difficile à résoudre.

Pour aller plus loin, découvrez la comparaison des langages de programmation multi-paradigmes