La limitación fundamental es simplemente que la JVM no proporciona cola de llamadas en su código de bytes y, en consecuencia, no hay forma directa de un lenguaje construido sobre la JVM para proporcionar la cola llama a sí misma. 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 se introdujo Scheme hace más de 30 años.
No acabo de seguir la explicación. Pensé que la optimización de la cola de cola fue implementada por el compilador. Suponiendo que tiene una función que podría ser optimizada por el compilador, también podría tener una función no recursiva equivalente que implemente la misma funcionalidad mediante un bucle, ¿correcto? Si es así, ¿no podría hacer esto el compilador? No soy capaz de seguir la dependencia de la JVM. ¿Cómo se compara esto con un compilador de Scheme que generó el código i386 nativo? –
Ok, acabo de ver la respuesta de Jon a continuación. Por lo tanto, no es que no se pueda implementar, es que no se puede implementar con la debida compatibilidad con el depurador –
@Gautham: Mi afirmación sobre la depuración fue en referencia al uso de trampolines como una solución para la falta de eliminación de llamadas finales en la JVM. La eliminación de llamada de cola puede y se ha implementado en la JVM (Arnold Schaighofer lo hizo en OpenJDK, y también en LLVM), por lo que no hay dudas sobre si se puede o no hacer. CLR de Microsoft, por supuesto, ha apoyado la eliminación de llamadas de cola durante 10 años y el lanzamiento de F # ha demostrado que es un cambio de juego. Creo que la respuesta es que la JVM hace tiempo que se ha estancado. –