Dans quel langage le compilateur C # est-il écrit?

148

J'ai regardé le code source sur http://referencesource.microsoft.com/ , et il semble que tout le code source est en C #.

J'ai également regardé le code source de la nouvelle plateforme de compilateur C # ( Roslyn ), et il est également en C #. Comment est-ce possible? Le compilateur de langage C # est-il écrit en C #? Ou est-ce que je rate quelque chose d'évident? Si le compilateur C # est écrit en C #, comment ça marche?

CriketerOnSO
la source
12
De nombreux compilateurs sont écrits dans le langage qu'ils compilent - Google bootstrap pour en savoir plus.
Paul Roub
19
Je pense que le compilateur original a été écrit en C ++.
PoweredByOrange
44
Eh bien, un marteau peut être forgé en utilisant un autre marteau. Version précédente de celui-ci ...
Eugene Sh.
10
Le lien que vous avez publié est le lien vers le code source de la bibliothèque Framework, pas vers le compilateur.
Steve

Réponses:

229

Le compilateur C # d'origine n'a pas été écrit en C #, il était en C et C ++. Le nouveau compilateur Roslyn a été écrit en C #, mais a été initialement compilé avec l'ancien compilateur. Une fois le nouveau compilateur terminé, il a pu compiler son propre code source: c'est ce qu'on appelle le bootstrapping .

Thomas Levesque
la source
2
Ainsi, lorsqu'une modification doit être apportée au "compilateur d'origine", est-ce que cela doit être compilé avec l'ancien compilateur (écrit en C, C ++) ?
CriketerOnSO
10
Il n'y aurait pas besoin de changer le "compilateur original", les nouvelles versions seraient modifiées
Pseudonyme
1
@CriketerOnSO, le nouveau compilateur remplacera l'ancien, il ne sera donc pas nécessaire de modifier l'ancien. Mais si MS voulait faire cela, ils recompileraient l'ancien compilateur avec un compilateur C ++, comme ils le faisaient auparavant.
Thomas Levesque
3
@ThomasLevesque L'auto-hébergement est le résultat final du bootstrap.
arx
2
@SriramSakthivel, le code du compilateur ne peut pas utiliser les nouveaux mots-clés, du moins pas tant qu'il n'y a pas un compilateur qui les comprend. Vous utilisez toujours une ancienne version du compilateur pour créer la nouvelle.
Thomas Levesque
32

Les compilateurs sont des programmes utilitaires - ils transforment le texte du langage de programmation en code machine. Si le langage de programmation décrit un logiciel qui se trouve être un compilateur .....

Les compilateurs peuvent également produire du code machine pour d'autres architectures. Par exemple, Apple compile iOS à l'aide de racks de serveurs Intel. Le compilateur n'a pas besoin d'exécuter le code ARM qu'il génère, il suffit de l'écrire sur le disque.

Le compilateur 2.0 doit être écrit dans un langage que le compilateur 1.0 peut traiter, mais il peut certainement créer le compilateur 2.0 avec des fonctionnalités plus récentes comme l'optimisation. Vous pouvez ensuite recompiler le code source à l'aide du compilateur 2.0 et créer une meilleure version de lui-même. Encore une fois, le compilateur ne sait pas qu'il crée une autre version de lui-même.

Si nous remontons assez loin dans la nuit des temps, nous atteignons un point où nous n'avons pas de compilateur - la toute première itération d'un langage de haut niveau. Ensuite, nous devons sortir les crayons et les livres d'opcode et écrire le premier en assemblage. Comment avons-nous écrit le premier assembleur? Saisie directe du code machine, probablement sur du ruban de papier perforé, ou basculement des interrupteurs sur le panneau avant.

Paul
la source
9
Et le ruban de papier ne fait que basculer les interrupteurs via des trous dans le papier. :-)
Zan Lynx
2
Le ruban de papier en tant que technologie de stockage ne décollera jamais . C'est tout simplement trop complexe et sujet aux erreurs, en plus il brûle facilement s'il y a un court-circuit dans le lecteur et cela détruira complètement votre programme.
un CVn
16

Un compilateur est juste un programme comme n'importe quel autre programme. Il n'y a rien de magique ou de spécial à ce sujet. Il prend une certaine entrée et produit une sortie. Dans ce cas particulier, l'entrée se trouve être C # et la sortie se trouve être CIL, mais ce n'est pas différent de l'entrée étant une série de déclarations de revenus et la sortie étant un rapport.

Jörg W Mittag
la source
10
C'est différent - c'est beaucoup plus facile, -).
Peter - Réintégrer Monica
3
@PeterSchneider: Les gens aiment transformer les compilateurs en créatures magiques mythiques, mais en fin de compte, ce ne sont que des programmes qui convertissent l'entrée en sortie. Presque tous les programmes de la planète analysent certaines entrées, essaient de les comprendre et les transforment en une sortie. Dans un certain sens, chaque entrée est un programme écrit dans un langage, chaque programme est un compilateur.
Jörg W Mittag
3
Je ne pourrais pas être plus d'accord. Tout ce que je voulais dire, c'est que les lois fiscales sont un désastre terrible. En revanche, les langages formels sont généralement bien définis d'une manière adaptée à l'automatisation. Ce qui rend un simple compilateur plus facile à écrire qu'un programme traitant des taxes. Bien qu'Eric Lippert puisse être en désaccord avec les compilateurs C #, cf. blogs.msdn.com/b/ericlippert/archive/2010/02/04/… . Est venu loin des compilateurs C en un seul passage.
Peter - Réintégrer Monica
1
@PeterSchneider: Ah, désolé, j'ai mal interprété votre commentaire à 180 ° :-D
Jörg W Mittag
J'aime mieux cette réponse car elle répond le plus directement à la pensée du PO. Il efface le brouillard qui entoure le compilateur «tout puissant».
Assaf Levy