Commenti
- Consulta gli articoli di Wikipedia su self-hosting e Bootstrapping del compilatore .
- Vedi anche programmers.stackexchange.com/questions/167277
- Forniscono solo una panoramica, sono a conoscenza del programma di bootstrap e self-hosting ma desidero dare unocchiata ad alcuni semplici esempi
- rano. org / bcompiler.html
- vedi anche: Perché i compilatori self-hosting sono considerati un rito di passaggio per nuove lingue?
Risposta
Supponiamo che tu stia scrivendo un nuovo linguaggio di programmazione chiamato “XYZ”. Il primo passo è scrivere un compilatore per questo linguaggio. Dato che questo nuovo linguaggio non esiste ancora, scrivi il compilatore in … diciamo java. Lo chiameremo jxyz. Questa procedura è una tipica classe al college .
Ora hai un programma java (jxyz) che accetta 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 compilatore per XYZ conforme a jxyz. Chiamate 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 del linguaggio. Da questo punto in poi, qualsiasi modifica al linguaggio XYZ può essere eseguita sul compilatore scritto in XYZ e compilato utilizzando se stesso.
Risposta
Passaggio 1. Scrivi il compilatore in una lingua diversa.
Passaggio 2. Compila il codice dal Passaggio 1.
Passaggio 3. Scrivi il compilatore nella stessa lingua.
Passaggio 4. Compila il codice da passaggio 3.
Ripeti i passaggi 3-4 per eventuali ulteriori aggiornamenti al compilatore.
Tieni presente che i passaggi 1 e 3 possono avvenire contemporaneamente o in un ordine diverso.
Ammetto che questa sia una semplificazione eccessiva.
Commenti
- @RobertHarvey: Nel passaggio 4, non ho specificato quale compilatore usare apposta in modo che " ripeti i passaggi 3-4 " abbia più senso.
- Ha vinto ' Il passaggio 4 funziona solo se utilizzi un compilatore che riconosce la nuova lingua?
- @RobertHarvey: Sì, ma deliberatamente non ' t specif in modo che " Ripeti i passaggi 3-4 " non significava che " utilizzi il compilatore dal passaggio 1 ", poiché ciò vanificherebbe lo scopo dellesercizio. Ho pensato che fosse ovvio che dovresti usare il compilatore dal passaggio 1 alla prima iterazione (è ' è lunico compilatore che hai) e il compilatore generato dalla precedente iterazione di Step 3 su ogni iterazione aggiuntiva.
Risposta
A differenza di altre risposte che suggeriscono di scrivere il compilatore in unaltra lingua (presumibile che gira sulla stessa macchina che stai prendendo di mira), è anche possibile (in realtà preferibile) scrivere il compilatore nella lingua di destinazione dallinizio.
Supponiamo che tu voglia 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 front end (analisi lessicale e parsing), sia back end (generazione di codice). Il back-end ovviamente è scritto per generare codice per ARM, non Intel.
Quindi compili il sorgente per il nuovo compilatore con il compilatore esistente. Una volta che sei soddisfatto che il compilatore sta generando codice valido per ARM, prendi il codice ARM compilato ed eseguilo sullarchitettura ARM di destinazione. Ora hai il sorgente per il nuovo compilatore, che può essere modificato e inserito nel suo eseguibile e generare una nuova versione.
Questo processo è chiamato cross-compilazione. Il vantaggio è che hai solo per scrivere una volta il compilatore.
Rispondi
da unaltra 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 “primo” compilatore di una nuova lingua. Ci sono molte variazioni nei passaggi 3 e 4, quindi per esempio puoi 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 tuo compilatore per gestire nuova sintassi e costrutti senza utilizzare nessuna delle estensioni, quindi riscrivere il compilatore per utilizzare le estensioni e compilare se stesso.