¿La JVM evita optimizaciones de tail call?


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 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?

Author: Community, 2008-09-20

5 answers

Este post: Recursión o Iteración? podría ayudar.

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

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

Creo sin embargo, esto podría hacerse, pero no es una tarea pequeña.

Actualmente se está trabajando en el proyecto Máquina Da Vinci. El estado del subproyecto tail call aparece como " proto 80%"; es poco probable que llegue a Java 7, pero creo que tiene una muy buena oportunidad en Java 8.

 72
Author: Michael Myers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:00:17

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

Por lo tanto, la JVM no puede soportar ninguna función de calidad de producción los lenguajes de programación hasta Sun implementan llamadas tail 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 tal funcionalidad básica, y el esfuerzo de Sun está fuertemente enfocado en lenguajes dinámicos en lugar de lenguajes funcionales.

Por lo tanto, hay 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.

 27
Author: Jon Harrop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-05 18:02:25

Scala 2.7.x admite la optimización de llamadas de cola 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 las funciones mutuamente recursivas.

Una buena cantidad de información sobre el estado de la recursión de Scala se puede encontrar en El blog de Rich Dougherty.

 21
Author: Daniel C. Sobral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-19 02:12:32

Además del documento vinculado en Lambda The Ultimate (del enlace 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 Tail call, entre otras cosas, se está analizando en la máquina Da Vinci.

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

 8
Author: faran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-16 23:05:11

Todas las fuentes apuntan a que la JVM no puede optimizar en el caso de la recursión de cola, pero al leer Java performance tuning (2003, O'reilly) encontré que el autor afirma 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 'recursión de cola' debería ser el segundo resultado). ¿Qué pasa?

 0
Author: fthinker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-05 16:19:33