J'ai un algorithme de recherche de chemin récursif de queue que j'ai implémenté en JavaScript et j'aimerais savoir si certains (tous?) Navigateurs pourraient éventuellement obtenir des exceptions de dépassement de pile.
91
J'ai un algorithme de recherche de chemin récursif de queue que j'ai implémenté en JavaScript et j'aimerais savoir si certains (tous?) Navigateurs pourraient éventuellement obtenir des exceptions de dépassement de pile.
only
une optimisation. Le supporter devrait faire partie de la spécification du langage, pas du compilateur / interpréteur puisque le code écrit contre un interpréteur / compilateur avec TCO ne fonctionnerait probablement pas sur un interpréteur / compilateur sans TCO.Réponses:
La spécification ECMAScript 4 allait à l'origine ajouter la prise en charge du TCO, mais elle a été abandonnée:
Plus d'appels de queue en JavaScript?
Pour autant que je sache, aucune implémentation largement disponible de JavaScript n'effectue actuellement un TCO automatique. Cela peut cependant vous être utile:
Optimisation des appels de queue
Essentiellement, l'utilisation du modèle d'accumulateur produit le même effet.
la source
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
la source
Pratiquement tous les navigateurs que vous rencontrerez seront "trop récursifs". Voici une entrée dans le traqueur de bogues V8 qui sera probablement une lecture intéressante.
S'il s'agit d'une simple auto-récursivité, il vaut probablement la peine d'utiliser une itération explicite plutôt que d'espérer l'élimination des appels de fin.
la source
L'optimisation des appels de queue sera prise en charge dans le mode strict d'ECMAScript 6 à l'avenir. Consultez http://www.2ality.com/2015/06/tail-call-optimization.html pour plus de détails.
Consultez http://kangax.github.io/compat-table/es6/ pour la prise en charge actuelle du moteur.
Pour le moment (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é:
Chrome 54 / Opera 41La version actuelle de la table de compatibilité ne la répertorie plusla source
L'optimisation des appels de queue est maintenant disponible dans LispyScript qui se compile en JavaScript. Vous pouvez en savoir plus ici .
la source
Actuellement, aucune implémentation JavaScript ne reconnaît la récursivité de la 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:
Exemple de comment V8 compile la récursivité
Comparez cela à la façon dont Clang a compilé la même fonction en C
Exemple de récursivité de la queue du compilateur C
V8 conserve l'appel récursif, tandis que le compilateur C a reconnu la récursivité de queue et l'a transformée en boucle.
la source