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

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

私に教えられることなら

Smalltalk処理系開発日記6 バイトコード追加

Smalltalk

前回バイトコードがいくつか動作したので、どんどん追加していきました。

github.com

しかしバイトコードのテストがやや面倒です。

とりあえずループからバイトコード用の分岐を切り出し、一つの命令ずつ処理できるようにしました。しかし、それでも

  • テンポラリスタック
  • バイトコード(必要ならアドレス計算)
  • メソッドオブジェクト
  • メソッド用リテラルオブジェクト
  • メソッドコンテキストオブジェクト
  • その他テストに必要なオブジェクト

を各テスト毎に用意する必要があります。それらの内容や量もテスト内容によって結構変わります。

面倒なので、とりあえずバイトコードの準備を楽にしようとPharo Smalltalkバイトコードビルダを書いてみました。以下のように書いてリテラルやテンポラリ、ジャンプ先アドレスの計算を自動化しようという目論見です。

| bc |
bc := NLByteCode new.

bc
  addLiterals: { #+. #-. #factorial. #* };
  pushSelf;
  pushConstant: 0;
  send: #+ argc: 0;
  jumpForwardIfTrue: #rec;
  pushConstant: 1;
  returnTop;
  label: #rec;
  pushSelf;
  pushSelf;
  pushConstant: 1;
  send: #- argc: 1;
  send: #factorial argc: 0;
  send: #* argc: 1;
  returnTop;
  build.

しかしこれによって出力したバイトコードを手で移していたらテスト内容の管理が面倒になります。理想はあるテストセクション全体を単一のCソースファイルとして出力することですが、それらを準備する時間より手でテストを書いてしまった方が手っ取り早いと判断したのでやめることにしました。バイトコードビルダは後々バイトコードコンパイラを作るときのためにとっておきます。

別件ですが、Twitterで紹介してもらったScheme48のセルフホスティングや、型推論と型クラスを調べているうちに全然別のアイディアが浮かんできて、着手したくてたまらなくなってきました。多分そちらに手を出すと思います。自分の性格上、しばらくして絶対再開したくなるはずなので、またGCから書くはめにならないようになんとかドキュメントを整備しておきたいところです。ほな、また……。

広告を非表示にする