Pregunta

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 de cola excepto en funciones autorrecursivas, lo que limita los tipos de composición que puede realizar (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?

¿Fue útil?

Solución

Esta publicación: ¿Recursión o iteración? podría ayudar.

En resumen, la optimización de las llamadas de cola es difícil de realizar en la JVM debido al modelo de seguridad y la necesidad de tener siempre un seguimiento de la pila disponible.En teoría, estos requisitos podrían ser compatibles, pero probablemente requerirían un nuevo código de bytes (consulte La propuesta informal de John Rose).

También hay más discusión en Insecto solar #4726340, donde finaliza la evaluación (de 2002):

Creo que esto se podría hacer de todos modos, pero no es una tarea pequeña.

Actualmente se están realizando algunos trabajos en el Máquina Da Vinci proyecto.El estado del subproyecto de llamada final aparece como "proto 80%";Es poco probable que llegue a Java 7, pero creo que tiene muchas posibilidades de llegar a Java 8.

Otros consejos

La limitación fundamental es simplemente que la JVM no proporciona llamadas de cola en su código de bytes y, en consecuencia, no existe una forma directa para que un lenguaje construido sobre la JVM proporcione llamadas de cola.Existen soluciones que pueden lograr un efecto similar (p. ej.trampolín), pero tienen el grave costo de un rendimiento terrible y de 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 llamadas de cola 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 de cola como una característica esencial desde que Scheme se introdujo por primera vez hace más de 30 años.

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 podría incluir soporte de biblioteca para trampolín, que es una técnica para optimizar funciones mutuamente recursivas.

Se puede encontrar una gran cantidad de información sobre el estado de la recursividad de Scala en El blog de Rich Dougherty.

Además del artículo vinculado en Lambda The Ultimate (del enlace que mmyers publicó anteriormente), John Rose de Sun tiene algo más que decir sobre la optimización de las llamadas de cola.

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

He oído que algún día podría implementarse en la JVM.Se está analizando el soporte de llamadas de cola, entre otras cosas, en la Máquina Da Vinci.

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

Todas las fuentes apuntan a que la JVM no puede optimizar en el caso de la recursividad de cola, pero al leer Ajuste del 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 'recursión de cola', debería ser el segundo resultado).¿Lo que da?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top