捗らず

どうも論文書きが重荷になって、こまごまとしたほかのことも思ったように進まない。勿論論文書きも進まない。

 といいつつ逃避的に、Michael Ruegerの要望もあってSqueak 3.8 gammaとSqueakland 3.8の全ソースコードを全文比較する、という作業をしている。大昔作ってSqueakMapに載せておいたImageBrowserというパッケージを元にやっているわけである。

ImageBrowserというのは、名前から想像される画像などのイメージを見るためのものではなく、「他のSqueakイメージを開いて、その中にあるコードを読む」ためのツールである。InterpreterSimulatorを使い、specialObjectArrayに入っているSmalltalk (SystemDictionary)オブジェクトの位置を同定し、その中に入っているクラスたち、そのクラスたちが持っているCompiledMethod、CompiledMethodが持っているソースポインターというものを順にたどって、最終的にメソッドのテキスト表現を.changesファイル(と.sources)から取り出せるようにする。これによって、メソッド同士のdiffを表示したりできるようになるのでなかなか便利である。

3.6ベースに作られたImageBrowserを3.8ベースで動くようにして実行する。動くのだが、遅い。別にしょっちゅう動かすものではないので動けば良いのだが、そこが逃避行動たるゆえんで、ついつい速くすることに燃えてしまう。

 MessageTallyを使ってプロファイルした結果、ボトルネックは、InterpreterSimulator>>stringOf:であることが判った。仮想的なホストコンピュータのメモリはBitmapとして表現されているのだが、そのBitmapから指定したアドレスにあるバイト列を取り出し、シミュレーションしている側のStringオブジェクトに変換する。が、元の実装では#digitAt:など、遅いロジックを使いまくっている。もともとはデバッグ用であり、どんな文字列であるのかユーザが見たいときに表示できれば良い、というメソッドなので速さは求められていなかったわけだが。

BitmapからByteArrayまたはStringの変換は、僕のお気に入りの処理の一つである。BitBltのhackBitsという機能を使い、combinationRuleを駆使して「がつんと」マクロ処理として実行するのがSqueakの醍醐味である。というわけで、stringOf:がBitBltを使うように変えて、無駄なバッファアロケーションなどを取り除いた結果、stringOf:は4倍くらい速くなった。ImageBrowserが他のイメージを読むときの処理の中で、stringOf:は75%くらいの時間を使っていたので、全体としてはだいたい倍くらい速くなった見当だろうか。

 というのはまあどうでも良いわけである。こうやって当たり前のことをずらずら書くことこそ、本当に時間の無駄だよなあ。