español - ¿Están optimizados todos los motores de Javascript?
javascript pdf (6)
Actualmente, ninguna implementación de JS reconoce la recursividad de cola. Se están realizando cambios en ECMAScript 6, y como otros han dicho, hay un boleto abierto en V8
Aquí puede ver el ensamblador generado de V8 para una función de recursión de cola
gist.github.com/mcfedr/832e3553964a014621d5
Compare eso con cómo clang ha compilado la misma función en C
https://gist.github.com/mcfedr/63ad08370d856bad3694
V8 retiene la llamada recursiva, mientras que el compilador de C ha reconocido la recursividad final y la ha cambiado a un bucle
Tengo un algoritmo de búsqueda de rutas recursivo que he implementado en Javascript y me gustaría saber si alguno (¿todos?) Los navegadores posiblemente recibirán excepciones de desbordamiento de pila.
La especificación ECMAScript 4 originalmente iba a agregar soporte para TCO, pero se eliminó.
http://lambda-the-ultimate.org/node/3047
Hasta donde yo sé, ninguna implementación ampliamente disponible de JS actualmente realiza un TCO automático. Sin embargo, esto puede ser útil para usted:
http://www.paulbarry.com/articles/2009/08/30/tail-call-optimization
Esencialmente, usar el patrón del acumulador logra el mismo efecto.
La optimización de la llamada de cola será compatible con el modo estricto de ECMAScript 6 en el futuro. Consulte http://www.2ality.com/2015/06/tail-call-optimization.html para obtener detalles.
Consulte http://kangax.github.io/compat-table/es6/ para conocer la compatibilidad actual del motor.
Por el momento (05-01-2018) los siguientes motores son compatibles con la optimización de llamadas de cola:
- Safari 10
- iOS 10
- Kinoma XS6
soporte si está activada la función "funciones de JavaScript experimentales":
- Nodo 6.5
-
Chrome 54 / Opera 41La versión actual de la tabla compat no lo incluye más
La optimización de la llamada de la cola ahora está disponible en LispyScript que compila a javascript. Puedes leer más sobre esto here .
No hay alegría por el momento, pero afortunadamente las llamadas de cola adecuadas están programadas para Harmony (ECMAScript versión 6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
Prácticamente, todos los navegadores que encuentres perderán en "demasiada recursión". Aquí hay una entrada en el rastreador de errores V8 que probablemente será una lectura interesante.
Si se trata de una auto-recursión simple, probablemente valga la pena el esfuerzo de usar una iteración explícita en lugar de esperar la eliminación de la llamada final.