ミニミニGCを作ってみた

コソコソとGC勉強会なるものをSkype上でやっており,
「来週は言語処理系作るか,GC作ってこいや」
というハードな宿題が出たので作った.

ソースコード

authorNari/minigc · GitHub
githubに載せた.
 
一応conservativeGC.
関数スタックしかチェックしていない.
大域変数などはadd_roots関数で指定すること.
# この辺は手抜き感な感じ

動作確認

static void
test_garbage_collect_load_test(void) {
    void *p;
    int i;
    for (i = 0; i < 200; i++) {
        p = mini_gc_malloc(1000000);
    }
    assert((((Header *)p)-1)->flags);
}

を動かしてみる.

./gc test
free objet : 0x8068010
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
free objet : 0x8068084
...
free objet : 0x8068084

何か色々解放されているよう.
これはめでたい!

用途

手は抜いてますがなるべく読みやすいように作ったので,とりあえず読み物としてどうかなと.
ソースコードは350行くらい.(gc部分)
conservativeGCというのは真面目に書くと複雑になってしまいとても読めないので,
ちょっとだけ読んでみたいという人には便利だと思う.

感想

ようやくGCが簡単に作れるようになったんだと感動した.
1年くらいかかっただろうか.
# 母さん.赤飯を炊きなさい.
 
とても楽しいので,みんなも作ると良いですよ.

TODO

ポインタからヘッダを辿るアルゴリズムの修正.
今はリニアサーチしてるので木を組んでわりと高速に探索できるようにしたいな.