「継続」と「末尾呼出除去の最適化」の違い

 Luaには「末尾呼出除去の最適化」という仕様があって、そもそもみはえるはこの「末尾呼出除去の最適化(名称が長いよ!)=継続」なのかと思っていました。以下、Luaにおける「末尾呼出除去の最適化」を説明します。詳しくはリファレンスマニュアルを参照して下さい。

 あるメソッドAのreturnの値メソッドBが設定してあるとします。また、メソッドBでは値αを返すとします。
 メソッドAにおいてreturn文に到達すると、メンバコールスタックに現在のアドレスXが積まれ、メソッドBが呼び出されます。メソッドBで演算が行われ、値αが返ります。VM*1メンバコールスタックからアドレスをポップし、メソッドAに帰ってきます。メソッドAはすぐにreturnが実行されるので、値αはそのままメソッドAの外に返されます。
 さて、この時、アドレスXがスタックに積まれる事に意味があるでしょうか? 値αはメソッドAで使われる事無く、直接外に渡されます。ですから、このスタックに積む処理は省略する事が出来ます。これが、末尾呼出除去の最適化です。
 

*1:インタプリタ言語で「プログラムを実行している主体」を表す用語ってあるんでしょうか? CPUとかでいいのかしら?