Le tout premier code moderne
Quand on évoque l'histoire de l'informatique, on y trouve inévitablement la machine de Charles Babbage et les algorithmes de Ada Lovelace. On a aussi l'ENIAC, le premier ordinateur entièrement électronique et généraliste. Et éventuellement quelques autres entre les deux.
On évoque plus rarement la manière de coder sur ces machines car elles sont très éloignées de ce que l'on pratique aujourd'hui.
Alors, quel serait le premier code que l'on pourrait considérer comme moderne ?
L'évolution fondamentale des ordinateurs dans les années 40, c'est l'architecture de von Neumann. Elle est tellement fondamentale que la quasi totalité de nos ordinateurs ou téléphones actuels en dérive. C'est cette architecture, en fusionnant programme et données au sein d'un même adresssage, qui a induit la notion de jeu d'instruction d'un processeur.
Le livre ENIAC in Action raconte comment l'ENIAC, conçu avant que cette architecture devienne populaire, a évolué pour en intégrer les idées.
Le premier ordinateur conçu sur le modèle de von Neumann a été la Small-Scale Experimental Machine.
L'histoire s'est surtout intéressée à la première machine qui a exécuté un code depuis sa mémoire, par opposition à un code programmé par branchements et interrupteurs. Le débat ne semble toujours pas tranché entre la SSEM, longtemps considérée comme la première en juin 1948, et l'ENIAC, dont certaines recherches récentes montreraient que ses évolutions lui ont permis d'exécuter un programme depuis une mémoire dès mars 1948.
Mais pour ce qui est du code moderne, la situation est beaucoup plus claire. Les "programmes" de l'ENIAC, même en 1948, gardent une logique d'assemblage de componants électroniques. Le système de codage est avant tout un moyen de configurer de manière centrale l'ensemble des composants.
A l'inverse, le premier code de la SSEM ressemble fortement à ce que l'on pourrait écrire aujourd'hui en langage machine.
La machine est expérimentale. Elle n'a qu'un jeu de 7 instructions et une mémoire de 32 mots de 32 bits chacun. Sur les lignes du programme, les bits 13 à 15 codent l'instruction et les bits 0 à 4 l'adresse de l'opérande qui lui est associé.
On peut traduire en C de manière très directe le code exécuté. Il fait une recherche du plus grand diviseur premier d'un nombre entier.
1#include <stdio.h>
2int main() {
3 int m[32] = { 0 };
4 int a = 0;
5 m[21] = 1;
6 m[23] = -4537; // Nombre à factoriser (opposé)
7 m[24] = 4536; // Début de recherche des diviseurs
8debut: a = -m[24];
9 m[26] = a;
10 a = -m[26];
11 m[27] = a;
12retour22: a = -m[23];
13retour20: a = a - m[27];
14 if(a < 0) goto saut1;
15 goto retour20;
16saut1: a = a - m[26];1876955431857258924
17 m[25] = a;
18 a = -m[25];
19 if(a < 0) goto saut2;
20 goto stop;
21saut2: a = -m[26];
22 a = a - m[21];
23 m[27] = a;
24 a = -m[27];
25 m[26] = a;
26 goto retour22;
27stop: printf("Plus grand diviseur: %d\n", m[27]);
28 return 0;
29}
Évidemment, on ne code plus comme ça, mais ça reste une étape importante dans l'histoire de la programmation.
- C'est probablement un des premiers codes que l'auteur a pu programmer lui même pour l'exécuter. Sur l'ENIAC, c'était obligatoirement un travail d'équipe.
- C'est le premier code ayant été exécuté depuis une mémoire où la machine pouvait écrire.
- N'importe qui ayant une connaissance d'un code machine actuel peut le comprendre.