web-dev-qa-db-fra.com

C est écrit en C, comment est-ce possible?

Duplicata possible:
Comment le premier compilateur C++ pourrait-il être écrit en C++?

Je sais que ma question va à la grotte souterraine de la galaxie où les langues sont nées et implique des mathématiques lambda et des années-lumière d'étude de Google. Mais quel type de connaissances est nécessaire pour créer une langue?

41
H_7

Recherchez "bootstrapping".

Fondamentalement, vous commencez avec un processus/ensemble de fonctions très minimal qui peut être utilisé pour compiler le code qui définit un compilateur légèrement plus fonctionnel. Cela crée votre prochain compilateur qui peut ensuite être utilisé pour créer du code qui peut faire encore plus. Vous répétez ce processus jusqu'à ce que vous ayez un compilateur complet capable de compiler toutes les fonctionnalités du langage.

L'autre alternative consiste à écrire la première version du compilateur dans une langue différente, puis à écrire la version suivante dans votre langue cible.

77
ChrisF

La réponse de ChrisF est excellente, mais je voulais ajouter cet exemple qui m'est toujours resté après mon cours d'informatique sur le bootstrap.

Supposons que vous disposiez d'un compilateur C de base qui ne prend pas encore en charge les codes d'échappement pour les chaînes, et que vous vouliez l'ajouter. Vous pouvez ajouter un extrait de code similaire à celui-ci:

if( str[i] == 0x5c ) {       // ASCII code for backslash
   switch( str[i+1] ) {
      case 'n': return 0x0a; // ASCII code for new line
      case 't': return 0x09; // ASCII code for tab
      // ...                 // more ASCII code for other escapes
      default: return str[i+1];
   }
}

Après avoir ajouté ceci au compilateur et généré un nouveau binaire du compilateur, vous pouvez alors le réécrire dans:

if( str[i] == '\\' ) { 
   switch( str[i+1] ) {
      case 'n': return '\n';
      case 't': return '\t';
      // ...
      default: return str[i+1];
   }
}

Cela supprimerait toute connaissance des codes ASCII du code source du compilateur, mais le compilateur générerait toujours comme par magie les codes corrects.

22
fishinear

Le bootstrap est certainement le moyen standard de construire un compilateur aujourd'hui. Mais rappelez-vous que vous n'avez pas besoin d'un compilateur ou d'un interprète pour écrire un programme dans une langue. Par exemple, Christopher Strachey a écrit un célèbre programme d'IA capable de jouer à Checkers en CPL avant qu'il y ait un compilateur pour CPL . Il a dû traduire le programme en code machine "manuellement", ce qui est fastidieux et sujet aux erreurs, mais pas vraiment difficile (c'est pourquoi les ordinateurs peuvent si bien le faire).

18
nikie

J'espère que ce n'est pas hors sujet, mais je voulais souligner qu'une fois que vous avez un compilateur C pour une plate-forme X, le démarrage pour d'autres plates-formes peut être effectué en utilisant la compilation croisée:

  • Vous disposez d'un compilateur C c1 pour l'architecture X qui s'exécute sur l'architecture X.
  • Vous écrivez un compilateur C c2 pour l'architecture Y, écrit en C.
  • Vous compilez le compilateur c2 sur X à l'aide de c1 et obtenez le binaire du compilateur c2 qui s'exécute sur X.
  • Vous utilisez le binaire de c2 qui s'exécute sur X pour se compiler et obtenir un binaire de c2 qui s'exécutera sur Y.

En d'autres termes, lorsque vous avez le premier œuf, il est facile de faire plus d'œufs.

10
Giorgio