Lisp処理系の実装

昨年行っていたLisp処理系の実装を踏まえて、大学院に進学し、2年目となった今年も挑戦しています。

去年は

  • 型は数値のみ
  • GC無し
  • if文と関数定義を実装し、フィボナッチ関数の実行速度向上のみに取り組む

という内容で、最終的にLLVMによるJITを行っていたため、今年はLispの仕様に忠実にいこうと考えました。

開発はshidasan/lisp_2012 · GitHubで行っており、C言語を用いています。


Lispのプログラムはバイトコードにコンパイルし、vmで実行するようにしているのですが、
文法の拡張を容易に行えるように工夫しました。

Lispのif文

(if (< n 0) (- n) n)

は、僕の処理系では以下のように実装されています。

static cons_t *_if(cons_t **stack, array_t *insts) {
    cons_t *cond = vm_exec((opline_t*)array_get(insts, 0), stack);
    if (!IS_nil(cond)) {
        return vm_exec((opline_t*)array_get(insts, 1), stack);
    } else {
        return vm_exec((opline_t*)array_get(insts, 2), stack);
    }
}

去年は全ての処理をvmで行おうとしていたのですが、今年はCによるランタイムの実装を行っており、例えばif文の実装は上記の関数と、引数の数などの情報を追加するだけで行えるようにしています。

3週間程実装を行い、eval、ラムダ式、マクロ、クロージャーのような機能が動作しています。
aobenchが動作する事を目標に、現在も開発を行っています。