Rで書く
Rコンパイラ
きっかけ
コンパイラ作るのってすごく難しそうなイメージだったけど
Cのソースコードを
x86-64アセンブリに変換する
.intel_syntax noprefix
.global main
main:
mov rax, 42
ret
(アセンブリから実行ファイルの変換はGCCでやる)
文字列を読んで文字列を書ければコンパイラは作れる
どの言語でどの言語のコンパイラを書いても良いはず
ならば
やってみた。
インストール
(現在Linuxにしか対応してないので他のOSの場合はDockerとか使ってください。)
packageを読み込むと
Rのコードをコンパイルできる
コンパイルしてアセンブル
実行ファイルが出力される
コンパイルしてアセンブルして実行
変数も使える
代入演算子は <-
(今のところ唯一のRっぽさ)
テキストの ステップ6: ==と!=を追加する までは大体実装
ここから先はCとRで乖離がありそう
コンパイルの流れ
単語に分割する
正規表現を使って雑に実装
文法にそって解釈する
(1 + 2) * 3
a = 40 + 2
詳細は 再帰下降構文解析 参照
アセンブリを生成
詳細は スタックマシンへのコンパイル 参照
使ったパッケージ
実装が捗るやつ
パッケージ作成が捗るやつ
楽をするためにテストを書く
感想
コンパイラ作成は大変楽しい作業です。
Rでもコンパイラを作れるし低レイヤを学べる。
コンパイラを作るのは楽しい。
なのでみなさんもコンパイラを作りましょう。