- 97 名前:デフォルトの名無しさん mailto:sage [2006/01/02(月) 09:30:51 ]
- >>95
継続というのはその時点での全アクティベーションレコード (スタック フレームと思っておけばいい) そのものだから、基本的にはそれだけ 取っておけばいい。アクティベーションレコードを全部ヒープに アロケートする処理系なら単にその先頭のポインタを掴むだけで済む。 概念的にはとても単純。 複雑になるのは効率を考えるから。普通のプログラムは、継続が絡まない 通常の関数呼び出し/復帰の方がはるかに多く、その場合はスタックを 利用する方が一般的にずっと速い。けれどスタック上のアクティベーション レコードは関数復帰時に自動的に開放されてしまうから、継続が作られた 場合にそれを防ぐ何らかの方法がいる。継続作成時にヒープにコピーするとか、 継続作成時にスタックのベースを動かしてそれまでのスタックをヒープに しちゃうとか、色々テクニックはある。 それから、単純な関数呼び出し/復帰モデルで賢い最適化をしたつもりが、 継続が入るとうまく動かなくなるってことも多い。効率を考えてゆくと だんだん実装は複雑になる。
|

|