Cette question peut provenir d'une mauvaise compréhension des compilateurs de ma part, mais voici ...
On peut trouver l'énoncé suivant dans la préface de la première édition de K&R (page xi):
Le système d'exploitation, le compilateur C, et essentiellement tous les programmes d'application UNIX (y compris tous les logiciels utilisés pour préparer ce livre) sont écrits en C.
(mon accent)
Voici ce que je ne comprends pas: ce compilateur C ne doit-il pas être compilé lui-même avant de pouvoir compiler du code C? Et si ce compilateur C est écrit en C, sa compilation ne nécessiterait-elle pas un compilateur C déjà existant?!
Le seul moyen de sortir de cette énigme de régression infinie (ou problème de poulet et d'oeufs) est que le compilateur C écrit en C auquel K&R fait référence a été effectivement compilé avec un compilateur C déjà existant qui a été écrit dans un langage autre que C Le compilateur C écrit en C a alors remplacé ce dernier.
Ou suis-je complètement éteint?
Cela s'appelle Bootstrapping , citant Wikipedia:
Si l'on a besoin d'un compilateur pour la langue X pour obtenir un compilateur pour la langue X (qui est écrit en langage X), comment le premier compilateur a-t-il été écrit? Les méthodes possibles pour résoudre ce poulet ou le problème des œufs comprennent:
Et si vous êtes intéressé, ici est la première source du compilateur C de Dennis Richie.
Voir la section Poulet et oeufs de la page Wikipedia :
Si l'on a besoin d'un compilateur pour la langue X pour obtenir un compilateur pour la langue X (qui est écrit en langage X), comment le premier compilateur a-t-il été écrit? Les méthodes possibles pour résoudre ce poulet ou le problème des œufs comprennent:
Habituellement, un premier compilateur est écrit dans un autre langage (directement dans l'assembleur PDP11 dans ce cas, ou en C pour la plupart des langages "modernes"). Ensuite, ce premier compilateur est utilisé pour programmer un compilateur écrit dans le langage lui-même.
Vous pouvez lire ceci page sur l'histoire du langage C. Vous verrez qu'il est également fortement lié au système UNIX.
Il est parfaitement normal qu'un compilateur soit écrit dans le langage qu'il compile. Une façon d'y parvenir serait d'écrire un compilateur complet pour le langage L dans un autre langage, puis d'écrire un nouveau compilateur pour L en L. Une approche plus intéressante serait d'écrire un compilateur minimal pour un sous-ensemble de L dans certains autre langage, puis utilisez ce sous-ensemble minimal pour améliorer le compilateur, le rendant moins minimal en augmentant le sous-ensemble disponible de L. De cette façon, un compilateur complet peut être construit.