97 votes

Pourquoi la JVM toujours pas prend-il en optimisation d’appels terminaux ?

Deux ans après n'a-la-jvm-prévention-queue-appel-optimisations, il semble y avoir un prototype de mise en œuvre et MLVM a répertorié la fonction "proto 80%" pour un certain temps maintenant.

N'est-il pas intérêt actif de Sun/Oracle du côté de l'appui de la queue des appels ou est-il juste que la queue appels sont "[...] destiné à venir en deuxième place sur chaque fonction de la liste de priorité [ ... ] ", tel que mentionné à la JVM Sommet de la Langue?

Je serais vraiment intéressé si quelqu'un a testé un MLVM construire et à partager quelques impressions de la façon dont cela fonctionne bien (le cas échéant).

Mise à jour: Notez que certaines VMs comme Aviaire soutien adéquat de la queue-les appels sans aucun problème.

34voto

Alex Miller Points 28225

L'une des raisons que j'ai vu dans le passé pour ne pas mettre en œuvre coût total de possession (et qu'il soit considéré comme difficile) en Java, c'est que le modèle d'autorisation dans la JVM est pile-sensible et donc de la queue-les appels doivent gérer les aspects liés à la sécurité.

Je crois que cela a été montré pour ne pas être un obstacle par Clements et Felleisen [1] [2] et je suis sûr que le MLVM correctif mentionné dans la question traite avec elle.

Je me rends compte ce n'est pas la réponse à votre question; il suffit d'ajouter des informations intéressantes.

  1. http://www.ccs.neu.edu/scheme/pubs/esop2003-cf.pdf
  2. http://www.ccs.neu.edu/scheme/pubs/cf-toplas04.pdf

33voto

emory Points 6319

Le diagnostic de Code Java: Améliorer les Performances de Votre Code Java explique pourquoi la JVM ne prend pas en charge la queue-appel d'optimisation.

Mais bien qu'il est bien connu comment transformer automatiquement une sauvegarde de fonction récursive dans une boucle simple, les spécifications de Java n'exige pas que cette transformation sera faite. Sans doute, la raison pour laquelle il n'est pas une exigence, c'est que, en général, la transformation ne peut pas être fait de manière statique dans un langage orienté-objet. Au lieu de cela, la transformation de la queue-fonction récursive simple boucle doit être fait de façon dynamique par un compilateur JIT.

Il donne ensuite un exemple de code Java qui ne va pas se transformer.

Donc, comme dans l'exemple du Listing 3 montre, nous ne pouvons pas attendre statique compilateurs pour effectuer la transformation de la queue de la récursivité sur du code Java tout en préservant la sémantique de la langue. Au lieu de cela, nous devons compter sur la dynamique de la compilation par le JIT. En fonction de la JVM, le JIT peut ou ne peut pas faire cela.

Puis il donne un test que vous pouvez utiliser pour découvrir si le JIT.

Naturellement, puisque c'est un IBM papier, il comprend un plug:

J'ai exécuté ce programme avec un couple de le Java Sdk, et les résultats ont été rien de surprenant. En cours d'exécution sur le Soleil Hotspot JVM pour la version 1.3 révèle que Hotspot ne pas effectuer de la la transformation. Paramètres par défaut l'espace de pile est épuisée en moins de qu'une seconde sur ma machine. Sur le d'autre part, IBM JVM pour la version 1.3 ronronne sans problème, indiquant qu'il n'a transformer le le code de cette façon.

17voto

aioobe Points 158466

Peut-être vous le savez déjà, mais la fonctionnalité n’est pas aussi banale que cela puisse paraître.

Considérons le programme suivant :

Même si cela a un « appel-tail » il ne peut pas être optimisé. (Si c' est optimisé, elle nécessite toujours tenue de livres de toute la pile des appels depuis la sémantique du programme s’appuie sur elle.)

Fondamentalement, le fait que la langue expose la pile des appels le rend difficile à implémenter ceci tout en restant rétro-compatible.

12voto

oxbow_lakes Points 70013

Java est le langage moins fonctionnel que vous pouvez imaginer peut-être (bon, OK, peut-être pas!), mais ce serait un grand avantage sur les langues JVM comme Scala, qui sont.

Mes observations sont que la JVM du faire une plate-forme pour d’autres langues a jamais semblé être en haut de la liste prioritaire pour Sun et je suppose que, maintenant pour Oracle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X