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.
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.
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
À 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.
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:
prise en charge si le drapeau "Fonctionnalités JavaScript expérimentales" est activé:
L'optimisation des appels de queue est maintenant disponible dans LispyScript qui se compile en javascript. Vous pouvez en savoir plus ici .
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