言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Squeak のプロジェクト保存の構造についてのメモ

某氏のバグ報告のおかげで、旧プロジェクトのデータ構造について少し触れる機会が出来たので、印象を書きます。間違ってるかも知れないけど、大体は Tweak も同じです。

プロジェクトの保存とは、メモリ上の一部を切り出してハードディスクに保存する事です。この為には、メモリがどうなっているのかぼんやりと掴んでおく必要があります。大体メモリは餌が沢山かかった蜘蛛の巣のように、餌(オブジェクト)どうしを糸(参照)でつないだ形をしています。

蜘蛛の巣の一部を切り取ると、切り取った口が出来ます。注意するべきことは、再び保存したプロジェクトを読み込む時に、切り取った口が元の位置にぴったりくっつくようにする事です。しかしぴったりくっつく事はめったに無くて、普通はスクイークのバージョンが違ってたりして、よく似た口にくっつける事になります。

口以外の部分については、特に深く考える事はありません。理屈通りに動くと、口さえうまく嵌れば中の構造はちゃんと復元されるはずです。この中の構造をImageSegment と言って、比較的安定しているため Tweak でも同じ部品が使われています。

問題は口の部分です。クラス、文字列、数字など、スクイークの根本に関わるオブジェクトの参照を綺麗に保存/復元しなくてはなりません。単純なオブジェクトについては、DataStream>>writeInteger のように保存クラス自体でシリアライズが行われ、複雑なクラスでは、storeDataOn: が使われます。このような機構は便利ですが、初期化なしでオブジェクトが生成されてしまう危険があります。

で、某バグは初期化を通らない生成が原因というわけでした。