web-dev-qa-db-fra.com

Y a-t-il un llvm Java front end qui convertit Java source en forme intermédiaire de llvm?

D'après ce que j'ai lu, il existe un programme llvm qui convertit Java bytecode en forme intermédiaire de llvm appelée class2llvm. Ma question est de savoir comment y accéder. Quel front-end dois-je installer afin d'y accéder.

VMkit est leur implémentation d'une JVM, mais je cherche comment compiler le code source Java avec llvm, pas comment l'exécuter.

51
FeelTheBurns

Le Java frontend traduit Java bytecode (fichiers .class) en LLVM bytecode. Jetez un œil à ce lien:

https://llvm.org/svn/llvm-project/Java/trunk/docs/Java-frontend.txt

31
Ashkan

Vous pouvez jeter un œil à dragonegg , qui permet à llvm d'utiliser les frontends de gcc. Comme gcc a déjà un frontend pour Java, appelé gcj , peut-être que llvm pourra l'utiliser pour compiler Java code. Mais Je ne sais pas dans quelle mesure llvm s'interface avec l'interface gcc, donc cela peut ne pas fonctionner.

6
lei_z

J'ai exécuté une classe Java utilisant vmkit ( http://vmkit.llvm.org/ ) basée sur LLVM. Elle utilise LLVM pour compiler et optimiser le haut niveau langages au code machine J3 est une implémentation d'une machine virtuelle Java avec VMKit.

3
Ashkan

[ REMARQUE: à partir de novembre 2015, il n'est plus open source, donc ce hack est pour la plupart inutile. ]

RoboVM pourrait devenir la solution que vous recherchez. Il est open source et compile le bytecode JVM (fichiers .class) en code machine.

Je suppose qu'ils le font en utilisant quelque chose comme class2llvm.

Malheureusement, il est toujours en alpha. Je viens de le tester sur HelloWorld.Java. Il a permis d'accélérer 5 fois le temps de chargement sur un seul cœur. (La plupart du temps d'exécution est le temps de chargement.)

echo Hello World! : <1 ms : 31K (/ Usr/bin/echo binaire)

Java HelloWorld : ~70 ms : 0.4K (Bytecode HelloWorld.class JVM)

./HelloWorld : ~13 ms : 9.4MB (9,3 Mo binaire + 57 Ko robovm-rt.jar)

Notez que Java appelle un fichier 32 Mo $ Java_HOME/lib/rt.jar (et peut-être plus). La recherche dans un fichier aussi volumineux doit être une des raisons pour lesquelles Java est si lent à charger. Si RoboVM devient plus intelligent, peut-être qu'il peut jeter la plupart des binaires de 9,3 Mo pour une charge encore plus rapide?

Le site Web mentionne iOS, mais je pense que c'est parce qu'ils vendent leurs bibliothèques d'interface utilisateur supplémentaires. RoboVM a bien compilé pour moi sur une saveur d'Ubuntu. Assurez-vous de faire

$ Sudo apt-get install g ++ - multilib

en premier (et peut-être installer libpthread-stubs0-dev et libpthread-workqueue0 ... je ne sais pas si cela comptait).

2
expz