2010-09-07 9 views
86

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?

+2

¿Es realmente un algoritmo recursivo, o un algoritmo iterativo implementado con la recursividad? Tengo entendido que TCO solo puede ayudar con este último. – nmichaels

+1

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

+1

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) –

Respuesta

46

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.

+11

O simplemente use un trampolín. .. – sclv

+1

Solo un FYI, Rhino tiene TCO automático junto con Continuations en el modo "interpretado" (opt = -1) http://wiki.apache.org/cocoon/RhinoWithContinuations –

+5

(lo siento por trolling) ECMAScript 6 ha incluido TCO, denominadas llamadas de cola apropiadas en la especificación. – frosty

12

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.

+0

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

+0

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 –

26

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

+1

@MarkWilbur La pregunta era específicamente sobre _browsers_, no todas las implementaciones existentes de ECMAScript. –

+1

@UselessCode No, esta pregunta es sobre "motores Javascript" así que ... no solo los navegadores –

+1

@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". –

3

optimización llamada cola está ahora disponible en LispyScript que compila a JavaScript. Puede leer más al respecto here.

+0

¿Qué hay de la recursión mutua? – cat

2

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

+0

"Actualmente ninguna implementación de JS reconoce recursividad de cola". eso es incorrecto desde el Nodo 6.2.0, pero debes pasar una bandera –

7

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 41 versión actual de la tabla compat no enumera nunca más
Cuestiones relacionadas