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

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

私に教えられることなら

Smalltalk処理系開発日記 3

Smalltalk

前回

ある程度進捗したら振り返りのために書こうと思っているのですが、久々のVM制作が面白くてついのめり込んでしまい結構進みました。自動テストが簡単に書ける段階はやっぱり楽しい。

github.com

実装したもの

メッセージングに必要なオブジェクトについてですが、まずメソッドルックアップについて

  1. メソッド辞書のキーはSymbolにする。そのために、Symbolとそのidentity hashが必要
  2. シンボル名のためStringが必要
  3. Symbolを管理する方法はWeakArrayでのハッシュテーブルにする。WeakArrayとLink(ConsCell)が必要

というところでしょうか。

1のidentity hashは、昔CopyGCでどうやって実装するんだろうと呟いたところ反応があった(と思う)下記のツイートを参考にしました

あまりビットフラグを管理したくないので、今回は

  • SymbolはnameとidHashインスタンス変数を持つ
  • idHashインスタンス変数は初回アクセス時に、その時のアドレスをSmallIntに変換したもので初期化される

という実装にしました。

2のStringは単純にByteObjectです。とりあえずヌル終端含んでいますが、ヌル終端にまつわるバグを避けるか、Cとのやりとりの簡単さを重視するか悩むところです。

3は実装したこと無いため、管理自体が上手く行くかはわかりませんが、とりあえずWeakArrayのGC部は実装しました。

WeakArrayの実装は単純に、

  • CopyGCでのScan時、WeakオブジェクトならWeakスタックに積んでスロットのmoveをスキップ
  • Scan終了後、Weakスタックに積まれた各オブジェクトについて
    • SmallIntなどポインタ以外ならそのまま
    • move済みなら参照を貼り直す
    • そうでなければWeak以外の参照が無いので、nilObjectへの参照に書き換える

としました。Weakフラグは流石にtrue/falseで1スロット占領するのもな、ということでオブジェクトのサイズフィールドに1bit確保しました。

後はLinkとハッシュテーブルを書けば、メソッド辞書とシンボルテーブルは実装できそうです。

Context・Method・Bytecodeなどはあやふやなので、Little Smalltalk本やBlue Bookで仕様を再確認します。

ほな、また……。

広告を非表示にする