5

Principalmente come esercizio di apprendimento, sto scrivendo una macchina virtuale, un assemblatore e un compilatore da zero, a seconda degli strumenti esterni.Risorse sulla conversione dell'albero della sintassi sull'assemblaggio?

Credo di avere una comprensione concettuale decente di come funzionano la macchina virtuale e l'assemblatore, nonché alcune parti del compilatore.

Ecco cosa voglio sapere: Nel compilatore, supponiamo di aver trasformato il codice sorgente in un albero di sintassi. Quale processo devo seguire per convertire quindi questo albero di sintassi in assembly?

(Supponiamo che alcune semplici costrutti del linguaggio, come se e mentre. Sto cercando una spiegazione minimale e semplice qui.)

Non sono particolarmente interessato a soluzioni complesse, o soluzioni basate su strumenti esistenti . Piuttosto, mi piacerebbe qualcosa sull'ordine di una descrizione ampia e ampia di idee sulle pagine che vanno dalla sintassi al montaggio.

Qualcuno sa di tale risorsa?

Grazie :)

+0

Sicuro. La 2a e 3a pagina del capitolo 1 di qualsiasi libro del compilatore. Ma penso che tu speri che sia tutto ciò di cui hai bisogno, e non è da poco tempo. Il problema è che tradurre linguaggi procedurali in * buon * codice macchina (anche per una macchina virtuale) richiede molti macchinari, e mentre quelle 2 pagine daranno un vago senso di ciò che è necessario, non si sarà in grado di costruire qualsiasi tipo di generatore di codice sensibile senza leggere le altre 200 pagine del libro del compilatore. –

risposta

6

La risposta ad una domanda obbligatoria compilatore è quello di leggere il libro Drago (compilatori: principi, tecniche e strumenti). Quando dici di aver trasformato il codice sorgente in un albero di sintassi, cosa intendi esattamente? Di solito il primo passo nell'analisi è creare un albero sintattico astratto (AST). Il passo successivo è solitamente l'attribuzione . Gli attributi sono proprietà dei nodi nell'AST che non hanno necessariamente nulla a che fare con la lingua di origine, ma sono essenziali per la generazione del codice. Di solito qui viene eseguita una sorta di controllo del tipo per determinare i requisiti di memoria e, nei linguaggi orientati agli oggetti, quale funzione deve essere chiamata. Ad esempio, se la tua fonte è obj1 = obj2 + obj3, non sai veramente cosa fare del segno più finché non determini il tipo di obj2.

Quindi, per dare una risposta alla tua domanda. 1) Analizza il codice sorgente su AST. 2) Attribuzione all'AST. 3) Genera codice intermedio (che immagini ti stai riferendo a come assemblaggio).

I capitoli 5 e 6 del libro del Drago trattano questo in dettaglio. La parte più difficile è capire quali sono gli attributi necessari per la generazione del codice. Inoltre, ci sono alcuni problemi complicati con le dichiarazioni if. Ad esempio, se la condizione if fallisce, sai che devi saltare un po 'di codice ma, almeno inizialmente, non sai quanto lontano. Il patching posteriore è una soluzione a questo problema.

Problemi correlati