Un compilatore o interprete è un programma come qualsiasi altro programma. È possibile scrivere programmi in qualsiasi linguaggio di programmazione desiderato, incluso Go. Ergo, puoi scrivere un compilatore in Go. Compreso un compilatore Go.
Perché no?
Naturalmente, per utilizzare effettivamente il compilatore o l'interprete, è necessario avere anche un compilatore o un interprete per quella .
Nel caso di Go, ad esempio, le prime versioni del compilatore erano scritte in C. Quindi, avevano già un compilatore Go funzionante. Quindi, non è un problema scrivere un compilatore Go in Go, dato che hai già un compilatore Go funzionante scritto in C, che puoi usare per compilare il compilatore Go scritto in Go. E ora, hai compilato la versione del tuo compilatore Go scritta in Go, e puoi usarla per compilare versioni future del tuo compilatore Go scritto in Go.
Questo è chiamato "bootstrap" (dopo la vecchia storia del barone Münchhausen, che si è tirato fuori dal fango con i suoi stivaletti).
Nota che per Go in particolare, ci sono diversi compilatori per Go, e almeno gccgo continua ad essere scritto in C ++; non c'è alcun codice Go in gccgo. Quindi, puoi sempre usare gccgo per riavviare il processo di bootstrap, nel caso dovessi perdere il tuo binario Go compilato.
Un compilatore che è scritto nella lingua che compila e che è in grado di compilarsi, è chiamato "self-hosting". Ci sono un paio di vantaggi per un compilatore auto-hosting:
- Quando lavori su un compilatore, devi conoscere tre lingue: la lingua che stai compilando (la lingua sorgente ), la lingua che stai compilando (la lingua di destinazione ), e la lingua in cui si sta scrivendo il compilatore (il linguaggio di implementazione ). Il self-hosting ti consente di sbarazzarti di uno di essi. Ciò aumenta la quantità di persone in grado di lavorare nel compilatore riducendo la quantità di conoscenza che un potenziale contributore deve possedere.
- I compilatori ad alte prestazioni di livello industriale di livello industriale sono programmi grandi, complessi e ad alta intensità di risorse. Sono un buon test per la tua lingua (le funzionalità di astrazione della tua lingua possono gestire un progetto così ampio e complesso?) E il tuo compilatore (se il compilatore può compilare se stesso, probabilmente può anche compilare altri programmi grandi e complessi).
- Se il tuo compilatore è molto semplice, il codice del compilatore può servire come una specifica del comportamento della lingua. (In generale, i compilatori di produzione non sono semplici e semplici compilatori non sono di produzione, tuttavia, questa non dovrebbe essere la specifica solo , altrimenti non sarai mai in grado di dire se il tuo compilatore è corretto o meno.)
- Il self-hosting è considerato un traguardo importante per una lingua.
Ci sono anche alcuni svantaggi:
- Il complesso processo di bootstrap.
- Se lo scrittore del compilatore è anche il progettista del linguaggio, c'è il pericolo che aggiunga funzionalità che può usare mentre scrive il compilatore, e tralascia le caratteristiche per cui è difficile scrivere un compilatore, finendo quindi con un linguaggio che è buono solo per scrivere compilatori e nient'altro. (Non è necessariamente una brutta cosa se stai progettando una lingua per scrivere i compilatori.)
In uno dei suoi articoli, il Prof. Niklaus Wirth ha dato un buon esempio di quest'ultimo: quando ha progettato la lingua di Oberon, ha scritto il compilatore nello stesso momento in cui stava progettando la lingua. Il sistema su cui stava scrivendo aveva solo un oscuro dialetto proprietario di Fortran. Dopo lo stesso tempo, si rese conto di essersi lasciato inconsciamente o di aver cambiato le caratteristiche che avrebbero reso più facile scrivere programmi in Oberon perché non riusciva a pensare a un bel modo per implementarli nell'oscuro dialetto di Fortran. Quindi, buttò via il compilatore, esaminò di nuovo il suo progetto e iniziò un nuovo compilatore nello stesso Oberon. Oberon doveva essere un linguaggio di programmazione dei sistemi, quindi scrivere un compilatore e una libreria standard era una scelta naturale.
Ora, la domanda è: come ha risolto il problema del bootstrap? Beh, era un professore, dopotutto: distribuiva porzioni del compilatore ai suoi studenti, per tradurre manualmente a mano in Fortran.