Există un capăt frontal java care convertește sursa de java în forma intermediară a llvm-ului?

Din ceea ce am citit, există un program llvm care convertește octetul Java în forma intermediară numită class2llvm. Întrebarea mea este cum pot accesa acest lucru. Ce frontieră trebuie să instalez pentru a accesa acest lucru.

VMkit este punerea lor în aplicare a unui JVM, dar eu sunt în căutarea pentru modul de a compila java codul sursă cu llvm, nu cum să-l rulați.

45
înțelegeți că puteți folosi javac (compilarea java standard) pentru a face acest lucru? nu aveți nevoie de nimic de la llvm - puteți instala doar jadkul oracle (și vă imaginați cum vă așteptați să pregătiți fișierele java pentru class2llvm, dar asta este doar o estimare)
adăugat autor andrew cooke, sursa
poate că nu înțeleg. javac va merge de la sursa de java la bytecode. apoi class2llvm va merge de la bytecode la llvm. care te duce de la sursa de java la llvm. nu este ceea ce vrei?
adăugat autor andrew cooke, sursa
ah, ok, cred că înțeleg ce a confundat pe toată lumea. când am spus "nu ai nevoie de nimic de la llvm" am vrut să merg de la sursă la octet (nu de la sursă la llvm). îmi pare rău.
adăugat autor andrew cooke, sursa
@ andrewcooke- Are javac emit LLVM bytecode? Puteți oferi un link despre cum să faceți acest lucru?
adăugat autor templatetypedef, sursa
@ andrew cooke, atm Nu pot obține vmkit pentru a instala corect. Deci, la fel ca o alternativă folosind javac va funcționa. Cu toate acestea, nu sunt sigur unde să găsesc funcția class2llvm. Nu pare să facă parte din pachetul de bază pentru llvm.
adăugat autor The_Pacifist, sursa
@andrewcooke Cum poți face asta cu javac? Esti sigur de asta?
adăugat autor Hassan, sursa
Bazându-mă pe ceea ce am citit despre VMkit, acesta susține compilația înainte de timp. Nu este esențial de ceea ce aveți nevoie?
adăugat autor Hassan, sursa
Puteți găsi class2llvm aici: llvm.org/viewvc/llvm-project/java/& hellip; Cu toate acestea, nu cred că se compilează mai ..
adăugat autor cib, sursa

4 răspunsuri

Interfața Java traduce Java bytecode (fișiere .class) în LLVM bytecode. Aruncați o privire la acest link:

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

27
adăugat

Poți să arunci o privire la dragonegg , care permite llvm să folosească frontend-urile gcc. Deoarece gcc are deja un frontend pentru java, numit gcj , poate llvm îl poate folosi pentru a compila codul java. Dar nu sunt sigur cât de bine interfețe llvm cu interfața gcc, deci este posibil să nu funcționeze.

5
adăugat

Am executat o clasă java utilizând vmkit ( http://vmkit.llvm.org/ ) bazat pe LLVM. Utilizează LLVM pentru compilarea și optimizarea limbajelor de nivel înalt la codul mașinii. J3 este o implementare a unui JVM cu VMKit.

3
adăugat
Întrebarea cere o conversie a sourcecode , nu bytecode .
adăugat autor Martin Schröder, sursa

[ NOTĂ: Din noiembrie 2015 nu mai este deschisă, deci acest hack este mai ales inutil. ]

RoboVM might become the solution you're looking for. It's open source and compiles JVM bytecode (.class files) to machine code.

Presupun că o fac folosind ceva de genul class2llvm.

Din păcate, este încă în alfa. Tocmai am testat-o ​​pe HelloWorld.java. A dat o viteză de 5x mai mare decât timpul de încărcare care rulează pe un singur nucleu. (Cea mai mare parte a timpului de rulare este timpul de încărcare.)

echo Hello World! : <1 ms : 31K (/usr/bin/echo binary)

java HelloWorld : ~70 ms : 0.4K (HelloWorld.class JVM bytecode)

./HelloWorld : ~13 ms : 9.4MB (9.3MB binary + 57K robovm-rt.jar)

Rețineți că java solicită un fișier de 32MB $ JAVA_HOME/lib/rt.jar (și poate mai mult). Căutarea într-un astfel de fișier mare trebuie să facă parte din motivul pentru care java este atât de lent pentru încărcare. Dacă RoboVM devine mai inteligent, poate că ar putea elimina majoritatea celor binare de 9,3 MB pentru o încărcare și mai rapidă?

Site-ul web menționează iOS, dar cred că asta se datorează faptului că ei vând bibliotecile lor UI add-on. RoboVM sa compilat bine pentru mine pe o aromă a Ubuntu. Asigurați-vă că ați făcut-o

$ sudo apt-get instala g ++ - multilib

mai întâi (și poate instala libpthread-stubs0-dev și libpthread-workqueue0 ... nu știu dacă au importanță).

2
adăugat
Întrebarea cere o conversie a sourcecode , nu bytecode .
adăugat autor Martin Schröder, sursa
@Martin, în mod clar java compilator convertește codul sursă la jvm bytecode care poate fi apoi convertit. Acesta este probabil motivul pentru care răspunsul cu cele mai multe voturi explică de asemenea conversia bytecode.
adăugat autor expz, sursa
Începând cu noiembrie 2015, RoboVM nu mai este deschis, adică codul dezvoltat de companie nu mai este lansat ca un cod open source.
adăugat autor niagr, sursa