Écrit en 1969 sur un mini-ordinateur délaissé des laboratoires Bell, Unix fait aujourd'hui tourner les serveurs d'Internet, tous les supercalculateurs, les Mac et, par Linux et Android, des milliards de téléphones. Cinq planches pour manipuler ses idées les plus durables, jusqu'à un vrai petit terminal où taper vos propres commandes.
En 1969, après l'abandon de Multics, Ken Thompson écrit un système minimal sur un PDP-7 ; Dennis Ritchie le rejoint, et en 1973 Unix est réécrit en langage C, ce qui le rend portable d'une machine à l'autre. AT&T, à qui la loi interdisait alors de vendre de l'informatique, le distribue pour presque rien aux universités, avec son code source. Des générations d'étudiants l'apprennent, le modifient et l'étendent : c'est la naissance de la famille Unix.
| Extension | Année | Ce qu'elle apporte |
|---|---|---|
| BSD (université de Californie, Berkeley) | 1977 | La mémoire virtuelle sur VAX, l'éditeur vi (1976), le shell csh, puis en 1983 les sockets et la première pile TCP/IP largement diffusée : Unix devient la machine d'Internet. |
| System V (AT&T) | 1983 | La version commerciale, base de Solaris, AIX et HP-UX. |
| X Window System (MIT) | 1984 | Des fenêtres affichables à travers le réseau. |
| Projet GNU (Richard Stallman) | 1983 | Récrire librement tous les outils d'Unix : compilateur gcc (1987), shell bash (1989). |
| Norme POSIX (IEEE) | 1988 | Une définition commune des appels système et des commandes, pour que les programmes passent d'un Unix à l'autre. |
| Linux (Linus Torvalds) | 1991 | Un noyau libre qui, avec les outils GNU, forme un Unix complet et gratuit. |
| macOS, iOS (Apple) | 2001, 2007 | Un Unix certifié (norme UNIX 03 pour macOS), bâti sur NeXTSTEP et BSD. |
| Android (Google) | 2008 | Le noyau Linux dans les téléphones. |
Unix crée un nouveau processus d'une façon surprenante, en deux temps. L'appel système fork() duplique le processus qui l'appelle : le parent et l'enfant, identiques, continuent tous deux juste après le fork ; seule la valeur rendue les distingue (0 dans l'enfant, le numéro de l'enfant, son PID, dans le parent). Puis exec() remplace le programme de l'enfant par un autre. Le parent attend la fin de l'enfant avec wait(). Tous les processus descendent ainsi du premier, init, de PID 1.
pid = fork();
if (pid == 0) { /* dans l'enfant */
execlp("ls", "ls", NULL); /* devenir ls */
} else { /* dans le parent : le shell */
wait(NULL); /* attendre la fin de ls */
}
for (int i = 0; i < n; i++)
fork();
printf("bonjour\n"); /* combien de « bonjour » ? */
fork et l'exec, l'enfant peut rediriger son entrée ou sa sortie vers un fichier ou un tube, sans que le programme lancé n'en sache rien. L'énigme montre la puissance du mécanisme : quelques lignes suffisent à multiplier les processus de façon exponentielle (la « bombe fork », qui peut saturer une machine). Pour que la duplication ne coûte rien, les Unix modernes ne recopient pas la mémoire : parent et enfant la partagent jusqu'à ce que l'un d'eux écrive, c'est la copie sur écriture.Une expression régulière décrit un ensemble de textes : . désigne n'importe quel caractère, * « zéro fois ou plus », + « au moins une fois », ? « facultatif », [0-9] un chiffre, | « ou », ^ et $ le début et la fin de ligne. En 1968, Ken Thompson publie une méthode pour les reconnaître très vite, en transformant l'expression en un automate qui avance d'un caractère à la fois. En 1973, il en tire la commande grep (de « g/re/p » : global, regular expression, print).
Beaucoup de moteurs récents (Perl, Python, Java, JavaScript) n'utilisent pas l'automate de Thompson mais le retour sur trace : ils essaient une possibilité, et reviennent en arrière en cas d'échec. Sur certains motifs, le nombre d'essais explose. L'exemple classique, publié par Russ Cox en 2007 : le motif a?ⁿaⁿ (n fois « a facultatif », puis n fois « a ») appliqué au texte aⁿ.
sed et awk d'Unix.La commande diff, écrite par Douglas McIlroy et James Hunt en 1976, compare deux fichiers ligne par ligne et dit quelles lignes ont été retirées (−) et ajoutées (+). Son principe : trouver la plus longue sous-suite commune aux deux fichiers, les lignes qui restent dans le même ordre. Tout le reste est un changement. On la calcule en remplissant un tableau, chaque case ne dépendant que de ses voisines de gauche, du haut et de la diagonale : c'est la programmation dynamique.
patch (Larry Wall, 1985). Ce couple diff-patch est le fondement de la collaboration sur le logiciel : les correctifs du noyau Linux circulent sous cette forme, et le gestionnaire de versions Git (Linus Torvalds, 2005), qui conserve l'historique de presque tout le code du monde, affiche ses différences avec le même algorithme amélioré.Unix compte le temps d'une façon très simple : le nombre de secondes écoulées depuis le 1ᵉʳ janvier 1970 à 0 h 00 UTC, l'« époque » Unix. Tous les fichiers, tous les journaux, tous les serveurs datent les événements ainsi. Pendant des décennies, ce nombre a été rangé dans un entier signé de 32 bits, qui ne peut pas dépasser 2³¹ − 1 = 2 147 483 647. Que se passe-t-il quand on atteint cette limite ?
Voici un petit shell qui imite Unix, avec un système de fichiers en mémoire. Il connaît une trentaine de commandes : ls, cd, pwd, cat, echo, mkdir, touch, rm, cp, mv, grep, wc, sort, uniq, head, tail, tr, chmod, ps, date, whoami, history, man… Il comprend les tubes | et les redirections > et >>. Tapez man pour la liste, ou relevez les défis ci-dessous : chacun est vérifié automatiquement (la démonstration, elle, ne compte pas).
fork et exec, ce que le compteur ci-dessus rappelle. Ces mêmes commandes fonctionnent à l'identique dans le terminal d'un Mac, d'un serveur Linux ou d'un téléphone Android : cinquante ans après, c'est la plus durable des interfaces informatiques.La grande majorité des serveurs web, des serveurs de noms (DNS) et des routeurs fonctionnent sous un système de la famille Unix, Linux ou BSD.
Depuis novembre 2017, les 500 supercalculateurs les plus puissants du monde (classement TOP500) tournent tous sous Linux.
Android (noyau Linux), iOS et macOS (héritiers de BSD) : la plupart des téléphones et une partie des ordinateurs personnels sont des Unix.
Box Internet, téléviseurs, voitures, centres de données du nuage : Linux s'est imposé partout où il faut un système fiable et modifiable.
Le terminal de la planche 5 est une imitation écrite en JavaScript : il reproduit le comportement de base des commandes, pas toutes leurs options.