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が動作する事を目標に、現在も開発を行っています。