Turbineのメモリ管理について
これまでの記事では、Turbineの基本的な文法や特徴的なEnumの仕組みについて紹介してきました。今回は少し踏み込んで、Turbineの「メモリ管理」についてまとめます。
Turbineでは、ガベージコレクション(GC)による自動メモリ管理を採用しています。
そのため、C言語のように free()
を呼ぶ必要はなく、プログラマが明示的にメモリを解放する作業は基本的にありません。
とはいえ、VM(仮想マシン)の設計としてどのようにメモリが扱われているのか、気になる方も多いと思います。 この記事では、Turbineにおけるメモリ管理の仕組みを簡単に説明します。
プリミティブ型と参照型
Turbineでは、値の種類によってメモリ管理の対象が異なります。
-
プリミティブ型(
int
,float
,bool
など)はGC管理の対象外 - 参照型(配列、文字列、ユーザー定義の構造体など)はGCの管理対象
つまり、参照型の値はヒープ領域に確保され、レジスタやローカル変数にはヒープ上のオブジェクトを指す参照(ポインタ)が格納されるイメージです。
GCは、その参照をたどって到達可能なオブジェクトを生存判定します。
VMのレジスタ
TurbineのVMはレジスタベースで動作しています。 スタックベースVMのように push/pop で値をやりとりするのではなく、命令のオペランドとしてレジスタ番号を直接指定して値を扱う仕組みです。
さらにTurbineでは、コード生成の段階で一時的な式評価の値も含め、その関数が必要とするレジスタの数を静的に計算し、関数単位でレジスタ領域を割り当てます。 これにより、関数呼び出しごとに確保するレジスタ領域が最小限で済み、レジスタのオーバーラップによる無駄がありません。
各レジスタには、プリミティブ型の値または参照型の値が格納されます。
GCはレジスタに入っている参照型の値を正確に追跡し、不要になったヒープ上のオブジェクトを安全に回収します。
「正確な」GC
TurbineのGCは正確型のトレース型ガベージコレクタで、基本的なマークアンドスイープ方式を使っています。
- レジスタやスタックにあるどの値が参照で、どの値がプリミティブかを正確に判別できる
- ルート(グローバル変数、レジスタなど)から到達可能なオブジェクトだけをマークし、それ以外をスイープして解放する
- オブジェクトの中のフィールドも再帰的にたどってマークする
Turbineは静的型付け言語なので、コード生成の段階でVMのレジスタが保持している値をシミュレートし、各命令ごとにその時点でのレジスタの型状態を記録しています。 この情報をもとに、GC実行時には正確に「どのレジスタにオブジェクト参照があるか」を即座に把握できる仕組みです。
C言語でありがちな「保守的GC」のように「もしかしたらポインタかもしれないから残す」という曖昧さはなく、Turbineのバイトコード実行中は、静的型情報に基づいたスタックマップのようなテーブルを参照してGCを行います。
コード例
> gc
# main(args vec{string}) int
// 一時的なvecを作成
for i, val in vec{11, 22, 42}
print(2 * val)
// 一時的なvecのレジスタが上書きされる
for i in 0..10
print(2 * i)
print("before ===============================")
gc.print()
// 一時的なvecが回収される
gc.collect()
print("after ===============================")
gc.print()
return 0
このコードでは、一時的に生成した vec が最初のループで使われ、その後レジスタが別のループに上書きされることで参照が切れます。
gc.collect()
の呼び出しは即座にGCを走らせるのではなく、実際にはVMのCPUにGC割り込みフラグを立てて、セーフポイントでGCをトリガーする仕組みです。
とはいえ、ほとんどの場合はすぐにGCが実行されるので、手動で gc.collect()
を呼んだ感覚と近い動作になります。
まとめ
- TurbineはレジスタベースVM上で動作する
- 参照型のオブジェクトはGCで自動管理
- GCは正確型トレース方式のマークアンドスイープで安全かつ効率的
- プログラマは解放を意識しなくてよい
リンク
現在は開発中で、仕様や文法を少しずつ固めています。
詳細や開発ログは以下で公開しています:
👉 GitHub
👉 ドキュメント(英語)
興味のある方へ
- 新しい言語の設計に興味がある方
- C/C++と相性の良い小さなスクリプト言語を探している方
- Markdown風の軽量な構文に興味がある方
ぜひコメントやフィードバックをいただけると嬉しいです!
今後も開発進捗や実装例などを投稿していく予定です。