Je recherche un compilateur pour traduire Java Bytecode en code C indépendant de la plate-forme avant d'exécuter (compilation à l'avance). p>
Je devrais alors être capable d'utiliser un compilateur C standard pour compiler le code C dans un exécutable pour la plate-forme cible. Je comprends que cette approche ne convient que pour certaines applications Java modifiées rarement. P>
Alors, quels compilateurs Java-to-C sont disponibles? p>
7 Réponses :
Pourquoi faire ça? La machine virtuelle Java comprend un compilateur Java-to-Assembly d'exécution. P>
La compilation à l'exécution peut produire de meilleures performances, car toutes les informations sur les valeurs d'exécution sont disponibles. Alors que la compilation à l'avance doit prendre des hypothèses sur les valeurs d'exécution et peut donc émettre moins de code rapide. Veuillez vous reporter à Java vs C Performance A > Par Cliff Cliquez pour plus de détails. P>
Compilation à l'exécution peut i> Céder [] meilleure performance. Cela dépend de votre cas d'utilisation, tout comme elle indique dans le lien. Pas que c'est une raison de compiler Java à c.
@dmckee assez vrai, ajouté Weasel Worlds :)
"Pourquoi faire ça?". Une raison possible pourrait être que GCC, et d'autres compilateurs C, cibler davantage de plates-formes et d'architectures que n'importe quel JIT, et probablement plus que l'union de tous les Jits existants. Cela dit, si votre cible n'a pas de JVM JIT-Enhanced approprié, cela pourrait être parce que c'est trop faible pour tout code Java pratique et que la voie native Java-> C-> ne fonctionnera pas non plus.
Si votre plate-forme ne prend pas en charge Java, vous ferez probablement mieux l'écrire en C ou C ++ que de compter sur un compilateur Java-To-Native. Ça va courir plus vite et être plus facile à travailler avec. En outre, j'ai entendu parler de aucun cas b> où un compilateur Java-to-native bat le hotspot dans quoi que ce soit, mais une heure de démarrage. Je ne pense pas que tu aies besoin des mots Weasel.
@bobmcgee n'a pas non plus entendu parler de cela. Dans tous les cas, les mots Weasel couvrent le cas de la vitesse des égaux, n'est-ce pas? :)
Sauf que la Java compilée indigène est plus lente i> plutôt que égale ...: p
"Vous ferez probablement mieux l'écrire dans C ou C ++ que de compiler sur un compilateur Java-to-Native" - sûr, mais le questionneur demande comment compiler Java Bytecode (pas la source Java). Ré-écrit Java Bytecode à la main en C ne semble pas très amusant pour moi.
Je me suis peut-être corrigé sur la performance ... mais les différences ne sont généralement pas si énormes, de toute façon, à la fin de la démarrage. Quant à la réécriture: Java et C ++ ne sont pas que i> différents, et le résultat C ++ a plus de place pour les optimisations, l'assemblage, etc. Si vous êtes centré sur la vitesse, vous devriez le faire à droite manière plutôt que de compter sur un compilateur Aot Java-to-Native.
afaik, il n'y a pas de tel produit mais vous avez deux options: p>
Implémentez votre propre code octet sur C Transpiler. code d'octet est assez simple, ce n'est pas trop difficile. P> li>
Si vous voulez juste un binaire natif (c'est-à-dire lorsque vous n'avez pas besoin du code source C), donnez-lui GCJ Essayez. P> LI> ul>
Remarque: Si vous faites cela pour des raisons de performance, vous allez être déçu. Java est généralement aussi rapide que C / C ++. De plus, les améliorations apportées à la machine virtuelle rendront tout le code Java plus rapidement, mais pas votre binaire indigène. Compiler le code vous donnera un peu de meilleure heure de démarrage. P>
Je crois que c'est l'un des modes de GCJ, bien qu'il soit normalement compilé de la source à bytecode ou à la source à Native. Je suis cependant d'accord sur la mauvaise performance.
@Bobmcgee Pourriez-vous donner un lien avec le lieu où la capacité de compiler dans C B> est documentée pour GCC / GCJ?
GCJ a cette capacité, mais il n'a pas d'excellent soutien pour Java Caractéristiques du passé 1.4 et le support swing est susceptible d'être gênant. Dans la pratique cependant, le compilateur Hotspot Jit bat tous les compilateurs à l'avance pour Java. Voir Benchmarks de Excelsior Jet.
pour clarifier: gcj convertit java source / bytecode en code compilé de manière native forte> p>
TOBA convertira (ancien) Java Bytecode à C Source. Strong> 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 Java. P>
Pourriez-vous donner un lien avec le lieu où la capacité de compiler dans C B> est documentée pour GCC / GCJ?
Le compilateur GCJ n'est plus disponible. Alternativement, il pourrait être possible de compiler Java Bytecode à Webassembly en utilisant TEAVM ou JWebassembly , puis décompilez-le à C utiliser wasm2c .
Il y avait un produit appelé Towerj, qui était essentiellement un compilateur statique "via C" pour Java, mais c'est depuis longtemps. P>
On m'a dit que Sun Labs ait créé quelque chose comme cela dans le cadre du projet Sun Spot, mais je ne suis pas sûr que si c'est public. P>
@bobmcgee: Dans les points de repère, GCJ perd en effet, mais Excelsior Jet (qui est un compilateur AOT 32 bits) bat le point chaud 32 bits fort> sur les trois systèmes de test, donc Je ne suis pas sûr de ce qui était ton point. P>
Mais, après tout, il y a des mensonges, des mensonges, et
Oh putain. Je pourrais avoir un jet d'assermentation Excelsior Jet venait de faire un optimiseur de bytecode et une machine virtuelle exclusive pour ce test. C'est ce que vous obtenez pour ne pas lire attentivement.
@Bobmcgee: Pas de problème. :) Au fait, de nombreux clients achètent Excelsior Jet pour protéger leurs applications contre les décompilateurs Java; Ils ne se soucient pas des performances aussi longtemps que sur la même chose que sur Hotspot.
Pas vraiment une réponse à ma propre question, mais comment Oracle le fait-il? P>
http://download.oracle .Com / Docs / CD / B28359_01 / Java.111 / B31225 / CHONE.HTM # Babcihga P>
Je pourrais suggérer un outil appelé JCGO qui est une source Java à C Traducteur C. Si vous devez convertir ByTecode, vous pouvez décompiler les fichiers de classe par certains outils (par exemple, JADRETRO + JAD) et transmettre les fichiers source à JCGO. L'outil traduit toutes les classes de votre programme Java à la fois et produit des fichiers C (un .c et .h pour chaque classe), qui pourrait, plus loin, être compilé (par des outils tiers) dans un code natif hautement optimisé pour le Plate-forme cible. Java Generics n'est pas encore pris en charge. AWT / SWING et SWT sont supportés. P>
Je regarderai; Je suis content de voir un produit récent pour cela.
https://github.com/badlogic/jack - Java à C ++ transpilateur , ignore le modèle de mémoire et autres choses, utilise Boehm GC pour une lenteur supplémentaire et des pauses GC P>
La licence n'est pas claire pour moi. P> li>
http: //ptolemy.eecs. BERKELEY.EDU/PUBLICATIONS/PAPERS/03/JAVA-2-C/ - Un compilateur Java-TO-C Retagetable pour les systèmes embarqués P>
Un papier, je ne sais pas si le programme est disponible. p> li> ul>
(J'ai googling pour ce genre de choses, voici comment je suis arrivé à cette question à ce sujet.) p>
Trouvé ce lien pour le cas spécifique de la base de données Oracle: télécharger.oracle.com/docs/cd/b28359_01/java.111/b31225/...
Quel est l'objectif exact que vous voulez accomplir? Un fichier EXE?
Eh bien, pas un exécutable, mais le code source dans Portable C.
La plupart de la complexité et de la fonctionnalité de Java sont dans ses bibliothèques. Sans ces bibliothèques aussi ce qu'est le point?
La partie difficile ne fait pas partie du code d'octet (même si le C sera une lecture horrible), la partie difficile est de faire quelque chose qui fonctionnera avec un gc adapté à C ou sans GC et à Traduisez chaque pièce de code d'octet unique pour collections, manipulation des exceptions, etc. Je ne vois vraiment pas le point de la considérer même.
Pour M. Lawrey's Point, j'ai eu la même question. Il semble que l'on puisse utiliser une compilation à l'avance pour délivrer des bibliothèques de classe Java Core de la forme de la compilée de manière native.