Voyage au pays du code
Un peu de spéléologie informatique
Un compteur électromécanique à disque.
- Allo ? International ExoCode and Co ?
- Yes ! heu... Oui ! Qu'y a-t-il pour votre service ?
- Ici la compagnie Inedis on voudrait transformer notre vieux compteur électromécanique en compteur digital.
- Digital ? Vous voulez dire numérique ? Parce que compter les kiloWatts-heure avec les doigts, heu...
- Oui enfin, est-ce que vous pouvez nous écrire le programme ?
- Pas de souci, on vous livre ça demain.


Alice, la patronne d'International ExoCode and Co raccrocha et se tourna vers Bob, le tout nouveau développeur apprenti stagiaire.

- Bob, on vient de décrocher le contrat du siècle. Dans deux heures, il faut que tu aies réalisé un compteur !
- Ok. Je vais faire mon jogging, et dès que je rentre du restau, je te fais ton compteur...


Pas sûr que ça se passe comme ça dans la vraie vie, pas sûr non plus que Bob soit un bon développeur, mais on ne va pas se formaliser, voyons plutôt son travail de plus près :

     Mettre le compteur à zéro
     Afficher le compteur
     Attendre une seconde
     Ajouter un au compteur
     Revenir à la deuxième ligne


Bien, mis à part le fait que Bob ne mesure pas la consommation électrique, mais se contente d'ajouter 1 kiloWatt-heure toutes les secondes d'une part et que, d'autre part, ce programme ne s'arrête jamais, si on part du principe que nos ordinateurs peuvent se programmer en langage naturel, ça tient la route.

L'organigramme de Bob
En réalité, programmer en langage naturel, ce que tentent de faire des langages comme Hypertalk, si ça paraît séduisant de prime abord, ça n'apporte pas grand-chose. Par contre, pour décrire ce que doit faire un programme sous forme d'organigramme ou pour écrire du pseudo-code très expressif comme le fait Bob, c'est assez pratique...

Il est effectivement plus réaliste d'avoir un langage plus dépouillé et où apparaissent clairement ce qui représente des valeurs (0, compteur...), ce qui représente des actions (Afficher, Attendre...) et ce qui représente les opérateurs (Affectations de valeur à des variables, additions, soustractions, comparaisons...) ainsi que l'ordre dans lequel le tout s'exécute. Débarrassés des articles et des prépositions, nos ordinateurs s'y retrouveront plus facilement. Par exemple :

     1) 0 => Compteur
     2) Afficher(Compteur)
     3) Attendre(1sec.)
     4) Compteur + 1 => Compteur
     5) Retour(Ligne 2)


Ronald Rivest a choisi les noms d'Alice et Bob pour illustrer des problèmes de cryptologie. Depuis, ces prénoms sont couramment utilisés comme personnages dans des exposés en informatique.
Vous l'avez compris, => veut dire ici affecter la valeur qui précède à la variable qui suit. Ce qui est entre parenthèses sont les paramètres nécessaires à chaque action (par exemple, l'action Afficher a besoin de savoir ce qu'il faut afficher, ici c'est la valeur du compteur). Le reste est limpide.

C'est limpide, mais on a introduit une lourdeur, le numérotage des lignes. Est-ce qu'on peut s'en passer ? Évidemment oui. Il suffit d'introduire une étiquette spécifique (ici on va l'appeler Actualiser) :

     0 => Compteur;
     Actualiser:
     Afficher(Compteur);
     Attendre(1sec.);
     Compteur + 1 => Compteur;
     Aller à Actualiser;


YOU'RE FIRED : Vous êtes viré !
Mc Fly dans Retour vers le futur.
Voilà, on a juste mis des points-virgules après chaque instruction donnée à la machine. Admirez ce programme qui va boucler sans jamais s'arrêter ce qui aura sans doute comme conséquence un joli plantage et le licenciement de Bob.

Évidemment, même si on a fait un peu évoluer le projet de Bob, ce programme est écrit dans un langage complètement inventé, il ne risque pas de fonctionner.

Tout d'abord, il est écrit en français et le français n'est pas la langue universelle en programmation. Ce serait plutôt l'anglais. Donc, on va le réécrire :
Mascotte officielle du langage PHP.


     0 => Compteur;
     Actualiser:
     print(Compteur);
     sleep(1sec.);
     Compteur + 1 => Compteur;
     goto Actualiser;

Comme vous le voyez, seules trois instructions ont été réécrites (print, sleep et goto) les variables et l'étiquette peuvent rester en français. Bonne nouvelle, non ? Ne reste plus qu'à faire quelques petits arrangements pour en faire un véritable programme par exemple en langage PHP :
Logo officiel du langage PHP.


  < ?php
     $compteur = 0;
       Actualiser:
     print "$compteur";
     sleep(1);
     $compteur++;
     goto Actualiser;
  ?>
Le programme en langage C


Il a fallu faire quelques petites modifications pour coller à la syntaxe du PHP. Notez que chaque langage de programmation a sa propre syntaxe comme vous pouvez le voir sur les encarts. Ici, le signe = sert à affecter des valeurs et ++ accolé après le nom d'une variable qui représente une valeur numérique lui ajoute 1 (ce qu'on appelle une incrémentation).

