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

本当は怖い情報科学

情報系大学院生の趣味&実益ブログ。

[電車の中でコツコツScheme処理系を書く日記] 3駅目

とりあえず、汚いながら

void yz_vm_test(void) {
  YzVM vm;
  YzExecImage img;

  yz_vm_init(&vm);
  yz_img_init(&img);

  YZ_WRITE_PUSHI(&img, 100);
  YZ_WRITE_PUSHI(&img, 200);
  YZ_WRITE_NOP  (&img);
  YZ_WRITE_MULI (&img);
  YZ_WRITE_PUSHI(&img, 19999);
  YZ_WRITE_SUBI (&img);
  YZ_WRITE_PRINT(&img);
  YZ_WRITE_EOP  (&img);

  yz_vm_execute(&vm, &img);

  yz_vm_free(&vm);
  yz_img_free(&img);
}

みたいなプログラムを書いてVMを起動すると

        PUSHI   pc = 0, sp = 0
        PUSHI   pc = 5, sp = 1
        NOP     pc = 10, sp = 2
        MULI    pc = 11, sp = 2
        PUSHI   pc = 12, sp = 1
        SUBI    pc = 17, sp = 2
        PRINT   pc = 18, sp = 1
1       EOP     pc = 19, sp = 1

っていう結果がでるようになりました。とりあえず無事にVMがよちよち歩きを始めたようです。
ちなみに、yz_というプリフィックスは、処理系の名前をYourZoneにしたからです。言語処理系らしからぬ名前ですが、けっこう気に入っています。

次は「シンボルからオブジェクトを取得する」というのと、「関数(closure)を呼び出す」という2つの大事な操作を実装します。クロージャの内部データ構造にかなり悩んでます。というか、R5.97RSをちゃんと読まないと決心できなさそう。

あと、SourceForceでアカウントとりました。そのうちソースを公開します。

【広告】