Come tradurre da un linguaggio di programmazione a un altro?

0

Voglio scrivere un piccolo DSL che dovrà compilare un altro linguaggio di programmazione di alto livello (simile a C, ma molto più limitato).

Qual è la panoramica di alto livello su cosa dovrebbe fare il compilatore?

Per chiarire, sono particolarmente interessato alla conversione da un linguaggio di programmazione di alto livello a un altro linguaggio di programmazione di livello relativamente alto, non nella compilazione in generale.

    
posta m fran 15.06.2015 - 14:48
fonte

2 risposte

4

To clarify, I'm especially interested into a conversion from an high level programming language to another relatively high level programming language, not in compilation in general.

Bene, ho alcune brutte notizie per te - la traduzione da una lingua all'altra è una compilazione in generale. Pensare di poter saltare i passaggi perché lavori con linguaggi di alto livello o perché la tua lingua è molto limitata ti procurerà solo dei problemi.

I compilatori sono una specie di software ben studiato, ben noto e ben documentato. L'approccio standard per costruirli non è complicato come potrebbe sembrare, e l'approccio generale salverà un mucchio di grattacapi e complessità lungo la strada affrontando le imbarcazioni di casi angolari che comprendono anche le più semplici lingue.

    
risposta data 15.06.2015 - 15:22
fonte
0

Se stai traducendo alcuni DSL in qualche codice C generato (o qualcosa di simile), guarda prima questo e che risponde.

In realtà sto facendo lo stesso all'interno di MELT , una lingua specifica del dominio Lispy per estendere compiler GCC

Non hai spiegato a quale tipo di DSL stai pensando, e come sarebbe stato usato il codice C generato. Generate un programma standalone o qualche "plugin" o "libreria"?

Un problema significativo è la gestione della memoria. Dovresti assolutamente leggere la raccolta dei rifiuti (ad esempio, leggi manuale GC ).

Ovviamente, traduzione di una lingua di dominio di alto livello su C (o qualche altro linguaggio simile a C o anche qualsiasi linguaggio di programmazione che sia di livello inferiore rispetto al DSL) è qualche forma di compilazione .

Se hai tradotto da una DSL di livello inferiore a una lingua di livello superiore, puoi leggere su decompilation e forse analisi binaria statica .

BTW, anche per un "piccolo DSL" e un linguaggio di destinazione semplice tipo C (o Pascal), è molto lavoro (probabilmente almeno un anno).

Ciò che genera un linguaggio simile a C (con una buona implementazione del compilatore) ti porta a lavorare meno sulle tecniche di ottimizzazione all'interno del tuo compilatore, con la speranza realistica che il C (o Pascal , etc ...) il compilatore che stai generando il codice sarebbe in grado di ottimizzare il tuo codice generato. Potresti anche considerare di generare Gimple (con il nuovo libgccjit dal recente GCC ) o LLVM o usa qualche altra libreria JIT (es. libjit ).

    
risposta data 15.06.2015 - 15:35
fonte

Leggi altre domande sui tag