È possibile creare una porta da un'applicazione C ++ a Java tramite LLVM


9

quanto è fattibile il porting di un'applicazione C ++ su bytecode Java usando LLVM (immagino LLJVM)?

Il fatto è che attualmente abbiamo un processo scritto in C ++ ma un nuovo client ha reso obbligatorio essere in grado di eseguire il programma in un modo multipiattaforma, utilizzando Java Virtual Machine ovviamente senza codice nativo (senza JNI). L'idea è quella di essere in grado di prendere il vaso generato e copiarlo su sistemi diversi (Linux, Win, 32 bit - 64 bit) e dovrebbe funzionare.

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

Ho provato un po 'con cose simili usando emscripten, questo richiede 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 da C ++ a bytecode Java usando questa tecnica?
  • Quali problemi potremmo affrontare?
  • È un approccio valido per il codice di produzione?

Per rendere più chiaro il mio punto dopo alcuni commenti, forse la porta non è ben utilizzata, di conseguenza non mi aspetto un codice sorgente leggibile, solo jtecode bytecode, quindi non è una "porta" che verrà sviluppata per più, solo che il la piattaforma di destinazione deve essere la JVM java e non l'assamblear nativo.

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

Nota2: 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: In questo momento non stiamo esaminando soluzioni simili applicate a Python o ad altre lingue, ma vorrei anche sentirne parlare. Con questo intendo che il nostro eseguibile di destinazione deve essere bytecode java ma se ci sono opzioni per compilare C ++ in codice compilato Python valido, vorrei anche sentirne parlare.


non so cosa intendi per l'ultima frase su Python, ma Jython è esattamente lo stesso: usa JVM invece della Python VM, e usato esattamente in quello scenario: i programmatori vogliono usare Python, la distribuzione deve essere su JVM.
Javier,

Di quante righe di codice stiamo parlando? Potrebbe valere la pena riscriverlo, ma non è una decisione semplice. Inoltre, se il tuo codice esegue qualche aritmetica del puntatore, sarei curioso di sapere come viene gestito quando si lavora su JVM.
Levi Morrison,

1
Debug che dovrebbe essere divertente O_o
Daniel Gratzer,

@LeviMorrison. Bene, il codice è piuttosto esteso (dipendenze da varie librerie per le comunicazioni, funzioni di utlità) ma si presume che abbiamo tutto il codice disponibile al momento della compilazione. E anche se un altro client non lo richiede, genereremo comunque il file binario nativo.
Javier,

@jozefg. A proposito dell'aritmetica del puntatore e del debugging proposti, non mi aspetto di essere debuggable. Emscripten, ad esempio, fa la stessa cosa ma la lingua di destinazione è Javascript, finisci solo con un grande array di byte come le operazioni heap e bit saggia per il contatore del programma e solo operazioni con byte senza oggetti, stringhe o cose del genere. Mi aspetto un risultato simile a quello di assamblear nel bytecode java, si potrebbe presumere che non sia debuggabile.
Javier,

Risposte:


11

Dubito davvero che funzionerà. Potresti riuscire a tradurre il tuo codice in codice byte Java, ma non tradurrà magicamente le chiamate delle librerie in chiamate equivalenti al runtime e alle librerie Java. Potrebbero anche non esserci chiamate equivalenti al runtime Java! Anche se elimini tutte le librerie proprietarie, rimani comunque con la libreria standard C ++.

Per rendere concreto questo: il tuo programma C ++ può contenere una chiamata a fprintf (). Tale funzione è implementata nella libreria standard C ed è perfettamente legittimo per un programma C ++ chiamarla. Il traduttore da LLVM a LLJVM probabilmente non riuscirà a capire magicamente la sequenza delle chiamate di runtime Java che produrrà il risultato equivalente a fprintf () e sostituirà quelli in. Per fornire quella struttura richiederebbe essenzialmente reimplementare i runtime C e C ++ in Java codice byte.

Esistono alcuni strumenti che eseguono la traduzione da C ++ a Java, ma convertono solo una manciata di chiamate alla libreria di runtime più semplici. Il resto ti resta da capire.


Vedo il tuo punto, ma per quanto ho capito emscripten fa qualcosa di simile con l'obiettivo di essere Javascript, se non ho capito male emscripten fornisce una libreria standard personalizzata al fine di evitare ciò che hai sottolineato (e persino mappature per webGL attraverso la libreria SDL ). Ma non riesco a trovare l'equivalente per Java (LLJVM sembra abbandonato). Sto pensando di proporre bytecode llvm come una build indipendente dalla piattaforma (ovviamente senza rami di compilazione a seconda della piattaforma, dell'API o dei dati; utilizzo apro simili)
Javier Mr

3
lljvm fornisce una libreria di runtime C, in parte come C compilata in bytecode JVM e in parte come classi Java. È una libc abbastanza completa. Dovresti creare l'equivalente per libstdc ++. Anche il backend di lljvm attualmente non supporta C ++. Ho provato a sistemare lljvm per lavorare con una build llvm più recente. È lento poiché le API e gli strumenti di llvm continuano a cambiare molto tra le versioni. Puoi seguire qui, è quasi in forma utilizzabile ora. github.com/hyc/lljvm/tree/llvm3.3
hyc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.