È possibile compilare Java in codice macchina? (Non bytecode)


32

Puoi avere Java compilato direttamente nel codice macchina?

Voglio farlo, quindi ho il controllo su quali piattaforme è utilizzata e non conosco C, C ++ ecc.

Risposte:


36

Sembra che il compilatore GNU per Java possa convertire il codice sorgente Java in bytecode Java o codice macchina. Può anche convertire il bytecode Java esistente in codice macchina. Tuttavia, le ultime notizie sono del 2009, quindi non sono sicuro di quanto sia attuale e se sia in grado di gestire le ultime funzionalità del linguaggio Java.


1
Se il bytecode Java non è cambiato dal 2009, questo dovrebbe comunque funzionare senza che gli sviluppatori agitino le bandiere "Ehi! Sono ancora qui" sul software.
Robert Harvey,

@RobertHarvey Credo che Java 7 abbia introdotto alcuni nuovi concetti linguistici, quindi potrebbe non riuscire a convertire i file sorgente in codice macchina. Se anche il bytecode è cambiato con queste nuove funzionalità, anche quello fallirebbe
Thomas Owens

1
Excelsior JET sembra essere ancora attivo (commerciale). C'era Fujitsu TowerJ, ma sembra che sia deceduto dieci anni fa e all'epoca era piuttosto inutile.
Tom Hawtin: affronta il

Sto usando Java 6 quindi Java 7 non è un problema nel mio caso
Russell

1
Il sito Web di GCJ afferma che non aveva supportato completamente nemmeno Java 1.5. Vedere questa discussione: stackoverflow.com/a/4040404/1257384
gregt

13

Non rispondendo direttamente all'OP, ma forse un lato interessante. Java può essere eseguito in tre modalità:

  1. Misto (impostazione predefinita) - Una combinazione di codice interpretato e compilato macchina (macchina compilata == compilata da JIT in fase di esecuzione)
  2. Con -Xintflag - Interpretato - Solo codice byte
  3. Con -Xcompbandiera - Compilato - Macchina compilata

1
@Martjin Sono per l'HotSpot? Per caso hai riferimenti per il -Xcompperché non ho trovato quello nella documentazione di JDK 7 o nella documentazione delle opzioni di HotSpot e non sei sicuro di avere segreti nascosti nella mailing list di cui noi semplici mortali non siamo a conoscenza :-)
edalorzo,

2
È un'opzione volutamente nascosta sì :-). Esistono varie mailing list di openjdk (openjdk.java.net) dalle quali puoi ottenere questo tipo di informazioni o leggere il codice sorgente :-)
Martijn Verburg,

Si noti che, secondo i miei test, -Xcomp può avere prestazioni peggiori (di un fattore due) in alcuni casi.
Daniel Lemire,

Bene sì. Le ottimizzazioni just in time sono difficili da eseguire quando JIT non è nemmeno in esecuzione. Può avere! = Avrà.
candied_orange

ummm quindi queste sono opzioni per javac? quando si utilizza -Xcomp, per impostazione predefinita viene generato un singolo file binario?
Alexander Mills,

7

Potrebbe essere meglio rilevare il sistema operativo utilizzando System.getProperty ("os.name") . Ciò ti consentirebbe di scegliere di supportare più di un sistema operativo, ma di escluderne altri.


C'è un modo per ingannare / giocare?
FrustratedWithFormsDesigner,

@Frustrato, probabilmente, ma supponevo che il suo intento fosse quello di non supportare ufficialmente i sistemi operativi che non ha testato. Non ha senso altrimenti disabilitare intenzionalmente la portabilità che si ottiene essenzialmente gratuitamente.
Karl Bielefeldt,

Potrebbe anche essere che desidera legare il programma a hardware specifico in un modo indipendente dal sistema operativo.
FrustratedWithFormsDesigner,

È possibile forzare proprietà di sistema "os.name" utilizzando argomenti speciali per la JVM: java -Dos.name=MacOS.
SkyDan,

2

Ora è: GraalVM ti consente di compilare i tuoi programmi in anticipo in un eseguibile nativo. Dai un'occhiata alla funzione di immagine nativa :

Domanda correlata: "Posso compilare Java in codice nativo?" https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJ non è più gestito.
Fonte: "La cancellazione di gcj" http://tromey.com/blog/?p=911

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.