2015-03-22 32 views
5

Per motivi di riservatezza, potrei non essere in grado di descrivere nei dettagli del punto pin, ma qui è lo scenario.Come posso iniziare a scrivere un transpiler? È possibile?

Diversi dispositivi con app in streaming hanno lingue diverse con apis differenti, sebbene ottengano lo stesso risultato. Quindi, quando vuoi scrivere un'app di streaming per una piattaforma, devi iniziare da zero mentre copi la stessa app per un'altra piattaforma, che sta scrivendo una logica ridondante. Voglio progettare un transpiler, che prende il codice in una lingua e produce codice per tutte le lingue native, tipo da 1 a molti, ma non sono sicuro di come iniziare e non riesce a trovare abbastanza riferimenti su Internet. È anche fattibile per farlo? le lingue di destinazione includono varianti di javascript e principalmente java.

+0

Si scrive un transpiler creando un parser per la lingua di origine, creando un albero di sintassi e quindi convertendolo in codice nella lingua di destinazione. A seconda dell'attività, potrebbe essere più semplice non scrivere un transpiler, ma semplicemente utilizzare la generazione di codice basata su modelli per creare codice per più piattaforme. – yole

+0

Ciao, potresti fornire un collegamento ad un esempio funzionante di esso per una lingua? –

+0

[CoffeeScript] (http://coffeescript.org/) è un transpiler che genera JavaScript. Controlla la sua sorgente annotata; questo dovrebbe essere abbastanza facile da capire. – yole

risposta

2

Si potrebbe voler guardare (o addirittura unirsi) a un progetto di compilazione open source come Haxe. È già in grado di compilare da codice sorgente Haxe a Java, JavaScript, C#, C++, NekoVM, Flash e Python (sperimentale).

Maggiori informazioni:

4

Un modo per farlo è utilizzare l'infrastruttura progettata per creare traduttori.

Molte persone pensano che questo significhi "un generatore di parser"; è in realtà ingenuo. Un buon traduttore deve analizzare la lingua, certo, ma la traduzione deve anche tenere traccia di ciò che significano i simboli, verificando che ciò che viene detto non è una sciocchezza, generando e ottimizzando il codice. Hai bisogno di molto più macchinario di un semplice parser (generatore) per farlo bene. Vedi Life After Parsing.

nostra DMS Software Reengineering Toolkit è un insieme di strumenti per la costruzione di analizzatori di programma e traduttori, anche per quanto solo un elemento di un generatore di parser molto forte.

DMS include anche un program transformation engine, che consente di scrivere regole di traduzione in termini di lingue da tradurre, if you see this, transform it to that. Scrivere regole di traduzione direttamente nella sintassi di superficie delle lingue di interesse rende più facile la scrittura, l'ispezione, il debug e la manutenzione.

Detto questo, scrivere un simile traduttore non è un compito facile; devi enumerare il set completo di costrutti di sintassi con la semantica implicita e capire come associarlo a una combinazione di sintassi della lingua di destinazione più librerie aggiuntive che potresti personalizzare sul lato target. Questo richiede mesi-uomo, plurale, anche per esperti, per traduttore.

DMS è agnostico su quali linguaggi di programmazione sono coinvolti. Devi definire le lingue che ti interessano; ha una grande stabilità di definizioni linguistiche (utili come fonti o obiettivi, a tua scelta) per linguaggi standard come Java e JavaScript. Questa stabile disponibile aiuta ad abbreviare il ciclo di sviluppo, ma generalmente non è il costo dominante.

C'è un santo graal di costruire un "traduttore universale" in cui si scrive un insieme di regole e tutto è peachy da allora in poi. Quell'idea è una fantasia. Vale la pena capire che un insieme di regole di traduzione dalla lingua A alla B, non è in realtà utile per tradurre la lingua da C a D, perché le regole combinano la conoscenza della sintassi specifica e della semantica implicita. Tuttavia, se si costruiranno più "transpilers", farlo su una base comune è un'enorme vittoria in termini di curva di apprendimento e manutenibilità a lungo termine.

Utilizzando strumenti come DMS, è possibile scrivere extremely accurate translators..

+2

È un peccato che SO sia così delezionista. Questo argomento è stato risolto solo di recente, quindi eliminato, all'indirizzo http://stackoverflow.com/questions/28968161/transcompiling-to-another-language/28970385#28970385, se SO mostrerà la pagina. –

+0

Questo argomento non è stato eliminato, fortunatamente. :) –

+0

Buono. Ora dovremmo farlo diventare libero (SOers, se ti piace l'altra risposta, vota per "sbloccarlo"). –

1

Sì, questo è possibile, e compilatori sono spesso scritti in questo modo.

L'idea generale è quella di creare un "linguaggio intermedio", quindi scrivere diversi traduttori a senso unico:

C#   => intermediate 
    JavaScript => intermediate 

    intermediate => C# 
    intermediate => JavaScript 

Mettere l'output di uno, nel prossimo, è possibile tradurre da una lingua all'altra:

C#   => intermediate => JavaScript 
    JavaScript => intermediate => C# 

Sfortunatamente il codice generato non sarà probabilmente umano.