2010-01-05 20 views
23

Sto eseguendo il bootstrap di un compilatore di linguaggio di programmazione su LLVM. Attualmente ho finito di scrivere un compilatore per un sottoinsieme di C che è auto-compilante. Quando avrò finito, riavvierò il mio linguaggio da C, mantenendo l'auto-compilazione mentre vado.Avvio automatico di una lingua su LLVM

Poiché il compilatore è auto-compilante, tutte le funzionalità di C che utilizzo dovranno essere implementate. Quindi è un bilanciamento costante: se uso troppe funzionalità dovrò implementare più di quanto vorrei, ma se non implementerò abbastanza funzionalità sarà difficile scrivere codice.

Una di queste funzionalità è l'associazione LLVM. Generare una rappresentazione intermedia LLVM senza le associazioni LLVM C è difficile. Tuttavia, se io uso i binding LLVM, devo implementarli di nuovo quando mi allontano da C.

Sto avendo qualche difficoltà qui, quindi sono alla ricerca di soluzioni alternative. Qualche idea?

+0

Cosa stai scrivendo il compilatore a? C? Stai utilizzando LLVM per la compilazione del codice macchina? –

+0

Il mio compilatore è scritto nel sottoinsieme di C che compila. Scusa, non ho spiegato bene. Il mio piano attuale è quello di scrivere la rappresentazione intermedia di LLVM in un file e quindi utilizzare LLVM per compilarlo, ma è complicato e sto cercando una soluzione più pulita. – Imagist

+0

LLVM è un'ottima scelta per il back-end, a proposito. Ho avuto fortuna con questo. –

risposta

10

È possibile utilizzare le associazioni LLVM C, ma ciò richiede che la propria lingua comprenda abbastanza C per farlo.

Un'altra alternativa è scrivere il linguaggio assembly LLVM (un file di testo) e utilizzare llvm-as per trasformarlo in bitcode.


Modifica:

Ho riletto la tua domanda, penso che tu abbia già capito l'llvm-as rispetto alle cose vincolanti.

La tua lingua probabilmente vorrà essere in grado di associare a C comunque per le librerie di supporto, ecc. Usa le associazioni C per ora e scrivi le tue associazioni quando vai avanti.

+0

Non avevo considerato che le associazioni C potessero essere una soluzione * temporanea *. Buona idea. – Imagist

1

A un certo punto, probabilmente vorrai fornire un'API per il wrapping delle librerie C come moduli di estensione. LLVM potrebbe già supportare questo (so che il pappagallo vm lo fa). Perché non usare il sistema di estensione che usi per avvolgere l'API di LLVM? Potrebbero già supportare anche quello. :)