Théoriquement parlant, puis-je obtenir l'OpenJdk Jit et compiler mon code Java à Native?

StackOverflow https://stackoverflow.com/questions/5001466

  •  14-11-2019
  •  | 
  •  

Question

Je me demande juste comment puis-je me débarrasser de la dépendance Java JRE et produire du code natif et livrer le code compilé comme application?

Est-ce que cela est possible?

Ps je connais GCJ compilateur est-ce ce qu'il fait?

Était-ce utile?

La solution

Excelsior A un très bon compilateur Java2natif. J'aimerais l'utiliser, mais malheureusement, notre projet prend 8 heures à compiler avec ce compilateur. La vitesse qui en résulte de l'application est une pensée impressionnante.

Autres conseils

Le code d'octet compilé dépendra toujours de la machine virtuelle Java. Un JIT ne peut pas créer de code qui "a un sens" en dehors du conteneur JVM. Oui, le résultat est un tas d'instructions valides pour la plate-forme cible. Mais vous avez toujours besoin de la pile, du tas et du collecteur d'ordures réels (pour n'en nommer que quelques blocs de construction requis).

En théorie, il est possible de prendre tout interprète pour une langue et de le transformer en compilateur qui produit du code natif dans cette langue. Ceci est lié à une série d'équations appelées Projections de Futamura. L'idée de haut niveau est essentiellement de "tricher" la façon dont vous définissez un compilateur. Supposons que pour une langue Li ait un interprète I (p) qui, étant donné un programme P écrit dans la langue L, interprète ce programme. Maintenant, je suppose que l'interpréteur I est représenté directement dans le code machine. Supposons en outre que j'ai un programme appelé mix Cela, étant donné un programme de code machine et une séquence d'entrée dans ce programme, produit un nouveau programme de code machine qui est le programme initial avec son entrée fixe pour être l'entrée spécifiée. Par exemple, si j'ai compilé ce programme C ++:

#include <iostream>
using namespace std;

int main() {
    string message;
    cin >> message;
    cout << message << endl;
}

Puis utilisé mix Pour mélanger le programme avec l'entrée "Hello", j'obtiendrais un programme qui imprime toujours le message "Bonjour". En d'autres termes, ce serait comme si j'avais écrit ce programme:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello" << endl;
}

Il s'avère qu'il est possible de construire ce programme. Je pourrais le faire, par exemple, en regardant le code de la machine, en regardant tous les endroits où vous essayez de lire l'entrée de la console, puis en remplaçant cela par du code qui appelle une fonction à lire à la place d'une chaîne codée en dur.

Maintenant, considérez ce qui se passerait si vous deviez exécuter ceci mix Programmes prenant en entrée un interprète I et un programme p. Ensuite, le résultat serait un programme de code machine qui équivaut au programme que je fonctionne sur l'entrée p. En d'autres termes, vous venez de construire un programme de code machine qui simule ce qui se passerait si vous exécutiez l'interprète sur le programme - qui est un programme de code machine qui exécute le programme P!

Bien sûr, cette construction est complètement peu pratique. Au mieux de ma connaissance, personne n'a écrit mix, et s'ils le faisaient, tout programme que vous avez fait en transformant un interprète en compilateur serait terriblement inefficace car il ne serait pas du tout optimisé.

Quant à votre question initiale sur la question de savoir si vous pouvez prendre le JVM du JVM et l'utiliser pour produire du code de machine brut pour un programme Java, je ne suis pas sûr car je n'ai pas regardé le code source, mais j'en doute fortement. Le code machine contient presque certainement des crochets qui rappelleraient le JVM pour des tâches spécifiques (par exemple, collection d'ordures, chargement de classe, etc.), ce qui ferait que le code généré ne fonctionnerait pas dans un environnement autonome. Cependant, c'est une idée vraiment cool d'essayer de le faire, et j'espère que cette réponse met en lumière la théorie derrière!

Veuillez noter que cette question est similaire à "puis-je me débarrasser des fenêtres et laisser mon programme Windows fonctionner sur le métal nu sans système d'exploitation"?

Les programmes Java s'attendent à ce qu'un grand ensemble de classes soit facilement disponible, ce que le JRE fournit, et que tout compilateur ou émulateur devra également fournir.

Ce que vous boîte Cependant, c'est de regarder un lanceur qui vous permettra d'apporter votre propre JRE avec votre application - cela ne fonctionnera que sur la plate-forme du JRE, mais vous êtes déjà prêt à être spécifique à la plate-forme. Plusieurs existent - je vous encourage à examiner les nombreuses questions déjà sur le débordement de la pile sur la façon de procéder.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top