2011-08-22 9 views
7

Voglio sapere quali sono le strategie per creare un traduttore di origine ai sorgenti creando la traduzione da un linguaggio di alto livello a un altro. I due modi che mi vengono in mente sonoCreazione di un convertitore di origine dall'origine

1- Cambiare albero di sintassi di una lingua ad un'altra lingua albero di sintassi 2- La modifica al linguaggio intermedio e quindi la conversione che per altro linguaggio ad alto livello

La mia domanda è che è possibile fare la conversione usando entrambe le strategie e che è più fattibile, chiunque può dare qualche riferimento a qualsiasi teoria o implementazione fatta da qualche convertitore come uno dei metodi sopra elencati. E c'è un linguaggio intermedio standard basato su xml, so che xmlvm usa xml come linguaggio intermedio ma non fornisce alcuna specifica appropriata della lingua intermedia.

+0

Vedere la mia risposta SO sulla traduzione tra i linguaggi di programmazione: http://stackoverflow.com/a/3460977/120163. Si tratta di veri e propri strumenti industriali per fare ciò, non la teoria. –

risposta

7

Qualsiasi compilatore è, approssimativamente, un traduttore sorgente-sorgente. La lingua di destinazione può essere un linguaggio assembly (o direttamente un linguaggio di codice macchina binario), o C, o qualsiasi altro linguaggio di alto livello che desideri. Quindi, il generale compilers theory è applicabile.

E proprio come un consiglio: una lingua intermedia non è normalmente sufficiente. Usare di più Usa dozzine di lingue intermedie, ciascuna diversa da una precedente in un solo aspetto minuscolo. In questo modo qualsiasi traduzione da lingua a lingua non è nient'altro che banale.

Un altro consiglio (anticipando i downvotes qui) - state lontani da XML, specialmente come una rappresentazione per AST s.

+2

Accetto con SK-logic su XML. Vedi http://stackoverflow.com/a/2831343/120163 per alcune discussioni sui (de) meriti di XML come rappresentazione AST. –

0

I convertitori di solito si basano sulla costruzione dell'albero semantico di un programma e quindi sulla sua riformulazione sul PL di destinazione. Ad esempio, dai un'occhiata a C# to Java convertor.

Il secondo approccio è anche possibile, ma l'organizzazione del codice può cambiare completamente dopo la conversione. Quindi, è meglio mantenere la struttura comune intermedia (IL, ST, ecc.) Il più alto livello possibile.

2

Guarderei LLVM, che può fare da sorgente a fonte. Sebbene l'output non sia carino, potrebbe fornire alcune buone idee.

+1

Può fare l'origine al sorgente per quali lingue? Penso che LLVM/Clang sia abbastanza cablato in C e C++ e che le altre lingue possano essere piuttosto difficili. –

+0

@Ira Baxter: LLVM ha un CBackend, che compila LLVM BitCode in C. LLVM ha anche un progetto di backend JavaScript, denominato emscripten. Quindi tecnicamente qualsiasi frontend che emette in LLVM, può utilizzare uno di questi backend. Questo non considera progetti in fase di sviluppo o progetti che saranno in fase di sviluppo. Esempi di frontend sarebbero Clang, llvm-lua, llvm-gcc, LDC ... ecc. Non è una "soluzione completa", ma se qualcuno stava lavorando su alcune idee e voleva che un codice fosse effettivamente visualizzato, sarebbe un posto dove inizio. – TechZilla

0

Prova Clang! È potente per la traduzione da sorgente a fonte. A partire da ora supporta pienamente C, C++, Objective C e Objective C++. Si potrebbe anche voler esaminare l'infrastruttura del compilatore ROSE.