2011-02-08 21 views
30

Ho sentito che google app engine può eseguire qualsiasi linguaggio di programmazione che può essere trasformato in bytecode Java tramite il suo JVM. Mi chiedevo se sarebbe stato possibile convertire bytecode LLVM in bytecode Java poiché sarebbe interessante eseguire le lingue supportate da LLVM nel Google App Engine JVM.È possibile trasformare il bytecode LLVM in bytecode Java?

+0

AFAIK LLVM è una libreria a livelli di astrazione hardware/OS anziché una macchina virtuale di codice byte. Fornisce alcuni degli stessi vantaggi, ma deve essere compilato dal sorgente per ogni piattaforma di destinazione. –

+3

@Peter: No, puoi interpretarlo e JIT-compilarlo ('lli'). Ma sì, le istruzioni sono molto più di basso livello e non sono molto simili ad altre macchine virtuali. – delnan

+0

@ Ben, si prega di riconsiderare la risposta accettata alla luce di ciò che cito in http://stackoverflow.com/a/13540256/304330, grazie. –

risposta

25

Ora sembra possibile convertire il bytecode IR LLVM in bytecode Java, utilizzando LLJVM interpreter.

C'è un interessante Disqus comment (21/03/11) da Grzegorz di kraytracing.com che spiega, insieme al codice, come egli ha modificato routine di output classe Java di LLJVM di emettere classi Java non monolitici, che concordano in numero con l'ingresso Moduli C/C++. Egli suggerisce che la sua tecnica sembra evitare le troppo lunghe definizioni di argomenti del metodo Costruttore Java "composte" solitamente generate da LLJVM e fornisce collegamenti alle sue modifiche ed esempi.

Sebbene LLJVM non sembra come se fosse stato in fase di sviluppo per un paio d'anni a questa parte, la sua ancora ospitato su GitHub e alcuni documenti si possono trovare ancora al suo ex repository in GoogleCode:

LLJVM @ Github
LLJVM documentation @ GoogleCode

Mi sono imbattuto anche nel progetto "Proteuscc" che utilizza anche LLVM per generare codice Java Byte (suggerisce che questo è specifico per C/C++, anche se presumo che il progetto possa essere modificato o alimentato LLVM Intermediate Representation (IR)). Da http://proteuscc.sourceforge.net:

Il processo generale di produzione di un Java eseguibile con Proteus allora può essere riassunto come di seguito.

  1. Genera la rappresentazione leggibile del rappresentazione (file ll) intermedio LLVM
  2. passare questo file di ll come argomento al sistema di compilazione Proteus
  3. È possibile che questo produrrà un file jar Java che può essere eseguito o utilizzato come una libreria

ho esteso a bash script to compile the latest versions of LLVM and Clang on Ubuntu, può essere trovato come 012.329..

[UPDATE 31/03/14] - LLJVM è sembrato di essere stato morto da somewhile, tuttavia Howard Chu (https://github.com/hyc) sembra di aver fatto LLJVM compatibile con l'ultima versione di LLVM (3.3). Vedi Howard's LLJVM-LLVM3.3 branch at Github, here

7

Dubito che è possibile, almeno non senza uno sforzo significativo e astrazioni run-time (ad esempio, costruendo mezzo macchina Von Neumann per eseguire determinati codici opzionali). Il codice bitcode LLVM consente l'intera gamma di funzioni di basso livello "fai ciò che vuoi ma non elimineremo il disordine", dall'allocazione diretta, grezza, senza memoria del costruttore fino a cast completamente deselezionati - cast reali, non conversioni - puoi prendere i32 e bitcast a un %stuff * se lo desideri. Inoltre, le JVM sono fortemente orientate verso oggetti e metodi, mentre i ragazzi di LLVM sono fortunati che abbiano puntatori e strutture di funzioni.

D'altra parte, sembra che C can be compiled to Java bytecode e LLVM bitcode can be compiled to Javascript (sebbene manchino molte funzionalità, ad esempio il caricamento dinamico e le funzioni stdlib), quindi dovrebbe essere possibile, con sufficiente sforzo.

+0

Quindi il bitcode LLVM è molto più vicino all'assembly rispetto al Bytecode Java, quindi dovrei in qualche modo "reclamare" tutte le informazioni "perse" quando un programma viene convertito nella rappresentazione di livello inferiore se volevo eseguirlo in una JVM. Quale immagino sia piuttosto impossibile. –

+2

@Ben: Sì, è un assemblaggio molto più portatile (bene, più o meno) ... in un modo ancora più di basso livello rispetto a C. Non solo si dovrebbe fare un bel po 'di lavoro quando si esegue il reverse engineering, ad es. Codice Ada compilato con 'llvm-gcc', almeno C e C++ possono fare molte cose Java bytecode semplicemente non lo consente (nel bene o nel male). Allo stesso modo, LLVM consente queste cose ma la JVM no. – delnan

+0

L'esempio classico che uso è: 'char * vga = (char *) 0xB8000'. LLVM può gestirlo bene. Abbastanza sicuro bytecode JVM non può. – Qix

0

Leggi questo: http://vmkit.llvm.org/. Non sono sicuro che ti aiuterà ma sembra pertinente.

Nota: Questo progetto non è più aggiornato.

+6

È il contrario (consente la creazione di VM basate su LLVM che eseguono le lingue e.g.Java/JVM su LLVM, OP desidera eseguire le lingue LLVM sulla JVM). – delnan

+0

Fwiw, seguendo questo link: "Il progetto VMKit è in pensione." – michael

0

Tardi alla discussione: Sulong esegue LLVM IR sulla JVM. Crea nodi eseguibili (che sono oggetti Java) da LLVM IR invece di convertire il codice LLVM da IR a codice bytecode Java. Questi nodi eseguibili formano un interprete AST. È possibile controllare il progetto allo https://github.com/graalvm/sulong o leggere un documento a riguardo al numero http://dl.acm.org/citation.cfm?id=2998416. Disclaimer: sto lavorando a questo progetto.

Problemi correlati