2010-06-08 11 views
17

Possibili duplicati:
implementing a compiler in “itself”
Bootstrapping a languageCome può essere compilato il compilatore di una lingua in quella lingua?

Come si può scrivere un compilatore nella stessa lingua come la lingua che si sta scrivendo che compilatore per? Non è quel tipo di ricorsivo?

Edit: Questo può essere eliminato, ma per il resto ...:

Come di bootstrap:

Perché per l'avvio:

+2

Varie versioni precedenti e collegamenti correlati: http://stackoverflow.com/questions/13537/bootstrapping-a-language http://stackoverflow.com/questions/1493747/bootstrapping-a-compiler-why http: // stackoverflow.com/questions/193560/implementing-a-compiler-in-itself http://stackoverflow.com/questions/1173780/programming-language-and-compiler http://stackoverflow.com/questions/2035838/what- language-do-they-build-other-languages-with http://stackoverflow.com/questions/2740994/what-is-the-language-of-compilersare-they-written-with-different-languages ​​La parola che volevi era "bootstrap". – dmckee

+0

Mi chiedo quanto spesso le persone implementino i compilatori per le lingue tradizionali utilizzando quelli esoterici. – JAB

+0

@Phil Ross - wow, grazie, come lo hai trovato? non ero sicuro di come cercare :) – froadie

risposta

24

Generalmente la prima versione del compilatore è scritto in una lingua diversa, e quindi ogni versione successiva è scritto in quella lingua e compilato con la versione precedente. Una volta compilata la versione con la versione x-1, è possibile utilizzare la nuova versione x per ricompilare sé stessa, sfruttando le nuove ottimizzazioni introdotte dalla versione; GCC rilascia i suoi rilasci in questo modo

+0

+1 Ho creato un semplice interprete Lisp in JAVA. – Achilles

+1

quindi ... perché non puoi semplicemente usare la prima versione del compilatore? Perché vorresti un compilatore a doppio livello? – froadie

+3

@froadie Vuoi dire perché non compili ogni versione con la versione 1? Solitamente le nuove versioni di un compilatore generano un codice macchina migliore rispetto alle versioni precedenti, quindi costruire con la versione più recente renderà il compilatore il più veloce ed efficiente possibile. Inoltre, se la lingua stessa sta cambiando e si desidera utilizzare le nuove funzionalità nel codice sorgente del compilatore, sarà necessario creare una versione più recente, –

11

Lo è. Di solito hai bisogno di una versione bootstrap della lingua compilata o interpretata da un'altra lingua.

E per piegare la mente un po 'di più, anni fa ho letto la storia di un compilatore Pascal scritto come un progetto studentesco. È scritto in Pascal e compilato con il compilatore Pascal incorporato nel sistema. Alla fine, è stato abbastanza buono da sostituire il compilatore Pascal incorporato nel sistema. Sfortunatamente, hanno trovato un bug nella generazione del codice, ma la correzione per il generatore di codice ha attivato il bug nel compilatore, generando un compilatore non valido. Per risolverlo è necessario applicare le patch a mano dei binari dal compilatore installato per applicare la patch all'origine per sostituirsi.

+0

Ho trovato questa domanda chiedendo esattamente cosa si farebbe in questo tipo di situazione bug. Non mi era venuto in mente il patch delle mani. Storia divertente. haha – GabrielF

1

Il primo passaggio del compilatore viene normalmente scritto in qualcos'altro finché il linguaggio non è sufficientemente formato per essere in grado di compilare il proprio compilatore, quindi è possibile ottenere nella x è scritto in x.

4

È solo un problema per la primissima versione di sempre. Una volta eseguita la V1.0 del compilatore, posso scrivere V2.0 nella mia lingua e utilizzare il compilatore V1.0 per compilarlo. Quindi posso scrivere V3.0 e usare V2.0 per compilarlo, usare V3.0 per compilare V4.0 e così via.

1

All'inizio, il vero primo compilatore di quella lingua, non era scritto in quella lingua, naturalmente. Molto secondo potrebbe essere scritto in quella lingua. Inoltre, data una specifica di una lingua, è possibile implementare un core di base in un compilatore bootstrap, quindi scrivere il compilatore conforme completo in quella lingua usando il sottoinsieme inteso dal compilatore "bootstrap". I compilatori di seconda generazione possono anche dimenticare il compilatore "bootstrap".

1

A un certo punto, è necessario un compilatore (o interprete) scritto in una lingua diversa. Ma non ha bisogno di essere efficiente e può essere fatto in un linguaggio che rende facile l'analisi e la prototipazione (LISP è popolare). Una volta che hai usato questo per compilare il "self-compilatore", puoi scartarlo e usare il risultato.

+1

Non necessariamente. Il primo "compilatore" può anche essere un essere umano, nel qual caso non è necessario un compilatore di bootstrap in una lingua diversa * del tutto *. Ecco come sono stati scritti i primi compilatori per la maggior parte delle lingue di Niklaus Wirth: in pratica li ha assegnati ai suoi studenti :-) –