98 votes

La JVM empêche-t-elle la queue appel optimisations ?

J’ai vu cette citation sur la question : ce qui est un bon langage fonctionnel pour construire un service web ?

Scala en particulier ne supporte pas les appels terminaux élimination sauf dans les fonctions auto-récursives, qui limite les types de composition, vous pouvez faire (il s’agit d’une limitation fondamentale de la JVM).

Est-ce vrai ? Dans l’affirmative, qu’il est sur la machine virtuelle Java qui crée cette limitation fondamentale ?

74voto

Michael Myers Points 82361

Ce post: la Récursivité ou d'Itération? pourrait aider.

En bref, la queue d'appel d'optimisation est difficile à faire dans la JVM en raison du modèle de sécurité et le besoin de toujours avoir une trace de pile disponible. Ces exigences pourraient, en théorie, être pris en charge, mais il aurait probablement besoin d'une nouvelle bytecode (voir John Rose informel de la proposition).

Il y a aussi plus de discussion au Soleil bug #4726340, où l'évaluation (à partir de 2002) extrémités:

Je crois que cela pourrait être fait néanmoins, mais il n'est pas une mince tâche.

Actuellement, des travaux en cours dans le Da Vinci Machine projet. La queue de l'appel d'un sous-projet du statut est répertorié comme "proto 80%"; il est peu probable de le faire en Java 7, mais je pense qu'il a une très bonne chance à Java 8.

27voto

Jon Harrop Points 26951

La limitation fondamentale est simplement que la JVM ne fournissent pas de queue appelle dans son byte code et, par conséquent, il n'y a pas de moyen direct pour une langue construite sur la JVM de fournir queue appelle elle-même. Il existe des solutions de contournement qui peuvent obtenir un effet similaire (par exemple, le trampoline), mais elles sont le coût exorbitant d'une affreuse performance et d'obscurcir l'intermédiaire généré le code qui fait un débogueur inutile.

Si la JVM ne peut pas supporter toute la production-qualité fonctionnelle des langages de programmation jusqu'à ce que le Soleil de mettre en œuvre des appels tail dans la JVM elle-même. Ils ont discuté pendant des années mais j'en doute, ils seront jamais mettre en œuvre des appels tail: il sera très difficile parce qu'ils ont prématurément optimisé leur VM avant de mettre en œuvre ces fonctionnalités de base, et le Soleil de l'effort est fortement axé sur la dynamique des langues plutôt que de langages fonctionnels.

Par conséquent, il est un argument très fort que la Scala n'est pas un vrai langage de programmation fonctionnel: ces langues ont considéré la queue appels est une caractéristique essentielle depuis le Régime a d'abord été introduit il y a 30 ans.

21voto

Daniel C. Sobral Points 159554

Scala 2.7.x supporte appel tail-optimisation pour soi-récursivité (une fonction qui se fait appeler) des méthodes finales et des fonctions locales.

2.8 Scala pourrait venir avec l’aide de la bibliothèque pour trampoline aussi, qui est une technique pour optimiser les fonctions récursives mutuellement.

Vous trouverez beaucoup d’informations sur l’état de la récursivité de la Scala dans blog de Rich Dougherty.

8voto

faran Points 2355

En outre, le document lié dans le Lambda de L'Ultime (à partir du lien mmyers posté ci-dessus), John Rose de Soleil a plus à dire sur la queue d'appel d'optimisation.

http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm

J'ai entendu dire qu'il pourrait être mis en œuvre sur la JVM un jour. La queue d'appeler le support technique parmi d'autres choses sont en train de regardé sur le Da Vinci de la Machine.

http://openjdk.java.net/projects/mlvm/

0voto

fthinker Points 351

Toutes les sources à la JVM d'être incapable de les optimiser dans le cas de la queue de la récursivité, mais à la lecture de Java optimisation des performances (2003, O'reilly) j'ai trouvé que l'auteur en disant qu'il peut atteindre plus de récursivité de la performance par la mise en œuvre de la queue de la récursivité.

Vous pouvez trouver sa réclamation à la page 212 (de la recherche pour "queue de récursivité" il devrait être le deuxième résultat). Ce qui donne?

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