Deux ans après les optimisations de do -the-jvm-prevent-tail-call , il semble y avoir une implémentation prototype et MLVM a répertorié la fonctionnalité comme "proto 80%" depuis un certain temps maintenant.
Y a-t-il aucun intérêt actif de la part de Sun / Oracle pour la prise en charge des appels de queue ou est-ce simplement que les appels de queue sont "[...] voués à venir en deuxième place sur chaque liste de priorités de fonctionnalités [...]" comme mentionné à la JVM Sommet de la langue ?
Je serais vraiment intéressé si quelqu'un a testé une version MLVM et pourrait partager quelques impressions sur son fonctionnement (voire pas du tout).
Mise à jour: notez que certaines VM comme Avian prennent en charge les appels de queue appropriés sans aucun problème.
Réponses:
Diagnostiquer le code Java: Améliorer les performances de votre code Java ( alt ) explique pourquoi la JVM ne prend pas en charge l'optimisation des appels de fin.
Il donne ensuite un exemple de code Java qui ne se transformera pas.
Ensuite, il donne un test que vous pouvez utiliser pour déterminer si votre JIT fait cela.
Naturellement, puisqu'il s'agit d'un article IBM, il comprend un plug:
la source
instanceof
vérification pour voir sithis
est unExample
objet (plutôt qu'une sous-classe deExample
).Une raison que j'ai vue dans le passé pour ne pas implémenter le TCO (et cela est considéré comme difficile) en Java est que le modèle d'autorisation dans la JVM est sensible à la pile et que les appels finaux doivent donc gérer les aspects de sécurité.
Je crois que cela a été montré comme n'étant pas un obstacle par Clements et Felleisen [1] [2] et je suis à peu près sûr que le patch MLVM mentionné dans la question le traite également.
Je me rends compte que cela ne répond pas à votre question; juste en ajoutant des informations intéressantes.
la source
Vous le savez peut-être déjà, mais la fonctionnalité n'est pas aussi triviale que cela puisse paraître puisque le langage Java expose en fait la trace de la pile au programmeur.
Considérez le programme suivant:
Même si cela a un "appel de queue", il peut ne pas être optimisé. (S'il est optimisé, il nécessite toujours la comptabilité de l'ensemble de la pile d'appels puisque la sémantique du programme en dépend.)
Fondamentalement, cela signifie qu'il est difficile de prendre en charge cela tout en étant compatible avec les versions antérieures.
la source
g
dans ce cas ... pensez au polymorphisme et à la réflexion par exemple.getStackTrace()
une méthodex()
que le code source montre est appelée à partir d'une méthodey()
montre aussi qu'elle ax()
été appeléey()
? Parce que s'il y a une certaine liberté, il n'y a pas de véritable problème.Java est le langage le moins fonctionnel que vous puissiez imaginer (enfin, d'accord, peut - être pas !) Mais ce serait un grand avantage pour les langages JVM, comme Scala , qui le sont.
Mes observations sont que faire de la JVM une plate-forme pour d'autres langues n'a jamais semblé être en haut de la liste des priorités pour Sun et je suppose, maintenant pour Oracle.
la source