Compilateur pour traduire le bytecode Java en code C indépendant de la plate-forme avant l’exécution?

Je recherche un compilateur pour traduire le bytecode Java en code C indépendant de la plate-forme avant l’exécution (compilation Ahead-of-Time).

Je devrais alors pouvoir utiliser un compilateur C standard pour comstackr le code C en un exécutable pour la plate-forme cible. Je comprends que cette approche ne convient que pour certaines applications Java peu modifiées.

Quels compilateurs Java-C sont disponibles?

Je pourrais suggérer un outil appelé JCGO qui est un traducteur de source Java en C. Si vous devez convertir le bytecode, vous pouvez décomstackr les fichiers de classe à l’aide d’un outil (par exemple, JadRetro + Jad) et transmettre les fichiers source à JCGO. L’outil traduit toutes les classes de votre programme java en même temps et génère des fichiers C (un .c et .h pour chaque classe), qui pourraient ensuite être compilés (par des outils tiers) en code natif hautement optimisé pour le système. plate-forme cible. Les génériques Java ne sont pas encore pris en charge. AWT / Swing et SWT sont pris en charge.

Pourquoi faire ça? La machine virtuelle Java comprend un compilateur Java d’assemblage à l’exécution.

La compilation au moment de l’exécution peut améliorer les performances car toutes les informations sur les valeurs d’exécution sont disponibles. Tandis que la compilation anticipée doit prendre des hypothèses sur les valeurs d’exécution et peut donc émettre du code moins rapide. Veuillez vous référer à Java vs C performance de Cliff Click pour plus de détails.

GCJ a cette capacité, mais la prise en charge des fonctionnalités Java n’a pas été excellente au-delà de la version 1.4, et la prise en charge de Swing risque de poser problème. En pratique cependant, le compilateur HotSpot JIT bat tous les compilateurs en avance sur le temps pour Java. Voir les références de Excelsior JET. Pour clarifier: GCJ convertit les sources / octets Java en code compilé de manière native.

Toba convertira le (ancien) bytecode Java en source C. Cependant, il n’a pas été mis à jour depuis Java 1.1. Il peut être utile de faciliter partiellement le portage, mais il ne peut tout simplement pas gérer toutes les bibliothèques complexes dont dispose Java.

(Je suis allé sur Google pour ça, c’est comme ça que je suis arrivé à cette question à SO.)

Autant que je sache, il n’y a pas un tel produit, mais vous avez deux options:

  • Implémentez votre propre codeur octet en C transstackr. Le code d’octet est assez simple, ce n’est pas trop difficile.

  • Si vous voulez juste un binary natif (c’est-à-dire lorsque vous n’avez pas besoin du code source C), essayez GCJ .

Remarque: si vous faites cela pour des raisons de performance, vous serez déçu. Java est généralement aussi rapide que C / C ++. De plus, les améliorations apscopes à la machine virtuelle rendront tout le code Java plus rapide, mais pas votre binary natif. La compilation du code vous donnera juste un peu plus de temps de démarrage.

Pas vraiment une réponse à ma propre question, mais comment Oracle le fait-il?

http://download.oracle.com/docs/cd/B28359_01/java.111/b31225/chone.htm#BABCIHGA

Il existait auparavant un produit appelé TowerJ, qui était essentiellement un compilateur statique “via C” pour Java, mais il a disparu depuis longtemps.

On m’a dit que Sun Labs avait créé quelque chose comme cela dans le cadre du projet Sun SPOT, mais je ne sais pas si c’est public.

@BobMcGee: Dans les tests de référence auxquels vous faites référence, GCJ perd effectivement, mais Excelsior JET (qui est un compilateur AOT 32 bits) bat le HotSpot 32 bits sur les trois systèmes de test.

Mais, après tout, il y a des mensonges, des maudits mensonges et des points de repère . 🙂