Vi esta cita sobre la pregunta: ¿Cuál es un buen lenguaje funcional sobre el que construir un servicio web?
Scala, en particular, no admite la eliminación de llamadas finales, excepto en funciones auto-recursivas, lo que limita los tipos de composición que puede hacer (esta es una limitación fundamental de la JVM).
¿Es esto cierto? Si es así, ¿qué tiene la JVM que crea esta limitación fundamental?
fuente
La limitación fundamental es simplemente que la JVM no proporciona llamadas de cola en su código de bytes y, en consecuencia, no hay una forma directa de que un lenguaje construido sobre la JVM proporcione llamadas de cola por sí mismo. Hay soluciones que pueden lograr un efecto similar (por ejemplo, trampolín) pero tienen el grave costo de un rendimiento terrible y ofuscar el código intermedio generado, lo que hace que un depurador sea inútil.
Por lo tanto, la JVM no puede admitir ningún lenguaje de programación funcional con calidad de producción hasta que Sun implemente las llamadas finales en la propia JVM. Lo han estado discutiendo durante años, pero dudo que alguna vez implementen llamadas de cola: será muy difícil porque han optimizado prematuramente su VM antes de implementar una funcionalidad tan básica, y el esfuerzo de Sun se centra fuertemente en lenguajes dinámicos en lugar de lenguajes funcionales.
Por lo tanto, existe un argumento muy fuerte de que Scala no es un lenguaje de programación funcional real: estos lenguajes han considerado las llamadas finales como una característica esencial desde que Scheme se introdujo por primera vez hace más de 30 años.
fuente
Hence there is a very strong argument that Scala is not a real functional programming language
- el argumento es bastante débil. Claro que sítail calls [as] an essential feature
, y bueno si el hardware subyacente (o máquina virtual) lo admite directamente. Pero son los detalles de la implementación.Scala 2.7.x admite la optimización de llamadas de cola para la autorrecursión (una función que se llama a sí misma) de métodos finales y funciones locales.
Scala 2.8 también puede venir con soporte de biblioteca para trampoline, que es una técnica para optimizar funciones recursivas mutuas.
Se puede encontrar una gran cantidad de información sobre el estado de la recursividad de Scala en el blog de Rich Dougherty .
fuente
Además del documento vinculado en Lambda The Ultimate (del enlace que mmyers publicó arriba), John Rose de Sun tiene algo más que decir sobre la optimización de llamadas de cola.
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
Escuché que algún día podría implementarse en la JVM. El soporte de llamadas de cola, entre otras cosas, se está analizando en la máquina Da Vinci.
http://openjdk.java.net/projects/mlvm/
fuente
Todas las fuentes apuntan a que la JVM no puede optimizar en el caso de recursividad de cola, pero al leer el ajuste de rendimiento de Java (2003, O'reilly) encontré que el autor afirma que puede lograr un mayor rendimiento de recursividad implementando la recursividad de cola.
Puede encontrar su reclamo en la página 212 (busque 'recursividad de cola', debería ser el segundo resultado). ¿Lo que da?
fuente