Tengo un algoritmo de ruta de acceso recursivo que he implementado en Javascript y me gustaría saber si alguno (¿todos?) Navegadores posiblemente recibirían excepciones de desbordamiento de pila.¿Están optimizados todos los motores de Javascript?
Respuesta
La especificación de ECMAScript 4 inicialmente iba a agregar compatibilidad con TCO, pero se quitó.
http://lambda-the-ultimate.org/node/3047
Por lo que yo sé, no hay implementaciones ampliamente disponibles actualmente de JS hacer automática TCO. Esto puede ser de utilidad para usted, sin embargo:
http://www.paulbarry.com/articles/2009/08/30/tail-call-optimization
Esencialmente, usando el patrón acumulador de lograr el mismo efecto.
O simplemente use un trampolín. .. – sclv
Solo un FYI, Rhino tiene TCO automático junto con Continuations en el modo "interpretado" (opt = -1) http://wiki.apache.org/cocoon/RhinoWithContinuations –
(lo siento por trolling) ECMAScript 6 ha incluido TCO, denominadas llamadas de cola apropiadas en la especificación. – frosty
Casi todos los navegadores que encuentre perderán en "demasiada recursión". Aquí hay un entry in the V8 bug tracker que probablemente será una lectura interesante.
Si se trata de una auto-recursión simple, es probable que valga la pena el esfuerzo de usar iteración explícita en lugar de esperar la eliminación de la llamada final.
El error finalmente ha sido aceptado. Es bajo la épica: "Armonía de solicitud de funciones". Esperemos que eso signifique que planean agregarlo a la compatibilidad con ES6 en V8. – Txangel
Puede votar por el soporte de TCO en Internet Explorer aquí: https://wpdev.uservoice.com/forums/257854-internet-explorer-platform/suggestions/6850816-es6-tail-call-optimization –
hay alegría por el momento, pero por suerte las llamadas de cola adecuados están programadas para la Armonía (ECMAScript versión 6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
@MarkWilbur La pregunta era específicamente sobre _browsers_, no todas las implementaciones existentes de ECMAScript. –
@UselessCode No, esta pregunta es sobre "motores Javascript" así que ... no solo los navegadores –
@BT De hecho, hay muchos entornos JS que no son de navegador, y el título usa los "motores Javascript" más genéricos, pero el cuerpo del pregunta especifica "... me gustaría saber si alguno (todos) ** navegadores ** posiblemente recibiría excepciones de desbordamiento de pila". –
optimización llamada cola está ahora disponible en LispyScript que compila a JavaScript. Puede leer más al respecto here.
¿Qué hay de la recursión mutua? – cat
Actualmente, ninguna implementación de JS reconoce la recursividad de cola. Se están realizando cambios en ECMAScript 6, y como otros han dicho, no es un billete abierto en V8
Aquí se puede ver ensamblador generado de V8 para una función de recursión de cola
https://gist.github.com/mcfedr/832e3553964a014621d5
que para comparar cómo clang ha recopilado 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 recursión de cola y lo cambió i nto un bucle
"Actualmente ninguna implementación de JS reconoce recursividad de cola". eso es incorrecto desde el Nodo 6.2.0, pero debes pasar una bandera –
Optimización de llamada de cola será compatible En el modo estricto de ECMAScript 6 en el futuro. Compruebe http://www.2ality.com/2015/06/tail-call-optimization.html para más detalles.
Compruebe http://kangax.github.io/compat-table/es6/ para el soporte del motor actual.
En el momento (01/05/2018) los siguientes motores de optimización de apoyo llamada de cola:
- Safari 10
- IOS 10
- Kinoma XS6
apoyo si "experimental Funciones de JavaScript "-flag está activado:
- Nodo 6.5
Chrome 54/Opera 41versión actual de la tabla compat no enumera nunca más
- 1. ¿Cómo funcionan los intérpretes/motores de JavaScript?
- 2. Motores 2D para Javascript
- 3. ¿Por qué los vales volátiles no están optimizados incluso en casos muy simples?
- 4. Cuándo usar los motores de plantillas de JavaScript?
- 5. ¿Los motores de búsqueda penalizarán el texto oculto por javascript?
- 6. ¿Cómo funcionan los motores de plantillas en JavaScript?
- 7. Comprobar si los elementos de todos los niños están ocultos
- 8. C# ¿los literales de cadena son optimizados por el compilador?
- 9. ¿Dónde están todos los recursos estándar de íconos de Android?
- 10. ¿Por qué los motores de búsqueda ignoran los símbolos?
- 11. ¿Grandes motores de animación para Javascript? - Javascript/Animaciones
- 12. Reemplazar todos los espacios que están dentro de llaves
- 13. Imprimir todos los beans de resorte que están cargados
- 14. ¿Están todos los scripts escritos en lenguajes de script?
- 15. ¿Están todos los métodos de Java Properties totalmente sincronizados?
- 16. ¿Los motores de búsqueda captarán palabras clave y metaetiquetas de descripción generadas mediante JavaScript?
- 17. ¿Dónde están todos los lugares Sql Reporting Server Logs Errors?
- 18. ¿Qué pueden lograr los motores de reglas?
- 19. ¿Instalando todos los paquetes CRAN que aún no están instalados?
- 20. Use jQuery para verificar si todos los div están ocultos
- 21. C3P0 aparente interbloqueo cuando los hilos están todos vacíos?
- 22. JavaScript KeyCode Los valores están "indefinidos" en Internet Explorer 8
- 23. Borrar todos los campos HTML usando javascript
- 24. Ocultar todos los divs con javascript
- 25. javascript reemplazar selección todos los navegadores
- 26. Viendo todos los tiempos de espera/intervalos en javascript?
- 27. Motores de plantilla de JavaScript basados en DOM DOM
- 28. ¿Los elementos HTML5 significan algo para los motores de búsqueda?
- 29. ¿Los motores de búsqueda agregan peso a los microformatos?
- 30. ¿Qué motores usan los principales navegadores?
¿Es realmente un algoritmo recursivo, o un algoritmo iterativo implementado con la recursividad? Tengo entendido que TCO solo puede ayudar con este último. – nmichaels
Solo quiero agregar que TCO no es 'solo' una optimización. Respaldarlo debe ser parte de la especificación del lenguaje, no del compilador/intérprete ya que el código escrito contra un intérprete/compilador con TCO probablemente no funcionaría en un intérprete/compilador sin TCO. – Hoffmann
Puede ver el soporte actual y observar cómo evoluciona en todos los motores en la tabla de compatibilidad ES6 de Kangax aquí: http://kangax.github.io/compat-table/es6/#proper_tail_calls_(tail_call_optimisation) –