リージョン
region
GCと異なり、静的にメモリ管理をすることができる
GCに比べて早期にオブジェクトの解放ができる
参照カウントGCなどに比べれ実行時オーバーヘッドが小さい
メモリのヒープ領域をリージョンという抽象化された領域に分割する
オブジェクトをリージョンの中に割り付けて、
リージョンの中のオブジェクトがすべて不要になったら、
リージョンをまるごと回収する
メモリの確保・解放をリージョン毎に行う
リージョンを開始するときにそれ用のメモリを用意する
リージョンが終わったタイミングで回収する
ブロック文と同じノリ
リージョンは入れ子ができる
関数では返り値をどのリージョンに置くのかをGenericsっぽく指定したりする
コード例 ref
code:ml
letlec appendr1 p = -- ここで指定する
let (xs, ys) = p
in case xs of
nil => ys
| x::xs' => (x::letregion r2 in
(appendr1 ((xs', ys) at r2))
end at r1)
end
end
この辺の推論を良い感じにするのがリージョン推論
リージョンとブロック文の違い
リージョンには名前をつける
メモリ割り当て時にどのリージョンに置くのかを指定する
リージョンは型で表現される
普通の型intなどを拡張して(int, r)のような型に拡張する
ここでrはその値を格納するリージョンを表す
関数の型はこんな感じになる
((int, r1)->(int, r2), r3)
「r1に格納された整数を引数にとり、r2に格納された値を返す」というr3に格納された関数
論文
Implementation of the Typed Call-by-value lambda-calculus using a Stack of Regions pdf
Mads Tofte
リージョンの原点?
参考
リージョンについて | κeenのHappy Hacκing Blog
https://cyclone.thelanguage.org/wiki/Introduction%20to%20Regions/
Cycloneのドキュメント
https://blog.waft.me/2017/09/22/region-based-01/
https://blog.waft.me/2017/09/24/region-based-02/
/layerx/Region-Based Memory Management in Cyclone
https://anemone.dodgson.org/2015/04/22/rust-lifetimes/