Design del compilatore in Lisp

6

Con alcuni googling, ho potuto trovare facilmente alcuni documenti nella progettazione del compilatore in C, Java e C # e anche in Haskell , ma non in Lisp tranne per l'implementazione di Schema / Lisp in Lisp.

Lisp non è così popolare nell'implementazione di altri linguaggi di programmazione (non funzionali)? Conosci qualche buona documentazione sull'implementazione di un compilatore in LISP?

    
posta prosseek 31.08.2012 - 18:52
fonte

5 risposte

15

Penso che ci siano pochi esempi a causa della mancanza di motivazione.

Normalmente quando si implementa un compilatore o un interprete il punto sta aumentando il livello di astrazione. Ha molto senso implementare una scrittura assembler in codice macchina, quindi un compilatore C usando l'assemblatore, quindi un interprete Python usando il compilatore C ...

Stare sullo stesso livello o andare nella direzione opposta non è un non senso, ma molto meno naturale ... ed è fatto principalmente per la portabilità. Alcuni casi implementano un assemblatore (per un processore diverso o per un processore generico) utilizzando un linguaggio di livello superiore, eseguendo il bootstrap di un compilatore, implementando una macchina virtuale.

Con Lisp l'intera idea del livello di linguaggio non si adatta bene (qui intendo un Lisp completo che include macro generali complete, macro di lettore e che non è allergico agli effetti collaterali, non una versione autolimitata che consente solo template basato su macro o costringe a un modello di programmazione funzionale).

Lisp non è né un linguaggio di alto livello, né uno di basso livello ... più che un linguaggio Lisp è un meta-linguaggio in cui si modella la lingua che sarebbe l'ideale per risolvere il problema che si sta affrontando. Creare livelli di astrazione del linguaggio è solo normale programmazione in Lisp e non richiede un nuovo linguaggio, compilatore o interprete.

In Lisp non è necessario implementare una lingua completamente diversa se si ha bisogno di un'astrazione specifica (ad esempio eccezioni, oggetti), basta implementare quell'astrazione per l'uso all'interno di Lisp. Ci sono stati sistemi programmati dal controllo hardware fino all'intelligenza artificiale tutto in Lisp.

Ad esempio, in Common Lisp è disponibile il supporto per la programmazione orientata agli oggetti (e più sofisticato rispetto al C ++), ma se non fosse lì potrebbe essere solo codificato ... e in effetti era una normale libreria prima di Common Lisp. In C invece l'unico modo era di creare un compilatore completo da C ++ a C per poterci arrivare.

    
risposta data 01.09.2012 - 08:22
fonte
9

Le comuni macro Lisp sono compilatori. Se scrivi una macro che trasforma un codice in Common Lisp che può essere compilato da Common Lisp, allora non è un compilatore? Controlla alcuni libri di programmazione Common Lisp su Macro, e penso che qui troverai alcune informazioni molto utili. Consiglierei su Lisp e Let Over Lambda.

Un recente esempio pratico di utilizzo delle macro Common Lisp come trasformatore di codice / compilatore è CLPython , ma ci sono tutti tipi di DSL / altri esempi che utilizzano questa tecnica.

Un altro buon esempio è l'implementazione di Doug Hoyte di un compilatore Forth in Common Lisp; quello è alla fine di Let Over Lambda.

    
risposta data 31.08.2012 - 23:47
fonte
5

Suppongo che i libri su "l'implementazione di SCHEME / LISP in LISP" intendano tali titoli, come Lisp in Small Pieces .

Riguardo all'implementazione di altre lingue in Lisp, la tradizione è, in realtà, molto matura. Ad esempio, i primi prototipi di Smalltalk sono stati implementati in Lisp negli anni '70, mentre per un esempio più moderno puoi dare un'occhiata a CL-JavaScript . E a differenza di altri linguaggi, in cui c'è solo una strada da percorrere - lexing-parsing-intermediate transformation transformation-code generation - in Lisp ci sono 2 modi: quello convenzionale e basato sulla Lisp.

Riguardo al precedente approccio, in realtà non è diverso da altre lingue, quindi puoi iniziare con il libro del drago e applicare le stesse tecniche . Riguardo al secondo approccio, ha alcune limitazioni sintattiche, ma ha anche due vantaggi: usare il lexer e il parser configurabili integrati di Lisp e la possibilità di accedere a Lisp stesso e utilizzare le sue funzionalità insieme al linguaggio che stai implementando. Si chiama programmazione orientata alla DSL e alcuni dei migliori libri su di esso sono stati citati nelle risposte precedenti: On Lisp e Let Over Lambda .

    
risposta data 02.09.2012 - 08:42
fonte
0

I compilatori Lisp sono piuttosto convenzionali, tranne per il fatto che la fase di sintassi è molto più semplice. Sono le strutture di dati in lisp che sono inusuali rispetto ad altre lingue. Lisp si rivolge a una macchina virtuale con un insieme specifico di proprietà (diverse a seconda della variante). Google "lisp virtual machine"

    
risposta data 31.08.2012 - 19:22
fonte
0

I programmatori Lisp usano la lingua per risolvere compiti diversi dalla scrittura di un compilatore Lisp in sé.

Le implementazioni Lisp più comuni (non riesco a pensare ad un'eccezione al momento) sono compilate e i loro compilatori sono scritti in Lisp. Il codice è lì, solo forse non i documenti e le esercitazioni.

    
risposta data 23.09.2012 - 05:59
fonte

Leggi altre domande sui tag