Gsp/spスタックの完全な意味論
表示
YOYUでは、gsp/spスタックを通じて構文スコープに沿った環境管理とメモリ再利用を両立させている。 このスタックはフレームごとにリファレンスカウンタを持ち、動的に分岐・共有される。
初期状態
[編集]スタックは空から始まり、spが新しい関数適用のたびに、refcount=1のフレームを積んでいく。 このときgspはspに追従し、今後の安全なスタック拡張位置を示す。
spの縮小
[編集]spが縮むとき、現在のフレームのrefcountが1であれば破棄される。 このとき、gspもそれに従って縮小される(メモリ再利用可能に)。
キャプチャ
[編集]クロージャが生成されると、spの親チェーンに対してrefcountを再帰的に+1する。 これにより、そのクロージャが生きている限り、該当スコープは保持される。
キャプチャ後のsp縮小
[編集]spが縮んでも、refcountは1に減るだけであり、0にならないため破棄されない。 よってgspも縮小されない。
新たなspの成長
[編集]spを新たに伸ばすときは、現在のgspの位置から新しいフレームをrefcount=1で積む。 gspは新たに積まれたフレームに更新される。
まとめ
[編集]- spはリファレンスカウンタの変化を伴いながら動く
- キャプチャがあればフレームは破棄されず、gspも縮まない
- 新たな適用はgspから安全に枝分かれ
- クロージャ破棄によりrefcount=0となれば、破棄・gsp縮小が発生