Tengo un algoritmo de búsqueda de ruta recursiva de cola que he implementado en JavaScript y me gustaría saber si alguno (¿todos?) Los navegadores posiblemente obtendrían excepciones de desbordamiento de pila.
91
Tengo un algoritmo de búsqueda de ruta recursiva de cola que he implementado en JavaScript y me gustaría saber si alguno (¿todos?) Los navegadores posiblemente obtendrían excepciones de desbordamiento de pila.
only
una optimización. Soportarlo debería ser parte de la especificación del lenguaje, no del compilador / intérprete, ya que el código escrito en un intérprete / compilador con TCO probablemente no funcionaría en un intérprete / compilador sin TCO.Respuestas:
La especificación ECMAScript 4 originalmente iba a agregar soporte para TCO, pero se eliminó:
¿No más llamadas de cola en JavaScript?
Hasta donde yo sé, ninguna implementación de JavaScript ampliamente disponible actualmente genera TCO automático. Sin embargo, esto puede serle útil:
Optimización de llamadas de cola
Esencialmente, el uso del patrón acumulador logra el mismo efecto.
fuente
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
fuente
Prácticamente todos los navegadores que encuentres emitirán "demasiada recursividad". Aquí hay una entrada en el rastreador de errores V8 que probablemente será una lectura interesante.
Si se trata de una simple autorrecursión, probablemente valga la pena el esfuerzo de utilizar una iteración explícita en lugar de esperar la eliminación de la llamada final.
fuente
La optimización de la llamada de cola será compatible en el modo estricto ECMAScript 6 en el futuro. Consulte http://www.2ality.com/2015/06/tail-call-optimization.html para obtener más detalles.
Consulte http://kangax.github.io/compat-table/es6/ para conocer el soporte actual del motor.
Por el momento (18-07-2019), los siguientes motores admiten la optimización de llamadas de cola:
soporte si la bandera "características experimentales de JavaScript" está activada:
Chrome 54 / Opera 41La versión actual de la tabla de compatibilidad ya no la incluyefuente
La optimización de llamadas de cola ahora está disponible en LispyScript, que se compila en JavaScript. Puedes leer más sobre esto aquí .
fuente
Actualmente, ninguna implementación de JavaScript reconoce la recursividad de cola. Se están realizando cambios en ECMAScript 6 y, como han dicho otros, hay un ticket abierto en V8 .
Aquí puede ver el ensamblador generado por V8 para una función de recursión de cola:
Ejemplo de cómo V8 compila la recursividad
Compare eso con cómo Clang ha compilado la misma función en C
Ejemplo de recursividad de la cola del compilador de C
V8 retiene la llamada recursiva, mientras que el compilador de C ha reconocido la recursividad de cola y la ha convertido en un bucle.
fuente