Est-il possible de compiler Java en code machine? (Pas de bytecode)


32

Pouvez-vous faire compiler Java directement en code machine?

Je veux le faire, donc j'ai le contrôle sur les plates-formes sur lesquelles il est utilisé et je ne sais pas C, C ++, etc.

Réponses:


36

Il semble que le compilateur GNU pour Java puisse convertir le code source Java en code bytec Java ou code machine. Il peut également convertir le bytecode Java existant en code machine. Cependant, les dernières nouvelles datent de 2009, donc je ne suis pas sûr de son actualité et s'il peut gérer les dernières fonctionnalités du langage Java.


1
Si le bytecode Java n'a pas changé depuis 2009, cela devrait toujours fonctionner sans que les développeurs agitent le drapeau "Hé! Je suis toujours là".
Robert Harvey

@RobertHarvey Je crois que Java 7 a introduit de nouveaux concepts de langage, il pourrait donc échouer lors de la conversion de fichiers source en code machine. Si le bytecode a également changé avec ces nouvelles fonctionnalités, cela échouera également
Thomas Owens

1
Excelsior JET semble être toujours actif (commercial). Il y avait Fujitsu TowerJ, mais cela semble être mort il y a une décennie et c'était assez inutile à l'époque.
Tom Hawtin - tackline

J'utilise java 6, donc java 7 ne pose aucun problème dans mon cas
Russell

1
Le site Web de GCJ indique qu'il n'avait pas entièrement pris en charge même Java 1.5. Voir ce fil: stackoverflow.com/a/4040404/1257384
GregT

13

Ne répondant pas tout à fait directement à l'OP, mais peut-être un côté intéressant. Java peut être exécuté en trois modes:

  1. Mixte (par défaut) - Une combinaison de code interprété et compilé par machine (compilé par machine == compilé par JIT lors de l'exécution)
  2. Avec -Xintindicateur - Interprété - Code octet uniquement
  3. Avec -Xcompindicateur - Compilé - machine compilée

1
@Martjin Est-ce pour le HotSpot? Par hasard, avez-vous une référence pour le -Xcompparce que je ne l'ai pas trouvé dans la documentation JDK 7 ou la documentation des options HotSpot et je ne sais pas si vous avez des secrets de liste de diffusion cachés que nous, les simples mortels, ne connaissons pas :-)
edalorzo

2
C'est une option délibérément cachée oui :-). Il existe différentes listes de diffusion openjdk (openjdk.java.net) sur lesquelles vous pouvez glaner ce genre d'informations - ou lire le code source :-)
Martijn Verburg

Veuillez noter que selon mes tests, -Xcomp peut avoir de moins bonnes performances (par un facteur de deux) dans certains cas.
Daniel Lemire

Ben ouais. Les optimisations juste à temps sont difficiles à faire lorsque le JIT n'est même pas en cours d'exécution. Peut avoir! = Aura.
candied_orange

ummm donc ce sont des options pour javac? lors de l'utilisation de -Xcomp génère-t-il par défaut un seul fichier binaire?
Alexander Mills

7

Il peut être préférable de détecter le système d'exploitation à l'aide de System.getProperty («os.name») . Cela vous permettrait de choisir de prendre en charge plusieurs systèmes d'exploitation, mais d'en exclure d'autres.


Existe-t-il un moyen de tromper / jouer?
FrustratedWithFormsDesigner

@Frustré, probablement, mais je supposais que son intention était de ne pas soutenir officiellement les systèmes d'exploitation qu'il n'avait pas testés. Autrement, il n'est pas logique de désactiver intentionnellement la portabilité que vous obtenez essentiellement gratuitement.
Karl Bielefeldt

Il se peut également qu'il veuille lier le programme à du matériel spécifique d'une manière indépendante du système d'exploitation.
FrustratedWithFormsDesigner

Vous pouvez forcer la propriété système « os.name » en utilisant des arguments spéciaux pour JVM: java -Dos.name=MacOS.
SkyDan

2

C'est maintenant: GraalVM vous permet de compiler à l'avance vos programmes en un exécutable natif. Jetez un œil à la fonction d' image native :

Question connexe: "Puis-je compiler Java en code natif?" https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJ n'est plus maintenu.
Source: «La suppression de gcj» http://tromey.com/blog/?p=911

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.