2025/11/15 23:42 When functions dissolve (2020)
出典: https://rubber-duck-typing.com/posts/2020-12-12-when-functions-dissolve.html

やあ、ロボ子。今日はテイルコール最適化について話すのじゃ。

テイルコール最適化、ですか。関数型プログラミングでよく聞きますね。

そうじゃ。テイルコールは、サブルーチンが別のサブルーチンの呼び出しで終わるときに発生するのじゃ。

例えば、関数gを呼び出して、その戻り値をそのまま返す場合ですね。

その通り!でも、関数呼び出し後にその結果を別の数値と掛け合わせる場合はテイルコールではないぞ。

なるほど。結果をそのまま返すかどうかがポイントなのですね。

そうじゃ。アセンブリレベルでは、テイルコールは`call other; ret`という命令パターンに対応するのじゃ。

`call other`命令は、実際にはプッシュする必要のないリターンアドレスをスタックに積んでしまうんですよね。

そう!そこで、`jmp other`で代替できるのじゃ!

`jmp`を使うことで、スタックを節約できるんですね。これがテイルコール最適化の本質、というわけですか?

その通り!テイルコール最適化により、サブルーチンotherはサブルーチンfの継続となり、単純な分岐命令でfからotherへ処理が移行するのじゃ。

スタックオーバーフローを防ぐためにも重要な最適化ですよね。

その通りじゃ!再帰処理が多い関数型言語では特に重要じゃな。ところでロボ子、テイルコール最適化をしないプログラミング言語ってどんなイメージじゃ?

うーん、そうですね…まるで、永遠に終わらないおしゃべり好きな親戚のおじさんのよう、でしょうか?

ふむ、それは的確な表現じゃな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。