Question

J'ai vu cette citation à la question suivante: Qu'est-ce qu'un bon langage fonctionnel pour la création d'un service Web?

  

En particulier, Scala ne prend pas en charge l’élimination des appels différés, sauf dans les fonctions auto-récursives, ce qui limite le type de composition que vous pouvez effectuer (c’est une limitation fondamentale de la machine virtuelle).

Est-ce vrai? Si tel est le cas, en quoi la JVM crée-t-elle cette limitation fondamentale?

Était-ce utile?

La solution

Ce message: Récursion ou Itération? pourrait vous aider.

En résumé, l’optimisation des appels de sortie est difficile à réaliser dans la machine virtuelle Java en raison du modèle de sécurité et de la nécessité de toujours disposer d’une trace de pile. Ces exigences pourraient en théorie être supportées, mais il faudrait probablement un nouveau bytecode (voir Proposition informelle de John Rose ).

Il existe également d'autres discussions dans le bug Sun n ° 4726340 . où se termine l'évaluation (à partir de 2002):

  

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

Actuellement, des travaux sont en cours dans la machine Da Vinci . projet. Le statut du sous-projet de l'appel final est indiqué comme "proto 80%"; il est peu probable que Java 7 soit disponible, mais je pense que cela a de très bonnes chances d’être réalisé avec Java 8.

Autres conseils

La limitation fondamentale réside simplement dans le fait que la machine virtuelle Java ne fournit pas d’appel final dans son code d’octet. Par conséquent, il n’existe aucun moyen direct pour un langage basé sur la machine virtuelle Java de fournir lui-même des appels ultérieurs. Certaines solutions de contournement peuvent produire un effet similaire (par exemple, le trampoline), mais elles entraînent de lourdes pertes de performances et obscurcissent le code intermédiaire généré, ce qui rend le débogueur inutile.

Par conséquent, la machine virtuelle Java ne peut prendre en charge aucun langage de programmation fonctionnel de qualité de production tant que Sun n'a pas implémenté d'appels en aval dans la machine virtuelle elle-même. Ils en discutent depuis des années, mais je doute qu’ils mettent en œuvre des appels de queue: ce sera très difficile car ils ont optimisé prématurément leur machine virtuelle avant de mettre en œuvre une telle fonctionnalité de base, et l’effort de Sun est fortement axé sur les langages dynamiques plutôt que sur les langages fonctionnels. / p>

Il existe donc un argument très fort selon lequel Scala n’est pas un véritable langage de programmation fonctionnel: ces langages considèrent les appels de queue comme une fonctionnalité essentielle depuis que Scheme a été introduit pour la première fois il y a plus de 30 ans.

Scala 2.7.x prend en charge l’optimisation de l’appel final pour la récursivité automatique (une fonction s’appelant elle-même) des méthodes finales et des fonctions locales.

Scala 2.8 pourrait également prendre en charge la bibliothèque pour le trampoline, technique permettant d’optimiser les fonctions mutuellement récursives.

Vous trouverez de nombreuses informations sur l'état de la récursivité Scala dans Le blog de Rich Dougherty .

En plus du document lié à Lambda The Ultimate (tiré du lien publié par mmyers ci-dessus), John Rose de Sun en dit plus sur l’optimisation des appels en queue.

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

J'ai entendu dire que cela pourrait être implémenté un jour sur la JVM. L’appel en attente est entre autres examiné sur la machine Da Vinci.

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

Toutes les sources indiquent que la machine virtuelle Java ne peut pas être optimisée en cas de récursion de la fin, mais lors de la lecture

scroll top