java jvm scala tail-recursion

java - ¿Evita la JVM las optimizaciones de llamadas de cola?



scala tail-recursion (5)

Además del documento vinculado en Lambda The Ultimate (del enlace de mmyers publicado anteriormente), 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

He oído que podría implementarse en la JVM algún día. El soporte de llamada de cola, entre otras cosas, se está estudiando en la máquina Da Vinci.

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

Vi esta cita sobre la pregunta: ¿Cuál es un buen lenguaje funcional sobre el cual construir un servicio web?

Scala en particular no es compatible con la eliminación de llamadas de cola, excepto en las 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?


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

En resumen, la optimización de la cola de llamada es difícil de hacer en la JVM debido al modelo de seguridad y la necesidad de tener siempre un rastro de pila disponible. En teoría, estos requisitos podrían ser compatibles, pero probablemente requerirían un nuevo bytecode (ver la propuesta informal de John Rose ).

También hay más discusión en Sun bug # 4726340 , donde finaliza la evaluación (desde 2002):

Creo que esto podría hacerse, no obstante, pero no es una tarea pequeña.

Actualmente, hay algo de trabajo en el proyecto Da Vinci Machine . El estado del subproyecto de llamada final se enumera como "proto 80%"; es poco probable que llegue a Java 7, pero creo que tiene muchas posibilidades de Java 8.


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 para que un lenguaje construido sobre la JVM proporcione llamadas de cola en sí. Hay soluciones que pueden lograr un efecto similar (por ejemplo, trampolín) pero tienen el grave costo de un rendimiento horrible y oscurecen el código intermedio generado que hace que un depurador sea inútil.

Por lo tanto, la JVM no puede admitir ningún lenguaje de programación funcional de calidad de producción hasta que Sun implemente las llamadas de cola en la propia JVM. Lo han estado discutiendo durante años, pero dudo que alguna vez implementen llamadas finales: será muy difícil porque han optimizado prematuramente su máquina virtual antes de implementar dicha funcionalidad 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.


Scala 2.7.x es compatible con la optimización de la cola de llamadas para la auto-recursión (una función que se llama a sí misma) de los métodos finales y las funciones locales.

Scala 2.8 podría venir con soporte de biblioteca para trampolín tambié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 recurrencia de Scala en el blog de Rich Dougherty .


Todas las fuentes apuntan a que la JVM no puede optimizar en el caso de recursividad final, pero al leer el ajuste de rendimiento de Java (2003, O''reilly) encontré al autor afirmando que puede lograr un mayor rendimiento de recursión implementando la recursión de cola.

Puede encontrar su reclamo en la página 212 (buscar ''recurrencia de cola'', debería ser el segundo resultado). ¿Lo que da?