¿Scala es compatible con la optimización de la recursividad de cola?¿Scala es compatible con la optimización de la recursividad de cola?
Respuesta
Scala realiza la optimización de recursión de cola en tiempo de compilación, como han dicho otros carteles. Es decir, el compilador transforma una función recursiva de cola en un bucle (una invocación de método se transforma en un salto), como se puede ver en el seguimiento de pila cuando se ejecuta una función recursiva de cola.
Prueba el siguiente fragmento:
def boom(n: Int): Nothing = if(n<=0) throw new Exception else boom(n-1)
boom(10)
e inspeccione el seguimiento de la pila. Mostrará solo una llamada al auge de funciones, por lo tanto, el bytecode compilado no es recursivo.
Hay una propuesta que flota en torno al implement tail calls at the JVM level, lo que en mi opinión sería una gran cosa, ya que la JVM podría optimizar el tiempo de ejecución en lugar de compilar las optimizaciones de tiempo del código, y podría significar una cola más flexible recursividad. Básicamente, un tailcall invoke
se comportaría exactamente como un método normal invoke
, pero abandonará la pila de la persona que llama cuando sea seguro hacerlo: la especificación de la JVM establece que las estructuras de pila deben conservarse, por lo que el JIT debe realizar un análisis de código estático para averigua si los marcos de pila nunca serán utilizados.
El estado actual de la misma es proto 80%. No creo que se haga a tiempo para Java 7 (invokedynamic
tiene una mayor prioridad, y la implementación está casi lista) pero Java 8 podría verlo implementado.
Solo en casos muy simples en los que la función es autorecitante.
Proof of tail recursion ability.
Parece Scala 2.8 podría ser mejorar el reconocimiento de cola recursividad, sin embargo.
"Solo en casos muy simples en los que la función es recursiva por sí misma.": ¿Esto significa que al usar continuaciones uno podría fácilmente quedarse sin espacio en la pila? – Giorgio
@Giorgio: Sí .. –
Scala 2.7.x es compatible con la optimización de la llamada de cola para auto-recurrencia (una función que se llama a sí misma) de los métodos finales y las funciones locales.
Scala 2.8 puede venir con soporte de biblioteca para trampolín también, que es una técnica para optimizar las funciones mutuamente recursivas.
Se puede encontrar mucha información sobre el estado de la recurrencia de Scala en Rich Dougherty's blog.
También sobre trampolines monádicos: http://apocalisp.wordpress.com/2011/10/26/tail-call-elimination-in-scala-monads/ – Vadzim
En Scala 2.8 se puede utilizar para marcar @tailrec
método específico que espera el compilador optimizará:
import scala.annotation.tailrec
@tailrec def factorialAcc(acc: Int, n: Int): Int = {
if (n <= 1) acc
else factorialAcc(n * acc, n - 1)
}
Si un método no puede ser optimizado recibe una advertencia.
Es necesario importar la anotación con "import scala.annotation.tailrec" – Callum
- 1. Obtengo una StackOverFlowException en este código porque mi JVM no es compatible con la optimización de llamadas de cola, ¿verdad?
- 2. Cola-recursividad en Oz
- 3. ¿PHP optimiza la recursividad de cola?
- 4. ¿array_walk_recursive utiliza la optimización de la cola de cola?
- 5. ¿Frege realiza la optimización de la cola de llamada?
- 6. Recursividad de cola en C++
- 7. ¿Java soporta recursividad de cola?
- 8. ¿CUDA es compatible con la recursión?
- 9. ¿MATLAB realiza la optimización de la cola de llamada?
- 10. optimización de llamadas de cola en Mathematica?
- 11. ¿Esta función usa recursividad de cola?
- 12. Creación de una cola en la Scala
- 13. Longitud máxima para la cola de scala
- 14. ¿Hay problemas que no se pueden escribir utilizando la recursividad de cola?
- 15. C optimización de llamadas de cola
- 16. ¿Ruby realiza optimización de llamadas de cola?
- 17. Explícame cuál es el gran problema con la optimización de la cola de llamadas y por qué Python lo necesita
- 18. ¿Cómo funciona la recursividad de Haskell tail?
- 19. ¿Por qué el compilador de Scala no aplicará la optimización de la cola de cola a menos que un método sea definitivo?
- 20. Recursividad de cola frente a recursión hacia adelante en Erlang
- 21. Coeficiente binomial usando recursividad de cola en LISP
- 22. ¿CouchDB es compatible con la integridad referencial?
- 23. ¿La plataforma Android es compatible con SpatiaLite?
- 24. ¿La codificación gzip es compatible con JSON?
- 25. entendimiento y la visualización de la recursividad
- 26. ¿Qué es la optimización de código?
- 27. optimización de la recursión de la cola ocurre en la depuración de Visual Studio 10 x64, pero no en la versión?
- 28. Recursividad de Powershell con devolución
- 29. ¿Realmente Spring no es compatible con la inyección de interfaz?
- 30. ¿Es IE9 compatible con la API de archivos HTML5?
"El estado actual es proto 80% ". No entiendo. Creo que Arnold Schwaighofer implementó esto por completo bajo la guía de John Rose hace años. –
@JanHarrop tal vez se trató de recursividad de cola en lugar de llamadas de cola generales? – Cubic
@Cubic: No, fueron llamadas de cola generales. Arnold también los implementó en LLVM. –