J'ai vu cette citation sur la question: Qu'est-ce qu'un bon langage fonctionnel sur lequel construire un service Web?
Scala en particulier ne prend pas en charge l'élimination des appels de fin, sauf dans les fonctions auto-récursives, ce qui limite les types de composition que vous pouvez faire (c'est une limitation fondamentale de la JVM).
Est-ce vrai? Si tel est le cas, qu'est-ce qui crée cette limitation fondamentale dans la JVM?
la source
La limitation fondamentale est simplement que la JVM ne fournit pas d'appels de queue dans son code d'octet et, par conséquent, il n'y a aucun moyen direct pour un langage construit sur la JVM de fournir des appels de queue lui-même. Il existe des solutions de contournement qui peuvent obtenir un effet similaire (par exemple le trampoline), mais elles se font au prix de performances épouvantables et d'obscurcir le code intermédiaire généré qui rend un débogueur inutile.
Ainsi, la machine virtuelle Java ne peut prendre en charge aucun langage de programmation fonctionnel de qualité production tant que Sun n'a pas implémenté les appels de queue dans la machine virtuelle Java elle-même. Ils en discutent depuis des années mais je doute qu'ils implémenteront un jour des appels de queue: ce sera très difficile car ils ont prématurément optimisé leur VM avant d'implémenter ces fonctionnalités de base, et l'effort de Sun est fortement axé sur les langages dynamiques plutôt que sur les langages fonctionnels.
Par conséquent, il existe un argument très fort selon lequel Scala n'est pas un véritable langage de programmation fonctionnel: ces langages ont considéré les appels de queue comme une caractéristique essentielle depuis que Scheme a été introduit pour la première fois il y a plus de 30 ans.
la source
Hence there is a very strong argument that Scala is not a real functional programming language
- l'argument est en fait assez faible. Bien sûrtail calls [as] an essential feature
, et bien si le matériel sous-jacent (ou la machine virtuelle) le supporte directement. Mais ce sont les détails de la mise en œuvre.Scala 2.7.x prend en charge l'optimisation des appels de fin pour l'auto-récursivité (une fonction qui s'appelle elle-même) des méthodes finales et des fonctions locales.
Scala 2.8 pourrait également être fourni avec le support de la bibliothèque pour le trampoline, qui est une technique pour optimiser les fonctions mutuellement récursives.
De nombreuses informations sur l'état de la récursivité Scala sont disponibles sur le blog de Rich Dougherty .
la source
En plus de l'article lié à Lambda The Ultimate (à partir du lien mmyers publié ci-dessus), John Rose de Sun a encore plus à dire sur l'optimisation des appels de queue.
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
J'ai entendu dire qu'il pourrait un jour être implémenté sur la JVM. Le support des appels de queue, entre autres, est à l'étude sur la Da Vinci Machine.
http://openjdk.java.net/projects/mlvm/
la source
Toutes les sources indiquent que la JVM est incapable d'optimiser dans le cas de la récursivité de la queue, mais en lisant le réglage des performances de Java (2003, O'reilly), j'ai trouvé l'auteur affirmant qu'il pouvait obtenir de meilleures performances de récursivité en implémentant la récursivité de la queue.
Vous pouvez trouver sa revendication à la page 212 (recherchez 'tail recursion', cela devrait être le deuxième résultat). Ce qui donne?
la source