J'ai pensé à ce sujet ces derniers temps, et il me semble que la plupart des avantages accordés à la compilation JIT devrait plus ou moins être attribuée au format intermédiaire au lieu de cela, et que jitting en lui-même n'est pas un bon moyen de générer du code.
Ce sont donc les principaux pro-compilation JIT arguments que je l'habitude d'entendre:
- Juste-à-temps de compilation permet une plus grande portabilité. N'est-ce pas imputable au format intermédiaire? Je veux dire, rien ne vous empêche de la compilation de votre virtuel bytecode en natif de bytecode une fois que vous avez sur votre machine. La portabilité est un problème dans la "distribution", de la phase, pas au cours de la 'course' phase.
- Okay, alors que penser de la génération de code à l'exécution? Eh bien, la même chose s'applique. Rien ne vous empêche de l'intégration d'un juste-à-temps compilateur pour un réel juste-à-temps dans votre propre programme.
- Mais l'exécution compile en code natif, juste une fois, de toute façon, et les magasins de l'exécutable résultant dans une sorte de cache quelque part sur votre disque dur. Oui, bien sûr. Mais il est optimisé votre programme sous des contraintes de temps, et ce n'est pas ce qu'elle soit mieux à partir de là. Voir le paragraphe suivant.
C'est pas comme en avance sur le temps de compilation a pas d'avantages non plus. Juste-à-temps de compilation a des contraintes de temps: vous ne pouvez pas garder à l'utilisateur final d'attente à jamais, alors que votre programme se lance, il a donc un compromis à faire quelque part. La plupart du temps ils ont juste optimiser le moins. Un de mes amis avait de profilage des éléments de preuve que les fonctions inline et dérouler les boucles "manuellement" (obscurcissement de code source dans le processus) a eu un impact positif sur la performance de son C# arithmétique programme; faire de même de mon côté, avec mon programme C remplir la même tâche, a abouti à aucun résultat positif, et je crois que c'est due à l'ampleur des transformations mon compilateur été autorisé à faire.
Et pourtant, nous sommes entourés par jitted programmes. C# et Java sont partout, les scripts Python peut compiler en une sorte de pseudo-code binaire, et je suis sûr que tout un tas d'autres langages de programmation en faire de même. Il doit y avoir une bonne raison que je suis absent. Donc, ce qui rend juste-à-temps de compilation tellement supérieur à celui de l'avance de temps de compilation?
EDIT Pour effacer une certaine confusion, il serait peut-être important de préciser que je suis tout à fait pour une représentation intermédiaire des exécutables. Cela a beaucoup d'avantages (et vraiment, la plupart des arguments pour juste-à-temps de compilation sont en fait des arguments pour une représentation intermédiaire). Ma question est au sujet de la façon dont ils devraient être compilé en code natif.
La plupart des moteurs d'exécution (ou de compilateurs pour que ce soit), de préférence, soit la compilation juste-à-temps ou à l'avance. Comme avance sur le temps de compilation apparaît comme une meilleure alternative pour moi parce que le compilateur a plus de temps pour procéder à des optimisations, je me demande pourquoi Microsoft, Sun et tous les autres vont dans l'autre sens. Je suis un peu dubitatif sur le profilage-des optimisations, comme mon expérience avec le juste-à-temps des programmes compilés affiche pauvres de base des optimisations.
J'ai utilisé un exemple avec du code C seulement parce que j'ai besoin d'un exemple de l'avance sur le temps de compilation et juste-à-temps de compilation. Le fait que le code C n'a pas été émis à une représentation intermédiaire est indifférent à la situation, que j'ai juste besoin de montrer que l'avance de temps de compilation peut produire de meilleurs résultats immédiats.