In quale lingua è scritto il compilatore C #?


148

Ho guardato il codice sorgente su http://referencesource.microsoft.com/ e sembra che tutto il codice sorgente sia in C #.

Ho anche cercato il codice sorgente per la nuova piattaforma di compilatore C # ( Roslyn ), ed è anche in C #. Come è possibile? Il compilatore del linguaggio C # è scritto in C #? O mi sto perdendo qualcosa di ovvio? Se il compilatore C # è scritto in C #, allora come funziona?


12
Molti compilatori sono scritti nella lingua che compilano: il bootstrap di Google per saperne di più.
Paul Roub,

19
Penso che il compilatore originale sia stato scritto in C ++.
PoweredByOrange

44
Bene, un martello può essere forgiato usando un altro martello. Versione precedente ...
Eugene Sh.

10
Il link che hai pubblicato è il link al codice sorgente della libreria Framework, non al compilatore.
Steve,

Risposte:


229

Il compilatore C # originale non era scritto in C #, era in C e C ++. Il nuovo compilatore Roslyn è stato scritto in C #, ma inizialmente è stato compilato con il vecchio compilatore. Una volta completato il nuovo compilatore, è stato in grado di compilare il proprio codice sorgente: questo si chiama bootstrap .


2
Quindi, quando si deve apportare una modifica al "compilatore originale", deve essere compilato con il vecchio compilatore (scritto in C, C ++) ?
CriketerOnSO

10
Non sarebbe necessario modificare il "compilatore originale", le versioni più recenti verrebbero modificate
Pseudonimo

1
@CriketerOnSO, il nuovo compilatore sostituirà quello vecchio, quindi non sarà necessario modificare quello vecchio. Ma se MS avesse voluto farlo, avrebbero ricompilato il vecchio compilatore con un compilatore C ++, come avevano fatto prima.
Thomas Levesque,

3
@ThomasLevesque L'auto-hosting è il risultato finale del boot-strapping.
Arx,

2
@SriramSakthivel, il codice del compilatore non può usare le nuove parole chiave, almeno fino a quando non c'è un compilatore che le capisca. Utilizzare sempre una versione precedente del compilatore per creare quella nuova.
Thomas Levesque,

32

I compilatori sono programmi di utilità: trasformano il testo del linguaggio di programmazione in codice macchina. Se il linguaggio di programmazione descrive un software che sembra essere solo un compilatore .....

I compilatori possono anche produrre codice macchina per altre architetture. Ad esempio, Apple compila iOS usando rack di server basati su Intel. Il compilatore non deve eseguire il codice ARM che genera, basta scriverlo sul disco.

Il compilatore 2.0 deve essere scritto in un linguaggio che il compilatore 1.0 può elaborare, ma può certamente creare il compilatore 2.0 con nuove funzionalità come l'ottimizzazione. È quindi possibile ricompilare il codice sorgente utilizzando il compilatore 2.0 e crearne una versione migliore. Ancora una volta, il compilatore non sa che sta realizzando un'altra versione di se stesso.

Se torniamo abbastanza indietro nella notte dei tempi, arriviamo a un punto in cui non abbiamo compilatore: la prima iterazione di un linguaggio di alto livello. Quindi dobbiamo estrarre le matite e i libri con codice operativo e scrivere il primo in assemblea. Come abbiamo scritto il primo assemblatore? Immissione diretta del codice macchina, probabilmente su nastro di carta punzonata o con interruttori a rotazione sul pannello anteriore.


9
E il nastro di carta sta semplicemente lanciando interruttori attraverso i fori nella carta. :-)
Zan Lynx il

2
Il nastro di carta come tecnologia di archiviazione non decollerà mai . È troppo complesso e soggetto a errori, inoltre si brucia facilmente se c'è un cortocircuito nel lettore e questo distruggerà completamente il tuo programma.
un CVn

16

Un compilatore è solo un programma come qualsiasi altro programma. Non c'è nulla di magico o speciale al riguardo. Prende un input e produce un output. In questo caso particolare, l'input è solo C # e l'output è CIL, ma non è diverso dal fatto che l'input è una serie di dichiarazioni fiscali e l'output è un report.


10
È diverso - è molto più facile, -).
Peter - Ripristina Monica il

3
@PeterSchneider: Alla gente piace lanciare compilatori come mitiche creature magiche, ma alla fine sono solo programmi che convertono l'input in output. Praticamente ogni programma sul pianeta analizza alcuni input, cerca di dargli un senso e li trasforma in alcuni output. In un certo senso, ogni input è un programma scritto in una lingua, ogni programma è un compilatore.
Jörg W Mittag,

3
Non potrei essere più d'accordo. Tutto quello che volevo dire è che le leggi fiscali sono un disastro terribile. Al contrario, i linguaggi formali sono in genere ben definiti in un modo che è adatto per l'automazione. Il che rende probabilmente un semplice compilatore più facile da scrivere di un programma che si occupa di tasse. Sebbene Eric Lippert possa supporre di non essere d'accordo con i compilatori C #, cfr. blogs.msdn.com/b/ericlippert/archive/2010/02/04/… . È venuto molto lontano dai compilatori C one-pass.
Peter - Ripristina Monica il

1
@PeterSchneider: Ah, scusa, ho frainteso il tuo commento di 180 ° :-D
Jörg W Mittag

Mi piace molto questa risposta poiché affronta il pensiero dell'OP più direttamente. Elimina la nebbia che circonda il compilatore "tutto potente".
Assaf Levy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.