CycloneはRustの前身となった言語で、C言語をベースにリージョンと呼ばれる考え方を用いたメモリ管理を採用した言語。Rust.)Cyclone公式にこうあるように、後続のRustへ「ライフタイム」としてのアイディアが引き継がれている。Rustの参考論文ページにも貼ってある論文。pointerのデリファレンスをコンパイル時に検出してエラーにするということを目指した。pointerとは、ポインタの指す先のリソースが解放済み状態のポインタのこと。pointerが起こり、もちろんコンパイル時に検出はできず実行時のエラーになる。そこで「リージョン(region)」という概念を型システムとしてC言語を拡張する形で導入し、不正なポインタへのアクセスをコンパイラが検出できるようにしつつ、デフォルトのリージョンの決定方法あるいはリージョン推論によってプログラマによる明示的なリージョンを記述が最小限になるようにしている。それまでの研究されていたリージョンによるメモリ1管理に加えて、リージョンサブタイピング、Effect、ローカルリージョン推論、存在型との組み合わせあたりを実践しているらしい。大前提としてメモリリークが起きないようなデザインにもなっている。CycloneがやらなかったことCycloneではリージョンによるメモリ管理を導入しつつも、ヒープリージョンのメモリ管理にはGCを採用している。このあたりはRustがいかにしてGCなしで実現しているかを別途解説したい。リージョン(region)とは?Cycloneではメモリはリージョンと呼ばれる領域にわけられて利用される。すべてのオブジェクトはどこかのリージョンに属し、リージョンが解放されるときにそのリージョンに属するオブジェクトがまとめて解放される。region」にあたる。region」は別の意味で使われている。ここでは論文に名前を合わせる。アロケート先だったりする。仕組みがなく、ヒープリージョンに置かれたデータはGCによって解放される。スタックリージョンはまさにいわゆる「スタック」に結びついたリージョンで、たとえば関数が呼びさされれば引数や関数内ローカル変数がそのリージョンにアロケートされ、呼び出しが終わればリージョンが解放される。サイズがコンパイル時に決まり、メモリのスタック上にアロケートされる。よって導入されるリージョンで、コンパイル時にサイズが決まっていない。実際にはヒープ上にアロケートされる。ようなリージョンを渡せるAPIを使ってメモリを動的にアロケートしたりできる。同じ感覚でアロケートでき、さらにブロックを抜ければリージョンが解放されるのでリークも起きない。listで実装され、足りなくなった場合は次のページを前のページの倍のサイズで作成する。リージョンハンドルは最後のページのアロケーションポイントへのポインタ。リージョンを解放するときは各ページを解放する。