È possibile fare una porta da un'applicazione C ++ a Java attraverso LLVM

8

quanto è fattibile portare un codice bytecode in Java bytecode usando LLVM (suppongo LLJVM)?

Il fatto è che al momento abbiamo un processo scritto in C ++ ma un nuovo client ha reso obbligatorio essere in grado di eseguire il programma in modo multipiattaforma, utilizzando la Java Virtual Machine con ovviamente nessun codice (no JNI). L'idea è di essere in grado di prendere il jar generato e di copiare poi su sistemi diversi (Linux, Win, 32 bit - 64 bit) e dovrebbe funzionare.

Guardarsi intorno sembra possibile compilare codice C ++ in LLVM IR e poi quel codice in codice java java. Non è necessario che il codice generato sia leggibile.

Ho provato un po 'con cose simili usando emscripten, questo prende il codice C ++ e lo compila in JavaScript. Il risultato è JS valido ma totalmente illeggibile (sembra assambler).

  • Qualcuno ha fatto una porta di un'applicazione dal bytecode C ++ a Java usando questa tecnica?
  • Quali problemi possiamo affrontare?
  • È un approccio valido per il codice di produzione?

Per rendere più chiaro il mio punto dopo alcuni commenti, forse la porta non è ben usata, non mi aspetto un codice sorgente leggibile come risultato, solo il bytecode java, quindi non è una 'porta' che sarà sviluppata per più, solo che la piattaforma di destinazione deve essere la JVM java non quella nativa assamblear.

Nota: sono al corrente che al momento abbiamo alcune librerie C ++ non standard e di chiusura, stiamo cercando di rimuovere questo codice non standard e tutte le librerie di sorgenti chiuse e usare il software Free Libre Open Source, quindi supponiamo che tutto il codice sia standard Codice C ++ con tutto il codice disponibile al momento della compilazione.

Nota 2: Non è un'opzione per scrivere codice C ++ portatile e quindi compilarlo sulla piattaforma di destinazione desiderata, il programma compilato deve essere multipiattaforma, quindi l'uso di JVM.

Nota 3: Al momento non stiamo esaminando soluzioni simili applicate a Python o ad altre basi linguistiche, ma mi piacerebbe anche sentirne parlare. Con questo intendo che il nostro eseguibile di destinazione deve essere un bytecode java, ma se ci sono opzioni per compilare C ++ su codice Python compilato valido vorrei anche sentirmi parlare di loro.

    
posta Javier Mr 30.10.2013 - 09:52
fonte

1 risposta

10

Dubito davvero che funzionerà. Potrebbe essere possibile tradurre il codice in codice byte Java, ma non tradurre magicamente le chiamate di libreria in chiamate equivalenti al runtime Java e alle librerie. Potrebbero non esserci nemmeno chiamate di runtime Java equivalenti! Anche se elimini tutte le librerie proprietarie, rimani ancora con la libreria standard C ++.

Per renderlo concreto: il tuo programma C ++ può contenere una chiamata a fprintf (). Quella funzione è implementata nella libreria standard C ed è perfettamente legittimo che un programma C ++ la chiami. Il traduttore da LLVM a LLJVM probabilmente non individuerà magicamente la sequenza di chiamate in fase di esecuzione Java che produrranno il risultato equivalente a fprintf () e sostituiranno quelli in entrata. Per fornire tale funzionalità è necessario essenzialmente reimplementare i runtime C e C ++ in Java codice byte.

Ci sono alcuni strumenti che eseguono la traduzione da C ++ a Java, ma convertono solo una manciata della libreria runtime più semplice chiamate. Il resto è lasciato a te per capire.

    
risposta data 31.10.2013 - 22:37
fonte

Leggi altre domande sui tag