61 votes

Débordement de la pile d'optimisation de la récursivité de la queue ES6

Après avoir lu le Dr Rauschmayer description de récursive queue appel d'optimisation dans l'es6, depuis, j'ai essayé de recréer le " zéro de la pile de l'exécution de la fonction factorielle récursive précise-t-il.

En utilisant le Chrome débogueur à l'étape entre la pile d'images, je vois que la queue de l'optimisation n'est pas naturel et un cadre de pile est en cours de création pour chaque récursion.

J'ai aussi essayé de tester l'optimisation par l'appel de la fonction sans le débogueur, mais au lieu de passer 100000 à la fonction factorielle. Cela jette un 'maximale de la pile d'erreur", ce qui implique qu'il est, en fait, n'est pas optimisé.

Voici mon code:

const factorial = (n, acc = 1) => n <= 1 ? acc : factorial(n - 1, n * acc)
console.log( factorial(100000) )

Résultat:

Uncaught RangeError: Maximum call stack size exceeded

94voto

T.J. Crowder Points 285826

V8, le moteur JavaScript de Chrome, avait TCO soutien pour un certain temps, mais aussi de cette mise à jour de la réponse (novembre 2017) il ne le fait plus et de cette écriture, il n'y a pas de développement actif sur le TCO en V8, et aucun n'est prévu. Vous pouvez lire les détails dans le V8 de suivi de bug pour elle.

Coût total de possession de soutien semble avoir atteint un niveau décent en V8 à un moment donné, mais est resté derrière un drapeau pour plusieurs raisons (débogage des problèmes, des bugs). Mais alors plusieurs choses qui s'est passé, pas moins que le V8 de l'équipe soulevé d'importantes questions avec TCO et fortement soutenu un spec changement appelé syntaxique queue appels (Cct) qui exigerait que les appels tail être marqué dans le code source intentionnellement (par exemple, return continue doThat();). Cette proposition est devenu inactif en juillet 2017, si. En juillet également, avec aucun coût total de possession travail étant fait, le V8 équipe a retiré le code pour soutenir coût total de possession à partir de la source pour Turboréacteur* qu'elle serait autrement tenue d'bitrot. (E. g., devenu un entretien de la douleur et de la source de bugs.)

Donc, à l'heure actuelle (Novembre 2017), il n'est pas évident que "l'invisible" coût total de possession ne sera jamais en V8, si un certain type de Cct entrera dans, ou quoi. Le Chrome Plate-forme de page d'État pour ce indique "mixte" du public de signaux à partir de Mozilla (Firefox/SpiderMonkey) et Microsoft (Edge/Chakra) sur le soutien total de possession, que Safari est de l'expédition avec le coût total de possession, et que les développeurs web sont "positifs" sur la fonctionnalité. Nous allons voir où nous allons partir d'ici. Si n'importe où.

* (Turboréacteur = le courant de pointe compilateur JIT en V8, ils ont basculé de Plein Codegen [JIT] + Vilebrequin [agressif optimisation JIT] à l'Allumage [interprète+] et du Turboréacteur [agressif optimisation JIT])

19voto

Freewalker Points 177

Le moteur V8 de google Chrome JS moteur) de l'équipe n'est pas mise en œuvre coût total de possession pour le moment. Il est arraché à la version la plus récente (voir ce fil).

Des principaux navigateurs, seul Safari a effectivement mis en œuvre la fonctionnalité.

Dans Node.JS la version 8 et plus tard, coût total de possession n'est pas disponible.

Il y a peut être un espoir de TCO cours de mise en œuvre: dans un récent WebAssembly réunion, Google et tous les autres groupes présents étaient neutres ou positives vers l'exploration TCO mise en œuvre de plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X