Qualcuno può fornire un esempio di codice breve del bootstrap del compilatore? [chiuso]

4

Questa conferenza di Turing conferenza di Ken Thompson sull'argomento " Reflections on Trusting Trust "fornisce informazioni dettagliate su come il compilatore C è stato creato in C stesso.

Anche se capisco il punto cruciale, non è ancora penetrato. Quindi alla fine, una volta che il compilatore è scritto per fare analisi lessicale, analizzare alberi, analisi di sintassi, generazione di byte code, ecc., viene scritto un codice macchina separato tutto ciò sul compilatore?

Qualcuno può spiegare con un piccolo esempio della procedura? Bootstrapping su wiki offre buone informazioni, ma solo una visione approssimativa.

PS: sono a conoscenza dei duplicati sul sito, ma li ho trovati come una panoramica di cui sono già a conoscenza

    
posta Jatin 28.11.2012 - 07:24
fonte

4 risposte

7

Diciamo che stai scrivendo un nuovo linguaggio di programmazione chiamato "XYZ". Il primo passo è scrivere un compilatore per questa lingua. Dal momento che questo nuovo linguaggio non esiste ancora, scrivi il compilatore in ... diciamo java. Lo chiameremo jxyz. Questa procedura è una classe tipica del college .

Ora hai un programma java (jxyz) che prende un file sorgente XYZ e produce un eseguibile. È quindi possibile intraprendere la scrittura di un compilatore per XYZ in XYZ conforme a jxyz.

A questo punto, hai un complier per XYZ che è stato rispettato con jxyz. Bene chiama questo programma 'xyzFromJ'.

'xyzFromJ' dovrebbe essere in grado di prendere se stesso come input e compilarsi rimuovendo completamente qualsiasi cosa creata da jxyz dalle dipendenze e dalla definizione della lingua. Da questo punto in poi, qualsiasi modifica al linguaggio XYZ può essere eseguita sul compilatore scritto in XYZ e compilato usando se stesso.

    
risposta data 28.11.2012 - 19:30
fonte
8

Passaggio 1. Scrivi il tuo compilatore in una lingua diversa.
Passaggio 2. Compilare il codice dal passaggio 1.
Passaggio 3. Scrivi il tuo compilatore nella stessa lingua.
Passaggio 4. Compilare il codice dal passaggio 3.

Ripeti i passaggi 3-4 per ulteriori aggiornamenti al tuo compilatore.

Nota che i passaggi 1 e 3 possono accadere simultaneamente o in un ordine diverso.

Ammetto che si tratta di una semplificazione eccessiva.

    
risposta data 28.11.2012 - 07:49
fonte
5

Diversamente da altre risposte che suggeriscono di scrivere il compilatore in un altro linguaggio (presumibile che viene eseguito sulla stessa macchina a cui si sta mirando), è anche possibile (in realtà preferibile) scrivere il compilatore nella lingua di destinazione dall'inizio.

Supponiamo di voler scrivere un compilatore per C per un processore ARM. Hai già un compilatore C che gira su Windows (architettura Intel). Scrivi il tuo nuovo compilatore in C, sia il front end (analisi lessicale e analisi), sia il back-end (generazione del codice). Ovviamente il back-end è stato scritto per generare codice per ARM, non per Intel.

Quindi si compila il sorgente per il nuovo compilatore con il compilatore esistente. Una volta che sei soddisfatto che il compilatore stia generando un codice valido per l'ARM, prendi il codice ARM compilato ed eseguilo sull'architettura ARM di destinazione. Ora hai la fonte per il nuovo compilatore, che può essere modificato e alimentato nel suo eseguibile e generare una nuova versione.

Questo processo è chiamato cross-compiling. Il vantaggio è che devi solo scrivere il compilatore una volta.

    
risposta data 28.11.2012 - 21:30
fonte
3

da un'altra risposta:

Step 1. Write your compiler in a different language.
Step 2. Compile the code from Step 1.
Step 3. Write your compiler in the same language.
Step 4. Compile the code from step 3.

I passaggi 1 e 2 sono necessari solo per il compilatore "first ever" per una nuova lingua. Esistono molte varianti nei passaggi 3 e 4, quindi ad esempio è possibile scrivere il generatore di codice per una nuova architettura, eseguire la compilazione incrociata, quindi eseguire lo stesso compilatore su una nuova macchina. Oppure puoi estendere il compilatore per gestire nuova sintassi e costrutti senza utilizzare alcuna delle estensioni, quindi riscrivi il compilatore per utilizzare le estensioni e compilare se stesso.

    
risposta data 28.11.2012 - 08:00
fonte

Leggi altre domande sui tag