« Dans quelle langue C est-elle écrite elle-même ? »
D’un autre point de vue, c’est le cas : avant que le langage C ne fonctionne, il doit être compilé, alors d’où vient le compilateur du langage C ? Dans quelle langue est-il écrit ? Si c’est écrit en C lui-même, y a-t-il un œuf ou une poule en premier ?
1
Supposons qu’il n’existe pas de compilateurs dans le monde, commençons par le langage machine et voyons comment.
Le langage machine peut être exécuté directement par le processeur sans avoir besoin d’un compilateur.
Il y a ensuite le langage assembleur, bien que le langage assembleur ne soit qu’un moyen mnémotechnique pour le langage machine, mais il doit aussi être compilé en langage machine pour être exécuté, donc il n’y a pas d’autre choix que d’utiliser un langage machine pour écrire ce premier compilateur (qui n’est plus utilisé à l’avenir).
Le problème du langage assembleur est résolu, et c’est un grand pas en avant ; à ce stade, il est possible d’utiliser un langage assembleur pour écrire le compilateur en langage C, que nous disons être l’ancêtre du compilateur C.
Avec cet ancêtre, vous pouvez compiler n’importe quel programme en langage C, donc pouvez-vous écrire un compilateur en langage C lui-même ? Il suffit de compiler avec les ancêtres.
OK, après une telle couche, j’ai enfin réussi à écrire un compilateur en C, ce qui est vraiment problématique.
À ce stade, le compilateur C écrit par le package précédent peut être abandonné.
Bien sûr, s’il existait d’autres langages de haut niveau avant C, comme Pascal, alors Pascal pouvait être utilisé pour écrire un compilateur C.
Le compilateur du premier Pascal serait écrit en Fortran. En tant que premier langage de haut niveau, le compilateur de Fortran doit être écrit en langage assembleur.
2
Voici une légende intéressante à propos du compilateur :
La légende veut que Ken Thompson, l’un des inventeurs d’Unix, se soit hissé sur n’importe quelle machine Unix chez Bell Labs, ait saisi son nom d’utilisateur et son mot de passe, et ait pu se connecter par la manière root !
Bell Labs regorge de talents, et d’autres gros bonnets ont juré de trouver cette vulnérabilité, ils ont lu le code source C d’Unix, ont finalement trouvé la porte dérobée de connexion, et après avoir nettoyé la porte dérobée, ils ont compilé Unix et l’ont exécuté, mais Thompson a quand même pu se connecter.
Certaines personnes pensent qu’il pourrait y avoir un problème avec le compilateur, et qu’une porte dérobée a été implantée lors de la compilation d’Unix, alors ils ont réécrit un compilateur en C et ont recompilé Unix avec un nouveau compilateur.
Mais ça ne fonctionne toujours pas, Thompson peut toujours se connecter avec root, ce qui est vraiment dévastateur !
Plus tard, Thompson lui-même a déverrouillé le secret, c’était le premier compilateur C à avoir un problème, ce compilateur sera bien sûr implanté dans la porte dérobée lors de la compilation du code source Unix, ce n’est pas suffisant, ce qui est encore mieux, si vous écrivez un nouveau compilateur en langage C, vous devez absolument le compiler en code binaire, que compiler, n’utilisez que le premier compilateur écrit par Thompson pour compiler, d’accord, le compilateur que vous avez écrit sera pollué, votre compilateur compilara Unix à nouveau, Je vais aussi implanter une porte dérobée :-)
D’ailleurs, je me rappelle l’incident XcodeGhost il y a quelques années, ce qui signifie simplement qu’un cheval de Troie a été implanté dans Xcode (téléchargé depuis des canaux non officiels), de sorte que les applications iOS compilées par XCode ont été contaminées, et que ces applications pourraient être utilisées par des hackers pour des actes illégaux.
Bien que ce XCodeGhost soit loin d’être celui de Thompson, il nous rappelle que lors du téléchargement d’un logiciel, il faut utiliser des canaux formels, télécharger depuis le site officiel, rechercher la norme HTTPS du site, et même vérifier la somme de contrôle.
3
Certaines personnes pourraient demander : j’utilise Hui pour écrire un paragraphe « Bonjour le Monde », mais quelqu’un peut l’utiliser pour écrire un compilateur complexe ? Est-ce possible ?
Bien sûr, lors du développement de la première génération d’Unix, il n’existait pas de langage C, et Ken Thompson et Dennis Ritchie tapaient Unix avec des chaînes d’assemblage. La première version de WPS a été écrite par Qiu Bojun en Hui, et le compilateur de Turbo Pascal a également été écrit par Anders en Hui, et les capacités des dieux sont inimaginables pour les gens ordinaires.
Pour les compilateurs, il est également possible de développer de manière « boule de neige » :
En prenant toujours le langage C comme exemple, la première version peut choisir un sous-ensemble du langage C, par exemple ne supportant que les types de données de base, les instructions de contrôle de processus et les appels de fonctions...... Nous appelons ce sous-ensemble C0.
Ensuite, écrivez un compilateur en langage assembleur, et ne prenez qu’un sous-ensemble de ce langage C0, ce qui facilite beaucoup l’écriture.
Le langage C0 fonctionne, puis nous étendons ce sous-ensemble en ajoutant des structs, des pointeurs, ......, et en appelant le nouveau langage C1.
Qui écrit le compilateur pour le langage C1 ? Naturellement, c’est C0.
Quand C1 fonctionne, développez à nouveau les fonctionnalités du langage, écrivez le compilateur avec C1, et obtenez C2.
Puis il y a C3, C4...... Enfin, vous obtenez le langage complet du C.
Ce processus s’appelle le bootstrapping, et en chinois, il s’appelle le bootstrapping.
|