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

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

私に教えられることなら

Smalltalk処理系開発日記 4

github.com

前回でSymbolのidHashをアドレス由来のものにすると書きましたが、それだと文字列からSymbolを検索するのに利点が無いことに気づきました。そこで生成時に名前の文字列からハッシュを求め、それをセットして使うことにしました。インスタンス変数名もidHashではなく単にhashにします。

また、シンボルテーブルをチェイン法のハッシュテーブルにするとWeakReferenceを持たないといけないのはLinkの方になります。それだとLinkのfirstのみWeakとGC時にややこしいのと、シンボルテーブルはシンボルと何かをペアにする必要が無いので、WeakArrayにオープンハッシュ法でシンボルを置くだけにしました。

メソッド辞書の方はシンボルとメソッドオブジェクトを対応させる必要があるので、チェイン法で実装しました。別にオープンハッシュ法でアルゴリズムを共通させても良かったのですが、上記に気づく前に実装してしまったのでそのままにしています。

オープンハッシュ法ではフルになったときに配列を拡張する必要があるため、元の配列に対する全ての参照を書きかえる必要があります。ということで#become:を実装しました。ただし交換では無く一方方向です。交換の使いドコロって何なのでしょうか??謎です。

それからMethodオブジェクトとMethodContextを実装しました。この2つはGCにちょっと手を加える必要があります。Methodオブジェクトはバイトコードを最後尾部分に持つため、CopyGCのScan時にそこを飛ばします。MethodContextではコンテキストスタックを最後尾部分に持つため、popして未使用になった場所をメモリ節約のため同様に飛ばします。

最後にMethod Lookupです。これは上のメソッド辞書が実装できていれば特に難しいことはありません。

というわけで、一番最初の目標にしている「3+4のバイトコード実行」に必要なオブジェクトメモリ周りの機能はある程度揃った……と思います。次はバイトコードインタプリタです。可変長インストラクションかつバイト配列のバイトコードをCで実装するのは初めてなので楽しみです。

広告を非表示にする