末尾呼び出し最適化
関数呼び出しが最後の処理である場合、コンパイラが新しいスタックフレームを積まず、既存のものを再利用できる。再帰がループになる。
条件は、呼び出しが末尾位置にあること、つまり戻った後に何も処理が残らないことだ。return f(x) は該当するが、return f(x) + 1 は加算が残るので該当しない。条件を満たせば戻りアドレスを保存する理由がなく、任意の深さの再帰が一定のスタック領域で動く。Schemeでは規格で義務づけられており、あらゆる反復を再帰で表す土台になっている。
C、C++、Rustのコンパイラは最適化を有効にすると行うが、保証はない。そのため同じコードがデバッグビルドではスタックを使い果たすこともある。JavaScriptはES6で仕様に入れたが、実装したのはSafariだけだった。