読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

Smalltalk処理系開発日記 2

Smalltalk

前回の最後に書いた通り、CopyGCを実装しました。

github.com

いつも通りCheneyのアルゴリズムです。

参考 - GC/standard/Copying - GCアルゴリズム詳細解説 - MiniLispのガベージコレクションを解説する - Qiita

流石に何回も書いてたら慣れてきたので、記憶に頼って一気に書きました。眠れない夜に寝不足の頭で書いたので流石にバグがいくつもありましたが

しっかり自動テストとデバッグプリントを出力したおかげで案外簡単に動きました。

f:id:phaendal:20160904200942p:plain

まあGCがこんなに楽に書けるとは思えないので、いずれ面倒なバグに遭遇すると思います。

現状はスロットのnil埋めなどTODOだらけです。nilオブジェクトなど必要なオブジェクトがそもそも存在しないからです。次はどこにどのタイミングでそれらのオブジェクトを作るかを考える必要があります。

64bitCPUにターゲットを固定しているので下位2bitが空いています。SmallIntとObjectポインタの他にあと2種類表せるので、nil・true・falseなどは即値でも良さそうです。しかしそれらの利用場面はアドレス比較でも別に良いはずなので、実装のシンプルさを優先したいと思います。オブジェクトとして存在させるとGCの度にアドレスの付け替えが必要になりますが、即値にするとマクロと分岐が増えます。メソッドルックアップやclassメッセージの処理などで分岐が増えるとコードが煩雑になりそうなので、今回は全て同じ構造のオブジェクトとして扱うことにします。nilのクラスをつけかえてめちゃくちゃにしたりなど遊ぶこともできます。

そうなるとメモリ内にまず必要なオブジェクトを読み込む必要があるので、次は最低限メッセージングに必要なオブジェクトの準備に取り掛かります。イメージローダを先に書いてしまったほうが楽かどうかは悩むところです。その後、バイトコードインタープリタ内のメッセージング処理、他のバイトコード処理、プロセス、と進んで行く予定です。

広告を非表示にする