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?
risposta
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.
- Genera la rappresentazione leggibile del rappresentazione (file ll) intermedio LLVM
- passare questo file di ll come argomento al sistema di compilazione Proteus
- È 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
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.
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. –
@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
L'esempio classico che uso è: 'char * vga = (char *) 0xB8000'. LLVM può gestirlo bene. Abbastanza sicuro bytecode JVM non può. – Qix
Leggi questo: http://vmkit.llvm.org/. Non sono sicuro che ti aiuterà ma sembra pertinente.
Nota: Questo progetto non è più aggiornato.
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.
- 1. Analisi bytecode in Java
- 2. Pre-compilazione QML in bytecode, è possibile?
- 3. Cos'è l'iniezione bytecode Java?
- 4. variabili locali in bytecode Java
- 5. editor bytecode java?
- 6. Compilatore bytecode Java in JavaScript
- 7. È possibile scrivere direttamente un programma con istruzioni bytecode Java?
- 8. CPython è l'interprete bytecode?
- 9. Ottimizzazioni Java: solo bytecode vs JIT
- 10. Ottimizzazione del compilatore: bytecode Java
- 11. Comportamento diverso di bytecode java
- 12. Alternative alla strumentazione bytecode Java
- 13. Suggerimenti libreria manipolazione Bytecode Java
- 14. Can Coco/R può trasformare un file analizzato in bytecode?
- 15. come è rappresentato l'annotazione java in java bytecode
- 16. Progettazione Bytecode?
- 17. Compilare a bytecode java (senza utilizzare Java)
- 18. in esecuzione bytecode jython utilizzando java
- 19. Dovrei guardare il bytecode prodotto da un compilatore java?
- 20. E 'possibile visualizzare un codice di classe Java bytecode
- 21. Esiste un motore JavaScript che emette un bytecode LLVM?
- 22. Interpretare qualcosa ed eseguire il bytecode generato in Java?
- 23. dinamica bytecode strumentazione - problema
- 24. È possibile eseguire la manipolazione bytecode quando si utilizza OSGi?
- 25. Verifier Bytecode stand alone
- 26. Come leggere il bytecode python?
- 27. Confusione sull'istruzione bytecode checkcast?
- 28. Modifica ASM bytecode Java - Modifica corpi metodo
- 29. Informazioni su codice bytecode Java e JVM
- 30. equivalenti bytecode Java per ilasm/ildasm
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. –
@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
@ Ben, si prega di riconsiderare la risposta accettata alla luce di ciò che cito in http://stackoverflow.com/a/13540256/304330, grazie. –