web-dev-qa-db-fra.com

Les moteurs Javascript sont-ils optimisés pour les appels de queue?

J'ai un algorithme de recherche de chemin récursif que j'ai implémenté en Javascript et je voudrais savoir si certains (tous?) Les navigateurs pourraient éventuellement obtenir des exceptions de dépassement de pile.

90
clofresh

La spécification ECMAScript 4 allait à l'origine ajouter la prise en charge du TCO, mais elle a été supprimée.

http://lambda-the-ultimate.org/node/3047

Pour autant que je sache, aucune implémentation de JS largement disponible ne fait actuellement de TCO automatique. Cela peut cependant vous être utile:

http://www.paulbarry.com/articles/2009/08/30/tail-call-optimization

Essentiellement, l'utilisation du modèle d'accumulateur produit le même effet.

47
Tim Sylvester

Pas de joie pour le moment, mais heureusement, des appels de queue appropriés sont prévus pour Harmony (ECMAScript version 6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls

26
Mr Speaker

À peu près tous les navigateurs que vous rencontrez s'abattront sur "trop de récursivité". Voici une entrée dans le traqueur de bogues V8 qui sera probablement intéressante à lire.

Si c'est une auto-récursivité simple, cela vaut probablement la peine d'utiliser l'itération explicite plutôt que d'espérer l'élimination de l'appel de queue.

12
Hank Gay

L'optimisation des appels de queue sera prise en charge dans le mode strict ECMAScript 6 à l'avenir. Vérifiez http://www.2ality.com/2015/06/tail-call-optimization.html pour plus de détails.

Vérifiez http://kangax.github.io/compat-table/es6/ pour le support moteur actuel.

À l'heure actuelle (18-07-2019), les moteurs suivants prennent en charge l'optimisation des appels de queue:

  • Safari> = 10
  • iOS> = 10
  • Kinoma XS6
  • Duktape 2.3

prise en charge si le drapeau "Fonctionnalités JavaScript expérimentales" est activé:

  • Noeud 6.5
  • Chrome 54/Opera 41 La version actuelle de la table compat ne la répertorie plus
11
Simon Zyx

L'optimisation des appels de queue est maintenant disponible dans LispyScript qui se compile en javascript. Vous pouvez en savoir plus ici .

3
Santosh

Actuellement, aucune implémentation JS ne reconnaît la récursivité de queue. Des modifications sont en cours dans ECMAScript 6, et comme d'autres l'ont dit, il existe un ticket ouvert sur V8

Ici vous pouvez voir l'assembleur généré par V8 pour une fonction de récursivité de queue

https://Gist.github.com/mcfedr/832e3553964a014621d5

Comparez cela à la façon dont clang a compilé la même fonction en C

https://Gist.github.com/mcfedr/63ad08370d856bad3694

V8 conserve l'appel récursif, tandis que le compilateur C a reconnu la récursivité de queue et l'a changé en boucle

2
mcfedr