Recherche…


Syntaxe

  • seulement retourne un appel () implicitement tel que dans la fonction flèche ou explicitement, peut être un état de fin d'appel
  • function foo () {barre de retour (); } // l'appel à la barre est un appel de queue
  • fonction foo () {bar (); } // bar n'est pas un appel de queue. La fonction retourne undefined quand aucun retour n'est donné
  • const foo = () => bar (); // bar () est un appel de queue
  • const foo = () => (poo (), bar ()); // caca n'est pas un appel de queue, la barre est un appel de queue
  • const foo = () => poo () && bar (); // caca n'est pas un appel de queue, la barre est un appel de queue
  • const foo = () => bar () + 1; // bar n'est pas un appel de queue car il nécessite un contexte pour retourner + 1

Remarques

TCO est également appelé PTC (Proper Tail Call), tel qu'il est mentionné dans les spécifications ES2015.

Qu'est-ce que l'optimisation d'appel de queue (TCO)?

Le TCO est uniquement disponible en mode strict

Comme toujours vérifier les implémentations de navigateur et de Javascript pour la prise en charge de toutes les fonctionnalités de langage, et comme avec toute fonctionnalité ou syntaxe de javascript, cela peut changer dans le futur.

Il offre un moyen d'optimiser les appels de fonctions récursifs et profondément imbriqués en éliminant le besoin de pousser l'état des fonctions sur la pile d'images globale et en évitant de passer par chaque fonction d'appel en retournant directement à la fonction d'appel initiale.

function a(){
   return b(); // 2
} 
function b(){
   return 1;  // 3
}
a(); // 1

Sans TCO, l'appel à a() crée une nouvelle image pour cette fonction. Lorsque cette fonction appelle b() la trame de a a() est poussée sur la pile d'images et une nouvelle image est créée pour la fonction b()

Lorsque b() retourne à a() a() est sorti de la pile des images. Il retourne immédiatement au cadre global et n'utilise donc aucun des états sauvegardés sur la pile.

TCO reconnaît que l'appel de a() à b() est à la fin de la fonction a() et qu'il n'est donc pas nécessaire de pousser l'état d' a() sur la pile de trames. Lorsque b(0) renvoie plutôt que de retourner à a() il retourne directement au cadre global. Optimisation supplémentaire en éliminant les étapes intermédiaires.

TCO permet aux fonctions récursives d'avoir une récursivité indéfinie, car la pile de trames ne grossira pas à chaque appel récursif. Sans TCO, la fonction récursive avait une profondeur récursive limitée.

Remarque TCO est une fonctionnalité d'implémentation du moteur JavaScript, il ne peut pas être implémenté via un transpiler si le navigateur ne le prend pas en charge. Il n'y a pas de syntaxe supplémentaire dans la spécification requise pour implémenter le TCO et il est donc à craindre que le TCO puisse casser le Web. Sa sortie dans le monde est prudente et peut nécessiter des indicateurs spécifiques au navigateur / moteur pour le futur perceptible.

Boucles récursives

Tail Call Optimization permet de mettre en œuvre en toute sécurité des boucles récursives sans se soucier du débordement de la pile d'appels ou de la surcharge d'une pile de trames croissante.

function indexOf(array, predicate, i = 0) {
    if (0 <= i && i < array.length) {
        if (predicate(array[i])) {  return i; }
        return indexOf(array, predicate, i + 1); // the tail call
    }
}
indexOf([1,2,3,4,5,6,7], x => x === 5); // returns index of 5 which is 4


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow