2009-10-12 3 views
6

Ho un'esperienza sulle frasi del compilatore e sono interessato ai linguaggi di programmazione & Campo Compilatori e spero che qualcuno mi dia qualche spiegazione su quale sia il buon approccio per scrivere un nuovo compilatore da zero per un nuovo linguaggio di programmazione? (Intendo STEPS).Qual è l'approccio corretto per creare un nuovo compilatore?

risposta

9

Il primo passo è leggere lo Dragon Book.

Offre una buona introduzione all'intero campo della compilazione del compilatore, ma fornisce anche dettagli sufficienti per crearne di nuovi.

Per quanto riguarda i seguenti passaggi, suggerisco di seguire i capitoli del libro. Non è scritto come un tutorial, ma offre comunque molti consigli pratici, che lo rendono un hub ideale per le tue idee e ricerche.

+2

Per favore ragazzi, dovreste * davvero * smettere di citare il libro del drago ... È uno dei peggiori libri di compilazione in circolazione. Puoi citare Appel, Cooper, ecc. Ma * per favore * non il Libro del Drago. – tonfa

+1

"Modern Compiler Implementation" (Appel) è scritto molto male e "Engineering a Compiler" (Cooper) non è molto adatto ai principianti. –

+0

Non può essere peggio dell'arcano Libro del Drago. Personalmente non ho trovato il Tiger Book scritto male, anche se non l'ho mai letto dall'inizio alla fine, ho scoperto che ha molte intuizioni molto buone. – tonfa

3

Vorrei esaminare l'integrazione del langauge/front end con il framework GNU del compilatore.

In questo modo solo (SOLO!) È necessario scrivere il parser e il traduttore nel formato di oggetti portatili di gcc. Otterrai l'ottimizzatore, la generazione del codice oggetto per il chip preferito, il linker ecc. Gratis.

Un'altra alternativa sarebbe quella di indirizzare una JVM Java, la macchina virtuale è ben documentata e il set di istruzioni JVM è molto più affidabile del codice macchina x86.

+1

Dipende da cosa si vuole fare. Se vuoi davvero sapere come tutto funziona da zero, GCC è un modo molto confusionario. –

5

Si prega di non utilizzare il libro del drago, è vecchio e per lo più obsoleto (e usa nomi strani per la maggior parte delle cose).

Per i libri, consiglierei il Tiger Book di Apple o Cooper's Engineering un compilatore. Mi piacerebbe fortemente suggerisco di utilizzare un quadro di come llvm in modo da non dover re-implementare un sacco di roba per la generazione di codice ecc

Ecco il tutorial per costruire la vostra lingua con LLVM: http://llvm.org/docs/tutorial/

2

Sono riuscito a scrivere un compilatore senza alcun libro particolare (anche se avevo letto alcuni libri compilatori in passato, ma non nei dettagli reali).

La prima cosa da fare è giocare con uno qualsiasi degli strumenti del tipo "Compilatore" (flex, bison, antlr, javacc) e far funzionare la grammatica. I grammati sono per lo più semplici, ma ci sono sempre frammenti che si intromettono e rovinano tutto. Soprattutto cose come espressioni, precedenza, ecc.

Alcuni dei più vecchi linguaggi più semplici sono più semplici per un motivo. Rende i parser "Just Work". Prendi in considerazione una variante Pascal che può essere elaborata esclusivamente attraverso la modalità ricorsiva.

Lo dico perché senza la tua grammatica non hai una lingua. Se non riesci ad analizzarlo correttamente, non arrivi da nessuna parte molto velocemente. E guardare una dozzina di righe di codice di esempio nella tua nuova lingua si trasforma in un gran numero di token e i nodi di sintassi sono davvero incredibili. In un modo "wow, funziona davvero". È letteralmente quasi un "tutto funziona" o "niente funziona", specialmente all'inizio. Una volta che funziona, senti che potresti essere in grado di farlo davvero.

E in un certo senso è vero, perché una volta ottenuta questa parte, devi far partire il tuo runtime fondamentale. Una volta ottenuto "a = 1 + 1" compilato, la maggior parte del nuovo lavoro è dietro il tuo e ora hai solo bisogno di implementare il resto degli operatori.Diventa fondamentalmente un esercizio di gestione di tabelle di ricerca e riferimenti e di avere un'idea di dove ci si trova in qualsiasi momento nel processo.

Puoi uscire da solo con una sintassi nuova di zecca, un runtime innovativo, ecc. Ma se hai tempo, è probabilmente meglio fare un linguaggio che è già stato fatto, solo per capire e attuare tutti i passaggi e pensaci se stavi scrivendo la lingua che vuoi veramente, come faresti quello che stai facendo con questo esistente in modo diverso.

Ci sono molti meccanismi per scrivere il compilatore e basta fare il processo con successo una volta che ti darà molta più sicurezza quando vuoi tornare e farlo di nuovo con la tua lingua.