コンテンツにスキップ

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縮小が発生