Dennis Ritchie a conçu un langage volontairement compact, assez proche
de la machine pour écrire un système d’exploitation, mais assez
indépendant du matériel pour déplacer ce système vers de nouveaux
ordinateurs. Cette combinaison a fait de C et d’Unix deux
fondations de l’informatique moderne.
Parler de Ritchie exige toutefois de distinguer les contributions. Il
est le principal concepteur de C. Unix naît d’un travail collectif aux
Bell Labs, initié par Ken Thompson et
développé avec Ritchie et d’autres ingénieurs. Leur histoire commune
montre comment un langage et un système d’exploitation peuvent se
transformer mutuellement.
Dennis MacAlistair Ritchie naît en 1941 à Bronxville, dans l’État de New
York. Il étudie la physique et les mathématiques appliquées à Harvard,
où il découvre les ordinateurs. En 1967, il rejoint le centre de
recherche informatique des Bell Labs.
Le laboratoire participe alors à Multics, ambitieux système de temps
partagé. Lorsque Bell Labs se retire du projet en 1969, Ken Thompson
expérimente un système plus petit sur un PDP-7. Avec Ritchie et leurs
collègues, ce travail devient Unix.
Les premières machines disposent de peu de mémoire et les logiciels
système sont souvent écrits en assembleur. Ce langage donne un contrôle
précis, mais attache le programme à une architecture. Changer
d’ordinateur oblige à réécrire une part importante du système.
De BCPL et B au langage C
Thompson adapte d’abord les idées de BCPL dans un langage nommé B.
Celui-ci convient à certaines tâches, mais son modèle sans types
s’accorde mal avec le PDP-11 et ses différents formats de données.
Ritchie fait évoluer B en ajoutant des types, puis conçoit le « New B »
qui devient C au début des années 1970.
C reste petit. Ses constructions correspondent assez directement à des
opérations qu’un processeur peut exécuter, tandis que les fonctions,
structures, pointeurs et types permettent d’organiser un programme sans
écrire chaque instruction en assembleur.
Un pointeur représente une adresse en mémoire. Ce mécanisme rend
possibles des programmes système efficaces et des structures de données
flexibles. Il ne protège cependant pas automatiquement contre les accès
hors limites, l’usage d’une zone libérée ou une mauvaise interprétation
des données. La force du langage et ses risques viennent en partie du
même choix : faire confiance au programmeur.
Unix réécrit en C
Vers 1973, le noyau Unix est réécrit en grande partie en C. Quelques
portions dépendantes du matériel restent en assembleur, mais l’essentiel
du système peut désormais être compilé pour une nouvelle machine avec un
volume d’adaptation réduit.
Ce résultat est historique non parce qu’aucun langage de haut niveau
n’avait jamais servi à un système, mais parce qu’Unix démontre de façon
convaincante qu’un système d’exploitation performant peut devenir
portable. C bénéficie ensuite de la diffusion d’Unix dans les
universités ; Unix bénéficie en retour de la facilité avec laquelle C
permet de l’adapter.
Cette relation façonne également l’interface du langage. C n’est pas
conçu abstraitement puis appliqué au système : ses types, ses opérateurs
et sa bibliothèque évoluent au contact de besoins concrets. De nombreux
outils Unix sont écrits dans le même langage que le noyau, ce qui
simplifie leur transfert entre machines.
Le compilateur comme instrument de portabilité
La portabilité ne vient pas du texte du langage seul. Elle dépend aussi
d’un compilateur capable de traduire les mêmes constructions vers des
jeux d’instructions différents et d’une bibliothèque qui isole une
partie des services du système.
Aux Bell Labs, C évolue avec ses compilateurs. Le langage doit rester
assez simple pour être implanté sur les machines disponibles, tout en
donnant accès à leurs caractéristiques utiles. Cette contrainte explique
son modèle : les tableaux et les pointeurs sont étroitement liés, les
structures décrivent l’organisation de données en mémoire et les
opérateurs correspondent souvent à des instructions peu coûteuses.
Le résultat n’est pas une indépendance totale vis-à-vis du matériel. La
taille des types, l’ordre des octets ou certains comportements peuvent
varier. Un programme portable doit respecter les garanties du langage
plutôt que supposer les détails d’une machine particulière. Cette
distinction entre ce que la norme promet et ce qu’une implantation
choisit deviendra centrale dans toute l’histoire de C.
La diffusion universitaire d’Unix accélère alors un cercle vertueux. Les
étudiants disposent du système, de son code et de son langage principal
; ils développent de nouveaux outils, portent Unix vers d’autres
machines et emportent ensuite ces pratiques dans l’industrie. C ne
s’impose donc pas uniquement par ses qualités abstraites : il voyage
avec un environnement complet de programmation.
Une référence avant la norme
En 1978, Brian Kernighan et Dennis
Ritchie publient The C Programming Language. L’ouvrage, surnommé
K&R, combine une présentation concise, des exemples et une
description qui sert longtemps de référence de fait.
La multiplication des compilateurs rend ensuite nécessaire une norme
formelle. Le comité ANSI X3J11 commence ses travaux en 1983 ; la norme
américaine paraît en 1989 et devient une norme ISO en 1990. Elle précise
le langage et sa bibliothèque tout en cherchant à préserver les
programmes existants.
Ritchie ne contrôle donc pas seul l’évolution de C. Après sa création,
le langage devient une infrastructure partagée, régie par des normes et
implantée sur une immense variété de processeurs.
Un héritage technique à double face
C influence directement C++ et Objective-C.
Sa syntaxe marque aussi Java, JavaScript, C#, Go et de nombreux autres
langages, même lorsque leur gestion de la mémoire ou leur modèle
d’exécution diffèrent profondément.
Son empreinte la plus importante reste dans les couches basses : noyaux,
pilotes, bibliothèques système, microcontrôleurs, bases de données et
compilateurs. Une interface définie en C sert souvent de langage commun
entre composants écrits dans des technologies différentes.
Cette présence ne fait pas de C le meilleur choix universel. Ses faibles
garanties facilitent des vulnérabilités telles que dépassements de
tampon et erreurs de durée de vie. Des outils d’analyse, conventions de
codage et langages offrant davantage de sûreté cherchent à réduire ces
risques. Comprendre l’influence de Ritchie consiste donc aussi à
comprendre pourquoi l’industrie protège aujourd’hui davantage certaines
opérations que C expose directement.
Ritchie, Thompson et la culture Unix
Ritchie contribue à Unix comme concepteur et programmeur, mais attribuer
le système à une seule personne effacerait le contexte des Bell Labs.
Ken Thompson joue un rôle initial déterminant ; Brian Kernighan, Douglas
McIlroy et d’autres participent à ses outils, ses idées et sa diffusion.
Ritchie et Thompson reçoivent ensemble le prix Turing en 1983 pour leur
développement de la théorie générique des systèmes d’exploitation et, en
particulier, la mise en œuvre d’Unix. Cette récompense associe justement
leurs contributions plutôt que de reconstruire un récit solitaire.
Ritchie poursuit sa carrière aux Bell Labs et travaille ensuite sur les
systèmes Plan 9 et Inferno. Il meurt en 2011. Son style public, sobre et
peu spectaculaire, contraste avec l’étendue de son héritage.
Pourquoi Dennis Ritchie compte encore
Ritchie a contribué à déplacer une frontière : le logiciel système
n’avait plus à être presque entièrement prisonnier de l’assembleur et
d’une machine. C a fourni un niveau d’abstraction modeste mais décisif,
assez transparent pour le matériel et assez stable pour la portabilité.
Cette leçon demeure actuelle. Entre performance et protection, contrôle
et abstraction, compatibilité et progrès, chaque langage système
reformule encore les compromis auxquels C a donné une réponse durable.
Chronologie
- 1941 : naissance de Dennis Ritchie à Bronxville, dans l’État de
New York.
- 1963 : diplôme de physique à Harvard.
- 1967 : arrivée aux Bell Labs.
- 1969 : premiers travaux sur Unix avec Ken Thompson et l’équipe
des Bell Labs.
- 1971 : Unix est porté sur le PDP-11.
- 1972 : le développement de C prend sa forme reconnaissable à
partir de B.
- 1973 : le noyau Unix est réécrit en grande partie en C.
- 1978 : publication de The C Programming Language avec Brian
Kernighan.
- 1983 : Ritchie et Thompson reçoivent le prix Turing.
- 1989 : publication de la norme ANSI C.
- 1990 : adoption de C comme norme internationale ISO.
- 2011 : décès de Dennis Ritchie.
Questions fréquentes
Dennis Ritchie a-t-il créé Unix ?
Il en est l’un des principaux développeurs, mais Unix est une œuvre
collective initiée par Ken Thompson aux Bell Labs. Ritchie a joué un
rôle majeur dans son développement et sa réécriture en C.
Pourquoi Ritchie a-t-il créé C ?
Les langages disponibles répondaient imparfaitement aux besoins d’Unix
sur le PDP-11. C devait offrir des types et une efficacité proches du
matériel tout en permettant de déplacer le code entre architectures.
C est-il un langage de bas niveau ?
On le décrit souvent comme un langage de niveau intermédiaire. Il offre
des structures de haut niveau comme les fonctions et les types, tout en
exposant directement les adresses mémoire et la représentation des
données.
Pourquoi la réécriture d’Unix en C était-elle importante ?
Elle réduisait la dépendance à l’assembleur d’une machine précise. Unix
pouvait être porté plus facilement, ce qui a favorisé sa diffusion et
démontré la viabilité des systèmes portables.
Quel rôle Brian Kernighan a-t-il joué ?
Kernighan n’a pas conçu C, mais il a contribué à sa documentation et à
sa diffusion. Le livre écrit avec Ritchie a servi de référence avant la
normalisation.
Pourquoi C reste-t-il utilisé malgré ses risques ?
Il produit du code prévisible, fonctionne sur presque toutes les
architectures et s’intègre à de nombreux systèmes existants. Ces
avantages s’accompagnent d’une responsabilité accrue concernant la
mémoire et la sûreté.