Dos años después de does-the-jvm-prevent-tail-call-optimizations , parece haber una implementación de prototipo y MLVM ha incluido la característica como "proto 80%" desde hace algún tiempo.
¿No hay un interés activo por parte de Sun / Oracle en admitir llamadas de cola o es solo que las llamadas de cola están "[...] predestinadas a ocupar el segundo lugar en cada lista de prioridades de funciones [...]" como se menciona en la JVM Cumbre de Idiomas ?
Me interesaría mucho si alguien hubiera probado una compilación de MLVM y pudiera compartir algunas impresiones de lo bien que funciona (si es que funciona).
Actualización: tenga en cuenta que algunas máquinas virtuales como Avian admiten llamadas de cola adecuadas sin ningún problema.
Respuestas:
Diagnóstico de código Java: Mejorar el rendimiento de su código Java ( alt ) explica por qué la JVM no admite la optimización de llamadas finales.
Luego da un ejemplo de código Java que no se transforma.
Luego proporciona una prueba que puede utilizar para averiguar si su JIT hace esto.
Naturalmente, dado que se trata de un documento de IBM, incluye un enchufe:
fuente
instanceof
verificación para ver sithis
es unExample
objeto (en lugar de una subclase deExample
).Una razón que he visto en el pasado para no implementar el TCO (y que se considera difícil) en Java es que el modelo de permisos en la JVM es sensible a la pila y, por lo tanto, las llamadas finales deben manejar los aspectos de seguridad.
Creo que Clements y Felleisen [1] [2] demostraron que esto no es un obstáculo y estoy bastante seguro de que el parche MLVM mencionado en la pregunta también lo trata.
Me doy cuenta de que esto no responde a su pregunta; simplemente agregando información interesante.
fuente
Quizás ya sepa esto, pero la característica no es tan trivial como puede parecer, ya que el lenguaje Java realmente expone el seguimiento de la pila al programador.
Considere el siguiente programa:
Aunque tiene una "llamada de cola", es posible que no se optimice. (Si está optimizado, aún requiere la contabilidad de toda la pila de llamadas, ya que la semántica del programa se basa en ella).
Básicamente, esto significa que es difícil admitir esto sin dejar de ser compatible con versiones anteriores.
fuente
g
en este caso ... piense en el polimorfismo y la reflexión, por ejemplo.getStackTrace()
de un métodox()
que el código fuente muestra que se llama desde un métodoy()
también muestra quex()
se llamó desdey()
? Porque si hay algo de libertad, no hay problema real.Java es el lenguaje menos funcional que puedas imaginar (bueno, de acuerdo, ¡ quizás no !) Pero esto sería una gran ventaja para los lenguajes JVM, como Scala , que lo son.
Mis observaciones son que hacer de la JVM una plataforma para otros lenguajes nunca pareció estar en la parte superior de la lista de prioridades para Sun y supongo que ahora para Oracle.
fuente