Le programme en langage Java
Et maintenant, si on demande à notre machine d'exécuter ce programme, il y a de fortes chances qu'elle ne va broncher d'une oreille. D'abord parce qu'elle n'en a pas, mais surtout, comme vous le savez, elle ne comprend que les 0 et les 1.

Le programme en langage Bash
Le travail de Bob, enfin, d'un développeur digne de ce nom (vous peut-être un jour), va en gros s'arrêter là. Ou presque. En réalité, il faudra générer du code plus élaboré et faire des tas de tests pour s'assurer que tout fonctionne, mais comme on est dans la fiction, on va dire que ce code est parfait et que Bob peut repartir faire son jogging.

Le programme en langage GO
À partir de là, on va faire subir à notre programme une transformation pour le rendre compréhensible par la machine. C'est le travail d'un logiciel particulier, appelé compilateur, qui va générer du "code machine". Rien de bien compliqué, il faut juste lui demander de compiler le fichier contenant notre programme.

Le programme en langage Python
Le seul problème c'est que ce compilateur va parfois vous dire qu'il ne peut pas le faire parce que vous avez programmé avec les pieds et qu'il y a des erreurs ici où là. Bon, ce n'est pas le cas ici, nous sommes au pays des bisounours et Bob est le meilleur programmeur de la planète.

Cette compilation va se faire de différentes manières selon les langages, c'est ce que nous verrons bientôt. En attendant, on compile. Cela va générer automatiquement des instructions en langage machine, c'est-à-dire des valeurs exprimées en octets ou en groupe d'octets.

Un être humain ayant du mal à lire ces groupes d'octets, même présentés en hexadécimal comme on l'a vu, une correspondance entre ce code et des expressions un peu plus lisibles en langage "assembleur" nous permettra de comprendre ce qu'il se passe. Par exemple :

 Instructions en assembleur  Significations
(Registre et pile sont des zones de mémoire gérées directement par le processeur)
 Équivalent en hexadécimal (h)   Équivalent en binaire 
 MOV AX, 00h   Place la valeur 0 dans le registre AX   B8h 00h  1011 1000
0000 0000
 Affiche:   Crée une étiquette, par exemple à l'adresse mémoire 05h       
 PUSH AX   Place la valeur du registre AX au-dessus de la pile   50h    0101 0000 
 INT 21h   Interruption affichant le contenu du dessus de la pile   CDh 21h  1100 1101
0010 0001
 MOV CX, 03E8h   Place la valeur 1000 dans le registre CX   B9h 03E8h  1011 1001
1110 1000
 PUSH CX   Place la valeur du registre CX dans la pile   51h   0101 0001 
 PAUSE   Pause selon le nombre de millisecondes inscrit sur le dessus de la pile   F3h 90h  1111 0011
1001 0000
 INC AX   Ajoute 1 à AX   40h  0100 0000
 JMP Affiche   Saut à l'adresse 05h   EBh 05h   0000 0101 

Un circuit additionneur
S = la somme A+B et C= la retenue éventuelle (Carry)
Notre machine va donc maintenant lire des instructions comme 1011 1000 (qui sont limpides pour elle) et, à partir de là, faire appel à des suites d'instructions plus basiques encore qui vont faire appel aux circuits logiques pour renvoyer les résultats.

Par exemple un circuit additionneur gérant la retenue qui sera bien utile pour le programme de Bob.

Si vous n'avez pas tout bien compris à ce stade, ce n'est pas grave du tout, d'autant plus qu'il s'agit d'un exemple fictif très simplifié qui ne fonctionnera pas. Comprendre les grandes lignes, c'est pour l'instant suffisant. Dans le prochain épisode, on va revenir au début de l'informatique, où les microprocesseurs comprenant des millions de transistors n'existaient pas et où les "programmeurs" devaient rentrer tous ces 0 et ces 1 à la main, hé oui !
Sommaire - Codez comme en 1950