Domanda

Qualcuno ha esperienza con questo? Sto lavorando su un decompilatore Java in questo momento in C ++, ma vorrei che un linguaggio di livello superiore eseguisse le trasformazioni effettive degli alberi interni. Sono curioso di sapere se il sovraccarico dei dati di marshalling tra le lingue valga il vantaggio di un linguaggio più espressivo e per articolare meglio ciò che sto cercando di realizzare (come Haskell). Questo è effettivamente fatto nel "mondo reale", o è solitamente scegliere una lingua all'inizio di un progetto e attenersi ad esso? Qualche consiglio da parte di chi l'ha tentato?

È stato utile?

Soluzione

Sono un grande sostenitore della scelta del linguaggio di programmazione giusto per ogni sfida. Se c'è un'altra lingua che gestisce facilmente compiti altrimenti complicati, direi di provarci.

Succede nel mondo reale? Sì. Attualmente sto lavorando a un progetto composto sia da PHP che da codice object-c.

Il trucco è, come hai sottolineato, la comunicazione tra le due lingue. Se possibile, lascia che ogni lingua si attenga al proprio dominio e fai comunicare le due sezioni nel modo più semplice possibile. Nel mio caso, si trattava di documenti XML inviati tramite http. Nel tuo caso, un tipo di file di testo formattato potrebbe essere la risposta.

Altri suggerimenti

I costi di smistamento dipendono dalle lingue e dall'architettura con cui stai lavorando. Ad esempio, se utilizzi CLR o JVM, sono disponibili soluzioni di interoperabilità a basso costo, anche se so che stai lavorando con C ++ probabilmente non gestito.

Un'altra strada è un linguaggio specifico del dominio incorporato. Le trasformazioni degli alberi sono spesso esprimibili tramite la corrispondenza dei modelli e l'applicazione di un numero relativamente piccolo di funzioni. Puoi prendere in considerazione la possibilità di scrivere un semplice pattern-matcher ad albero - ad es. qualcosa che assomiglia a Lisp s-exprs ma utilizza segnaposto per acquisire variabili - con azioni associate che sono funzioni che trasformano la sottostruttura abbinata.

John Ousterhout , l'inventore di Tcl / Tk è stato un forte sostenitore della programmazione multilingue e ne ha scritto ampiamente. Per farlo, hai bisogno di un meccanismo di interfaccia pulito tra le lingue che stai utilizzando per esso. Ci sono alcuni meccanismi per questo. Esempi di diversi meccanismi per farlo sono:

  • SWIG (Wrapper semplificato e Interface Generator può richiedere un c o c ++ (o diverse altre lingue) file di intestazione e generare un interfaccia per un linguaggio di alto livello come perl o python che lo consente per accedere all'API. Ci sono altri sistemi che lo utilizzano approccio.

  • Java supporta JNI e vari altri sistemi come quello di Python ctypes , VisualWorks DLL / C connect sono meccanismi nativi che ti permettono esplicitamente costruire la chiamata verso il basso sottosistema di livello.

  • Tcl / Tk è stato progettato esplicitamente per essere incorporato e ha una API nativa per una libreria C in cui aggiungere hook la lingua. I costrutti per questo assomiglia alle strutture argv [] in C, e sono stati progettati per farcela relativamente facile da interfacciare a programma C basato sulla riga di comando in Tcl. Questo è simile al precedente esempio, ma proveniente dal contrario direzione. Molti linguaggi di scripting come il supporto Python, Lua e Tcl questo tipo di meccanismo.

  • Meccanismi di colla espliciti come Pyrex , che sono simili a un generatore di wrapper, ma hanno il loro propria lingua per la definizione di interfaccia. Pyrex è in realtà un linguaggio di programmazione completo. Middleware come COM o CORBA consente un generico definizione dell'interfaccia da costruire esternamente all'applicazione in un linguaggio di definizione dell'interfaccia e collegamenti linguistici per il lingue interessate a utilizzare il meccanismo di interfaccia comune.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top