Un ordinateur moderne est bien trop compliqué pour être compris d’un seul bloc. Un téléphone exécute des applications écrites dans des langages comme Swift ou Kotlin, qui deviennent des instructions machine, qu’un processeur exécute avec des milliards de transistors, qui fonctionnent grâce au comportement des électrons dans le silicium. Personne ne pense à tout cela en même temps. On découpe plutôt la machine en niveaux d’abstraction : chaque niveau offre un ensemble d’objets et d’opérations, et cache la façon dont le niveau inférieur les réalise.
Tout ce site est organisé ainsi. Ce chapitre explique l’idée, compare les niveaux du site au modèle classique à six niveaux, et raconte brièvement comment ces niveaux sont apparus.
Langages, niveaux et machines virtuelles
Tout part d’un problème simple. Le matériel ne sait exécuter que son propre langage machine, appelons-le L0, commode pour des circuits et pénible pour des humains. On invente donc un langage plus agréable, L1. Il y a deux façons d’exécuter un programme L1 sur une machine L0 :
- la traduction : convertir d’abord tout le programme L1 en un programme L0 équivalent, puis exécuter celui-ci. C’est ce que font un compilateur ou un assembleur ;
- l’interprétation : écrire un programme L0, l’interpréteur, qui lit le programme L1 comme une donnée et exécute ses instructions une à une.
Dans les deux cas, le plus simple est de faire comme s’il existait une machine dont le langage natif est L1 : une machine virtuelle, M1. Les programmeurs écrivent pour M1 sans se soucier de savoir s’il y a en dessous de vrais circuits, un interpréteur ou un traducteur. On peut ensuite bâtir L2 sur L1, L3 sur L2, et ainsi de suite. Chaque langage définit une machine, et chaque machine définit un langage.
Le chapitre sur les langages compilés et interprétés montre les deux techniques, et les compilateurs JIT qui les mélangent, sur du vrai code.
Deux autres termes méritent d’être retenus. L’architecture d’un niveau est ce que son utilisateur voit : ses types de données, ses opérations, ses fonctionnalités. L’implémentation est la façon dont il est construit, que l’utilisateur ne devrait pas avoir besoin de connaître. Et le système d’exploitation a d’abord été un niveau à part entière : ses appels système sont des instructions supplémentaires que le matériel n’a pas, exécutées par le noyau, comme l’explique le chapitre sur les appels système.
Six niveaux classiques, dix sur ce site
Une façon classique de décrire un ordinateur utilise six niveaux, numérotés à partir du bas. Ce site en utilise dix, numérotés selon leur profondeur depuis l’utilisateur. Le tableau les met en regard :
| Ce site (profondeur) | Niveau classique | Comment le niveau du dessus est pris en charge |
|---|---|---|
| 0. Applications et utilisateur | - | - |
| 1. Problèmes et algorithmes | - | - |
| 2. Langages de programmation | 5. Langage orienté problème | traduit par un compilateur (ou interprété) |
| 3. Langage d’assemblage | 4. Langage d’assemblage | traduit par un assembleur |
| 4. Système d’exploitation | 3. Machine du système d’exploitation | interprété en partie par l’OS |
| 5. Architecture du jeu d’instructions | 2. ISA | interprété par le microcode, ou exécuté directement |
| 6. Microarchitecture | 1. Microarchitecture | réalisé par le matériel |
| 7. Logique numérique | 0. Logique numérique | - |
| 8. Composants et puces | sous les six : le niveau des composants | - |
| 9. Physique du calcul | sous les six : la physique du solide | - |
Les six niveaux du milieu sont les six classiques, dans le même ordre. Les différences sont aux deux bouts, et dans la numérotation :
- Numérotation par profondeur. Le modèle classique compte à partir du matériel, parce que c’est ainsi que la machine se construit. Ce site compte à partir de l’utilisateur, parce que c’est ainsi qu’un lecteur arrive : on part de quelque chose qu’on utilise tous les jours, et on zoome.
- Deux niveaux au-dessus. Les applications et les algorithmes ne sont pas des machines virtuelles dotées d’un langage propre, au sens strict. Ce sont des niveaux de description : ce que l’utilisateur voit et fait, et la méthode pas à pas qu’un programme suit avant d’être écrit dans un langage quelconque. Ce site les ajoute parce que la question « que se passe-t-il vraiment quand je clique ? » commence à cet endroit.
- Deux niveaux en dessous. Le modèle classique s’arrête aux portes logiques et laisse les transistors à l’électronique et à la physique. Ce site descend plus bas, jusqu’à la façon dont un transistor commute et dont un bit est physiquement stocké, parce que c’est de là que viennent les limites de vitesse et de consommation.
Le site a aussi ce parcours Fondamentaux, qui n’est pas un niveau : le binaire, le complément à deux, la virgule flottante, les codes de caractères, l’ordre des octets, la correction d’erreurs et les unités servent à tous les niveaux, ils sont donc expliqués une fois pour toutes ici.
Matériel et logiciel sont équivalents
Une idée centrale de l’organisation des ordinateurs est que le matériel et le logiciel sont logiquement équivalents. Toute opération faite en logiciel pourrait être câblée en matériel, et toute instruction matérielle peut être simulée en logiciel. L’emplacement de la frontière est une affaire de coût, de vitesse et de fréquence des changements.
Cette frontière a souvent bougé. Les premiers ordinateurs des années 1940 n’avaient que deux niveaux : le langage machine et les circuits qui l’exécutaient. En 1951, Maurice Wilkes proposa d’en ajouter un entre les deux : un petit interpréteur figé à l’intérieur du CPU, le microprogramme, qui exécuterait chaque instruction machine comme une suite d’étapes plus simples, ce qui simplifiait le matériel. Dans les années 1970, presque toutes les grandes machines étaient microprogrammées, et les jeux d’instructions enflaient, les concepteurs ajoutant des instructions simplement en étendant le microcode. Puis, dans les années 1980, les conceptions RISC supprimèrent le microprogramme et exécutèrent des instructions simples directement en matériel. Les puces x86 d’aujourd’hui font les deux : les instructions courantes sont décodées directement en opérations internes, et les rares instructions complexes passent par le microcode. Le chapitre sur le microcode suit cette histoire en détail.
Le simulateur du site illustre lui aussi cette équivalence : c’est un processeur x86-64 réalisé en logiciel, qui tourne dans votre navigateur.
Brève histoire
On découpe en général l’histoire des ordinateurs en générations selon la technologie de commutation. Les dates ci-dessous sont celles sur lesquelles les historiens s’accordent ; quelques erreurs souvent répétées sont corrigées après le tableau.
| Époque | Année | Jalon |
|---|---|---|
| Mécanique | 1642 | la machine à additionner de Blaise Pascal |
| années 1670 | la machine de Gottfried Leibniz, qui multiplie et divise aussi | |
| années 1830 | Charles Babbage conçoit la machine analytique : magasin, moulin, programme sur cartes perforées, branchements conditionnels. Jamais achevée. | |
| 1843 | Ada Lovelace publie le premier programme écrit pour elle | |
| Relais | 1941 | le Z3 de Konrad Zuse, un calculateur programmable à relais qui fonctionne |
| 1944 | le Harvard Mark I de Howard Aiken | |
| Tubes à vide | 1943–44 | Colossus, le premier ordinateur numérique électronique, construit en secret en Grande-Bretagne |
| 1945 | l’ENIAC est terminé : 18 000 tubes, programmé en recâblant | |
| 1945 | le rapport de John von Neumann sur l’EDVAC décrit l’architecture à programme enregistré | |
| 1948 | le « Baby » de Manchester exécute le premier programme enregistré | |
| 1949 | l’EDSAC, premier ordinateur à programme enregistré en service régulier | |
| Transistors | 1947 | invention du transistor aux Bell Labs |
| 1956 | le TX-0 du MIT, un des premiers ordinateurs à transistors | |
| 1959–60 | le PDP-1 de DEC, premier mini-ordinateur | |
| 1964 | le CDC 6600, premier superordinateur, avec des unités de calcul parallèles | |
| Circuits intégrés | 1958–59 | Jack Kilby et Robert Noyce inventent le circuit intégré, chacun de leur côté |
| 1964 | l’IBM System/360 : première famille de machines compatibles à des prix différents | |
| 1965 | le PDP-8 de DEC, premier mini-ordinateur grand public | |
| VLSI | 1971 | l’Intel 4004, premier microprocesseur sur une seule puce, 2 300 transistors |
| 1976 | le superordinateur vectoriel Cray-1 | |
| 1981 | l’IBM PC, construit autour de l’Intel 8088 | |
| 1985 | l’Intel 80386 (x86 32 bits) ; le premier processeur ARM d’Acorn | |
| 1995 | Pentium Pro : l’exécution dans le désordre arrive sur le PC | |
| 2001 | IBM POWER4, première puce de processeur double cœur | |
| 2003 | AMD64 étend le x86 à 64 bits | |
| 2007 | iPhone : début de l’ère du smartphone | |
| 2020 | Apple M1 : les Mac passent du x86 à ARM | |
| 2022 | Frontier, premier superordinateur à dépasser 10¹⁸ opérations par seconde sur le test de référence |
Quelques détails de cette histoire sont souvent racontés de travers :
- Colossus n’a pas été construit pour casser les messages Enigma, et Alan Turing ne l’a pas conçu. Il s’attaquait à un autre chiffre, le chiffre Lorenz des téléscripteurs du haut commandement allemand, et il a été conçu par un ingénieur des Postes, Tommy Flowers. Enigma était attaquée avec des machines électromécaniques appelées bombes, que Turing a bien contribué à concevoir.
- Le Z1 (1936–38) est parfois présenté comme la première machine à relais. Il était entièrement mécanique ; la machine à relais de Zuse était le Z3, de 1941.
- L’EDSAC (1949) est parfois présenté comme le premier ordinateur à programme enregistré. Le Baby de Manchester en a exécuté un un an plus tôt, en juin 1948 ; l’EDSAC fut le premier utilisé pour un travail régulier.
- Le transistor a été annoncé en 1948, mais il a été démontré pour la première fois en décembre 1947. Les deux inventions du circuit intégré ont un an d’écart : celle de Kilby date de 1958, la version planaire de Noyce de 1959.
- Le Cray-1 est parfois daté de 1974. Le premier exemplaire a été livré en 1976.
La loi de Moore, et la suite
En 1965, Gordon Moore observa que le nombre de composants sur une puce doublait chaque année. En 1975, il corrigea : tous les deux ans. La version populaire, « tous les 18 mois », ne correspond à aucun des deux chiffres de Moore.
La version à deux ans a remarquablement tenu. L’Intel 4004 de 1971 comptait 2 300 transistors ; l’Apple M2 Ultra, la puce de l’ordinateur sur lequel ce chapitre a été écrit, sorti en 2023, en a 134 milliards. C’est un facteur d’environ 58 millions, soit 25,8 doublements en 52 ans : un doublement tous les 2,0 ans.
Ce qui a cessé de croître, c’est l’horloge. Jusqu’au début des années 2000, des transistors plus petits pouvaient aussi commuter plus vite à tension plus basse, si bien que chaque génération gagnait une horloge plus rapide pour la même consommation. Vers 2005, c’est fini : la tension ne pouvait plus baisser sans que les transistors fuient, et les puces atteignaient la limite de la chaleur qu’elles peuvent évacuer. Depuis, les fréquences plafonnent autour de 3 à 6 GHz. Les transistors supplémentaires sont allés dans davantage de cœurs, des caches plus grands et des unités spécialisées : GPU, accélérateurs de réseaux de neurones, encodeurs vidéo. Le passage au multicœur était déjà net au début des années 2010 ; la spécialisation est la partie plus récente.
Le zoo des ordinateurs, hier et aujourd’hui
Un « zoo des ordinateurs » classique range les machines par prix, d’une puce à 0,50 $ dans une carte de vœux à un mainframe à 5 millions de dollars. Les catégories ont toujours un sens, mais les exemples ont vieilli :
- Les microcontrôleurs se vendent toujours par milliards, pour quelques centimes pièce, et l’AVR 8 bits existe encore, même si des puces ARM Cortex-M 32 bits font désormais une bonne partie de ce travail.
- Consoles et téléphones. Les exemples du début des années 2010, la PlayStation 3, la Xbox 360 et les premières tablettes, sont obsolètes depuis longtemps. Les consoles actuelles de Sony et de Microsoft utilisent des puces x86 d’AMD, et les téléphones sont désormais plus nombreux que tout autre type d’ordinateur généraliste.
- Ordinateurs personnels. Le x86 a longtemps équipé presque tous les PC, Mac compris. Depuis 2020, les Mac utilisent les puces ARM conçues par Apple.
- Superordinateurs. Au début des années 2010, on les disait parfois en voie de disparition, remplacés par des grappes de serveurs ordinaires. Les plus grosses machines sont effectivement faites de nombreux nœuds de serveurs, mais elles ne disparaissent pas : les systèmes de tête dépassent désormais 10¹⁸ opérations par seconde, surtout grâce aux GPU.
- RFID. On a un temps attendu des puces RFID dans les billets en euros ; cela ne s’est jamais fait.
Ce site utilise trois architectures d’exemple : le x86-64 pour son simulateur, ARM64 pour ses mesures, et RISC-V, une ISA ouverte que chacun peut implémenter. Le chapitre x86, ARM et RISC-V raconte leur histoire.
À retenir
- Un ordinateur est une pile de machines virtuelles. Chaque niveau offre un langage ; ses programmes sont soit traduits vers le niveau inférieur, soit interprétés par un programme qui y tourne.
- Les six niveaux classiques (logique numérique, microarchitecture, ISA, machine du système d’exploitation, assembleur, langages orientés problème) sont les six niveaux du milieu parmi les dix de ce site. Ce site ajoute les applications et les algorithmes au-dessus, les composants et la physique en dessous, et numérote les niveaux par profondeur depuis l’utilisateur.
- Matériel et logiciel sont équivalents : l’emplacement de la frontière est un choix d’ingénierie, et il bouge sans cesse (microcode des années 1950 à 1970, RISC dans les années 1980, décodeurs hybrides aujourd’hui).
- Les générations suivent l’interrupteur : engrenages, relais, tubes à vide, transistors, circuits intégrés, VLSI.
- La loi de Moore a tenu à environ un doublement tous les deux ans, de 2 300 transistors en 1971 à 134 milliards en 2023 ; les fréquences ont cessé de monter vers 2005, et les transistors sont allés dans les cœurs et les unités spécialisées.
- Colossus s’attaquait au chiffre Lorenz, pas à Enigma ; le Baby de Manchester a exécuté le premier programme enregistré en 1948 ; le transistor date de 1947.