Optimisation des appels terminaux TCO
Quand un appel de fonction est la dernière chose qui se produit, le compilateur peut réutiliser le cadre de pile existant au lieu d'en empiler un nouveau. La récursion devient alors une boucle.
La condition est que l'appel se trouve en position terminale, c'est-à-dire qu'il ne reste plus rien à faire après son retour — return f(x) convient, return f(x) + 1 non, puisque l'addition doit encore avoir lieu. Quand c'est le cas, inutile de sauvegarder une adresse de retour, et une récursion de profondeur arbitraire s'exécute en espace de pile constant. En Scheme, la norme l'impose et c'est le fondement de toute itération exprimée sous forme de récursion. En C, C++ et Rust, les compilateurs le font lorsque l'optimisation est activée, mais sans aucune garantie — le même code peut donc faire exploser la pile dans une build de débogage. JavaScript l'a spécifié dans ES6, mais seul Safari l'a jamais implémenté.