Algorithme simplifié avec branchement (Figure 1)
Avant de parler des spaghettis, revenons un peu en arrière. On a vu dans l'algorithme du Pandv qu'il y avait des branchements un peu partout. Ces branchements
indiquaient au programme de partir dans une direction ou dans une autre selon qu'une condition était remplie ou non. Un petit exemple simplifié est reproduit ici à la
figure 1.
Par contre, si vous vous souvenez du programme de Bob, vous admettrez que son compteur aurait bien besoin d'une petite amélioration du genre :
Si le compteur indique 99999
(en supposant que ce soit le maximum que l'on puisse afficher) et qu'il faut l'augmenter d'une unité,
alors on le fait passer à zéro,
sinon, on l'augmente d'une unité.
Remontons encore. Dans la page "
Le premier ordinateur", Konrad Zuse n'a pas eu le titre parce que son Zuse 3 ne disposait pas des branchements conditionnels. Son appareil
ne répondait donc pas aux critères nécessaires pour être une machine de Turing.
Et enfin, si on remonte à la page sur George Boole, on retrouve notre fameuse logique qui part de "Si la condition A est vraie alors l'action S est réalisée" et
qui peut se compliquer sous la forme "Si A et B alors S", "Si A ou B alors S", etc.
Tout cela nous amène à penser qu'il est important de pouvoir faire prendre à nos ordinateurs des chemins différents en fonction des circonstances.
Ces circonstances formeront un ensemble plus ou moins complexe de conditions réalisées ou non, autrement dit, selon la logique booléenne, vraies ou fausses.
Bref, vous l'avez compris, pouvoir réaliser des branchements conditionnels est primordial pour réaliser des programmes qui tiennent la route comme notre fabuleux Pandv.
Laissons de côté l'époque où ces branchements devaient être inscrits manuellement dans les circuits des ordinateurs et regardons comment le langage FORTRAN (développé à
partir de 1954 et doté d'un compilateur) va se débrouiller avec ces traitements logiques.
Mini dico pour les non-anglophones
Avec ce langage, les "lignes de codes" sont des informations codifiées en binaire sur des cartes perforées. Ces lignes sont numérotées. Le programme peut donc effectuer
des sauts à tel ou tel "numéro de ligne" ou "étiquettes". Par ailleurs, comme le FORTRAN était principalement utilisé pour les calculs scientifiques, ses premières versions se sont
contentées de traiter des branchements selon des conditions arithmétiques simples.
Par exemple, si on compare deux valeurs A et B, il y a trois possibilités : A est plus grand que B, B est plus grand que A, A est égal à B et c'est tout.
Ceci s'écrira avec la première version du langage FORTRAN :
IF (A-B) 10 20 30
Le programme ainsi écrit continuera à l'étiquette 10 si le résultat de A-B est négatif, à l'étiquette 20 si A-B est égal à zéro et à l'étiquette 30 si A-B est positif.
Bon, il va falloir améliorer ça, parce que ce n'est pas très pratique pour réaliser notre programme de Pandv !
Ce sera chose faite dès 1960 avec le langage Algol qui va apporter une plus grande souplesse comme on peut le voir sur l'illustration, figure 2 :
Branchement conditionnel en Algol60 (Figure 2)
Remarquez les blocs entre begin et end qui remplacent les sauts vers les étiquettes du FORTRAN. L'intérêt de cette façon de faire est un code beaucoup plus lisible.
Ce sera repris pratiquement par tous les langages (sauf en particulier certaines versions du langage BASIC). Avec bien sûr des différences de syntaxe comme
les accolades { } en lieu et place de begin... end, le signe == comme opérateur d'égalité, l'utilisation de elsif ou elif et d'autres subtilités comme les parenthèses
nécessaires pour traiter des situations complexes, par exemple :
if ((A>B) and (C>D) or (E=F)) ...
Ou encore pour traiter des situations ambiguës comme :
Si A alors si B alors instruction 1 sinon instruction 2...
qui peut être compris comme
Si A alors
(si B alors instruction 1
) sinon instruction 2
ou bien
si A alors
(si B alors instruction 1 sinon instruction 2
)
Chaque langage résoudra à sa manière cette ambiguïté connue sous le nom de problème du "dangling else".
Une autre subtilité consiste, par exemple, à différencier la valeur 0 du caractère 0. La "valeur" 0 vaudra évidemment 0000 0000 en binaire (0 en décimal), mais le
"caractère" 0 vaudra 0011 0000 (48 en décimal). Certains langages, comme le PHP, voudront considérer parfois que les deux sont équivalents et parfois non. Pour cela
ils utiliseront l'opérateur == pour une égalité au sens large et la triple égalité === pour une équivalence stricte, même valeur et même type de donnée.
Un BASIC appétissant, mais peu lisible.
Pas sympa pour les néophytes !
Il y aurait encore bien d'autres choses à dire sur les branchements, ainsi que sur les instructions du genre "Switch" qui viennent au secours du programmeur quand il a à traiter une série
complexe de IF THEN ELSE IF... mais comme ExoCode n'est pas un cours, mais une balade à travers l'histoire du code informatique, on va s'arrêter là.
Au fait, les spaghettis, on a failli les oublier : revenons pour finir à notre BASIC (Beginner's All-purpose Symbolic Instruction Code).
Créé pour que les non-scientifiques puissent se servir d'un ordinateur à partir du milieu des années 1960, le BASIC s'inspirait beaucoup du FORTRAN et certaines
versions avaient repris en partie sa structure des branchements conditionnels, y compris dans les années 1980.
Ces versions n'acceptaient après un IF (condition...)
que l'instruction GOTO pour un simple saut à une ligne numérotée. Cela donnait du code assez peu lisible et, par dérision, on a appelé cette façon de coder la
programmation spaghetti. Bon appétit si vous codez encore dans ce genre de BASIC...