CRubyのGC実装で参考にされたScheme処理系:SIOD - GC Advent Calendar

Garbage Collection Advent Calendarの8日目(!!)の記事です。

gc.cの最初のほうのコミットを見るとCOPYRIGHTがあって、SIOD:Scheme In One Defunという処理系を参考にまつもとさんはCRubyのGCを実装されたみたいなんですね。
Ruby Issue Tracking System
この当時はスッキリしたソースコードですね。

SIOD - Wikipedia, the free encyclopedia
SIOD: Scheme in One Defun
SIODは公式サイトなどを読むと1988年にリリースされ、最後のリリースが2007年、と。
20年も続いてんのかあ。

で、wikipediaには以下のように書かれていますね。

Scheme In One Defun (or Scheme In One Day) is a small-footprint
implementation of the Scheme programming language, written in C and
designed to be embedded inside C programs.

http://en.wikipedia.org/wiki/SIOD

Cのプログラムに組み込めるように設計されて、small-footprintで…と。
SIODのGCを参考にまつもとさんがはじめにCRubyのGCを作り、15年経った現在に組み込み用途のmrubyを作っているのはなかなか興味深いですね。

余談: SIODはScheme In One Dayということですが、mrubyの最初のGCもまつもとさんが会議中に内職して1時間くらいで作ったと風の噂で聞きました。Mruby GC In One (Boring) Meeting...ッ。

SIODの使用例として有名なところではGIMPのScript-fuで使われていたようです(現在は使われていないみたいですが)。しらなかった…。
残念ながら公式サイトでダウンロードできるソースコードは解凍できないようなので、以下のサイトでバージョン3.2をダウンロードして読んでみたいと思います。
Scheme Implementations

さて、Garbage Collectionの説明を見てみると、なんと、驚くことにCopyingとMark&Sweepが実装されているんですよ。
SIOD: Scheme in One Defun
おおお、これは一歩間違えば、Copyingになってたのかなあ。
「コンパクションが!」みたいに口角泡を飛ばす人もいなかったのかなあと思いますが、かわりに「CoWフレンドリーヘイカモーン!!」みたいな声が増えたんでしょうね。まあ、それはおいといて。

さてSIODを読んでみようと思うんですが、何も言わず、まずはこいつを見て欲しい。

long looks_pointerp(LISP p)
{long j;
 LISP h;
 for(j=0;j<nheaps;++j)
   if ((h = heaps[j]) &&
       (p >= h) &&
       (p < (h + heap_size)) &&
       (((((char *)p) - ((char *)h)) % sizeof(struct obj)) == 0) &&
       NTYPEP(p,tc_free_cell))
     return(1);
 return(0);}

LISPみたいだろ…うそみたいだろ…Cなんだぜ…それ。

次回へ続く。