Le compilateur gcc C est-il écrit en C lui-même?

87

Le compilateur gcc C est-il écrit en C lui-même? Ou est-il écrit en Assemblée? Si le compilateur est écrit en C, quel est le compilateur utilisé pour compiler le code du compilateur?

euphorie83
la source
12
Oui, c'est (surtout). Bien sûr, il faut un compilateur C pour compiler C donc, comme avec la plupart des compilateurs, il y a une série de phases "boot-strap". L'idée générale est couverte à Installer GCC: Construction et installation de GCC - LFS .
2
Différentes stations de travail de marque dans les années 1980 et au début des années 90 avaient leurs propres environnements de type Unix avec un compilateur c, des outils, etc. qui étaient tous un peu différents les uns des autres. Avec le source GCC, vous pouvez faire une première compilation de gcc sur l'une de ces plates-formes, puis compiler gcc avec lui-même plusieurs fois pour plus ou moins vérifier un point fixe.
Paul

Réponses:

98

L'historique spécifique de gcc est donné sur le Wiki GCC . Le point le plus général est que les compilateurs sont généralement compilés à l'origine avec un autre compilateur jusqu'à ce qu'ils soient suffisamment puissants pour se compiler eux-mêmes. Alternativement, il est possible d'écrire un compilateur de base capable de gérer un sous-ensemble de vos fonctionnalités dans l'assembleur et de construire à partir de là. Mais encore une fois, ce n'est presque plus nécessaire. Il existe de nombreux compilateurs disponibles, dans une variété de langues. Même lorsque Stephen Johnson écrivait pcc (l'un des premiers compilateurs C), il y avait des compilateurs pour B disponibles, ainsi que de nombreux autres langages. gcc avait plusieurs compilateurs parmi lesquels choisir pour le construire à l'origine, et RMS dit qu'il utilisait le compilateur Pastel au moins pendant son développement initial.

N'oubliez pas qu'il n'est pas nécessaire qu'un compilateur C soit écrit en C. Vous pouvez l'écrire en Perl si vous le souhaitez. Il n'est pas nécessaire qu'un compilateur pour une plate-forme donnée soit initialement écrit sur cette plate-forme (les systèmes embarqués sont presque toujours compilés sur un autre système). Il existe donc de nombreuses façons de se faire démarrer.

Cette question a quelques subtilités intéressantes liées à la première instance d'amorçage du compilateur. Si vous étiez très intelligent, vous pourriez utiliser ce bootstrap pour faire quelque chose d'incroyable, brillant et terrifiant .

Rob Napier
la source
Woah, ce deuxième article auquel vous avez lié est incroyablement intelligent.
Ponkadoodle
1
Merci pour l'excellent lien d'amorçage. J'avais supposé que les compilateurs étaient toujours écrits dans des langages plus simples jusqu'au code machine pour une sorte de raison. (Par exemple, que se passe-t-il si vous réalisez que le binaire de votre compilateur contient une erreur? Cela fournit un exemple beaucoup plus fort bien sûr.) Quels sont donc les avantages d'écrire le compilateur dans son propre langage? Les personnes extrêmement paranoïaques s'inquiètent-elles de cela et construisent leurs compilateurs sans "auto" bootstrap?
RoG
4
Certains groupes linguistiques considèrent que c'est une marque d'honneur de pouvoir se compiler. Go a récemment fait un grand pas dans cette direction. Swift, d'un autre côté, n'a notamment pas l'intention de réécrire son compilateur en Swift. Notez cependant que GCC a toujours été écrit en C. Il a simplement été compilé avec d'autres compilateurs. Mais si tous les compilateurs C étaient écrits en BCPL, cela ne réglerait rien concernant la paranoïa. Cela fait simplement reculer le problème d'un pas. (Vous obtiendrez les mêmes avantages de paranoïa en compilant simplement GCC w / clang.)
Rob Napier
Notez que gcc a une politique selon laquelle gcc version majeure X peut toujours être compilée avec gcc version majeure X-1, donc toute nouvelle fonctionnalité ajoutée au compilateur dans X ne peut être utilisée que dans la source gcc elle-même à partir de X + 1. par exemple, vous devriez être capable de compiler n'importe quelle version 9 de gcc, quel que soit le numéro de version mineure, avec n'importe quel gcc 8, encore une fois quelle que soit la version mineure.
Baruch
51

À l'origine, il a été écrit dans un langage d'assemblage, puis il a commencé à se nourrir lui-même.

Daniel A. White
la source
2
Je n'ai vu aucune référence à RMS en utilisant l'assembleur pour le bootstrap d'origine. Quelle est votre source pour cela? Il avait plusieurs autres compilateurs avec lesquels démarrer, donc cela semble beaucoup de travail.
Rob Napier
17
Je pensais que le terme était bootstrap.
Martin York
7
hahaha j'ai lu ceci il y a quelques semaines et j'ai pensé que vous étiez fou avec cette expression, je ne savais pas que c'était standard. Bon spectacle monsieur! en.wikipedia.org/wiki/Eating_your_own_dog_food
3

Bien que ce ne soit évidemment qu'un indicateur très approximatif, j'ai trouvé cette liste rapide sur l' gcc-5.1.0-src/gcc/annuaire intéressante. Ce répertoire contient les principales sources de GCC lui-même (à l'exception des bibliothèques d'exécution).

Voici les principaux comptes de fichiers (plus de 100) regroupés par extension dominée par les fichiers C et C ++.

    112 .opt
    118 .def
    140 .cc
    185 .x
    250 .exp
    353 .md
    366 .mm
    414 .f
    430 .f03
    521 .m
    625 .a
   1082 .go
   1371 .h
   1602 .ads
   1655 .adb
   1828 .ada
   3860 .f90
  11231 .C        // C++ 
  23811 .c        // C 

Veuillez noter que de nos jours se GCCréfère à la collection de compilateurs GNU, pas seulement au compilateur GNU C.

6.3 Le sous-répertoire gcc

Le répertoire gcc contient de nombreux fichiers qui font partie des sources C de GCC, d'autres fichiers utilisés dans le cadre du processus de configuration et de construction, et des sous-répertoires comprenant la documentation et une suite de tests.

Référence: https://gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

oo_miguel
la source