rowl1言語コンパイラをコンパイルするコンパイラ作成中

ようやくブートストラッピングの次のステップであるrowl1言語開発に着手しました。rowl1言語コンパイラはrowlVM上で動作するプログラムとして作成します。

rowl1コンパイラ記述言語のアセンブリ言語アセンブラ

http://github.com/nineties
中のrowl-assemble.rlcがそれ。
S式で書かれたアセンブリ言語のプログラムをバイトコードに翻訳します。下はfibのアセンブリコードのサンプル。

(
(fun main (
    (imm_int 36)
    (call fib 4)
    exit
    ))

(fun fib (
    arg0
    imm_i3
    (if_ge ifelse)
    arg0
    imm_i1
    isub
    (call fib 4)
    arg0
    imm_i2
    isub
    (call fib 4)
    iadd
    ireturn
    (label ifelse)
    imm_i1
    ireturn
    ))
)

最初に命令列をスキャンして各関数・ラベルのアドレスを計算した後、各インストラクションの定義に従ってバイトコードに翻訳します。ここは2回スキャンする代わりにバックパッチという手法もあります。
また実行可能ファイルのヘッダも生成します。

rowl1コンパイラ記述言語のコンパイラ

rowl-compile.rlcがそれ
現状、こんな感じのコードがコンパイルできます。

(
(fun main () (
    (exit (fib 36))
    ))

(fun fib (n) (
    (if (< n 3)
        (return 1)
        (return (+ (fib (- n 1)) (fib (- n 2)))))
    ))
)

rowlVMはスタックマシンなので、抽象構文木を帰りがけでアセンブリ言語に翻訳していけば良いだけです。
この言語では変数に型が付いていません。その理由は2つあって

  1. この言語はrowl1コンパイラを記述する専用言語なので、あまり労力を割きたくない
  2. 型推論はメモリを多く必要とするので、GCのあるrowlVM上でコンパイラが書けるようになるまで我慢する

ということです。