tags | |
---|---|
|
先日から,低レイヤを知りたい人のための Cコンパイラ作成入門 を読み始めた.
この本について書いたコードは,https://github.com/musou1500/compilerbook-9cc に上げていこうと思う.
大学の授業内の課題で,「4人ほどのグループに別れて,Cで電卓を作れ」というものがあり,その制作に取り組んでいる.
要は,Cの標準ライブラリの実装を使わずに,実数・虚数に対応した三角関数や指数関数,対数関数等々を実装せよ,というものだ.
その評価内容の一部に,「授業資料内では例示していない,独自の機能を実装してみよ」というものがあった.
他の人と話し合った結果,「数式を入力として与えると,それを解釈・評価して答えを返す」というものを独自機能の1つとして実装することになった.
そこで,以前Twitterで見かけたことのあった本書を思い出したのがきっかけである.
最初は極めてシンプルなコンパイラを実装し,それをセルフホストできるものにまで拡張していく,というのが本書の目標らしい.はじめの実装は,「入力として与えられた1つの数値を返り値として返す」というシンプルな言語から始まる.
つまり,1
が入力として与えられた場合,以下のようなアセンブリを標準出力に出力する.
mov rax 1
ret
そこから,シェルスクリプトによる,シンプルなテストスクリプトやMakefileを追加し,インクリメンタルに開発を進めていく.
なお,この次は
- 加減算
- トークナイザ
- 構文解析
- スタックマシン
- 除算・乗算
というように説明・実装が続き,私が現段階で読み終えているのはここまでである.
本書ではgitを利用した開発を想定して書かれており,かつインクリメンタルに,個々のコミットで一つの機能を実装するようにと説明されている.
私の場合はこの段階で,以下のようなコミットログになった.
この段階で,括弧を含み,演算子の優先順位を考慮する必要のある四則演算に対応している.
コードは200行足らずで,非常に小さな実装で済んだし,一部コードに修正を加える必要はあったものの,スムーズに実装を進めることが出来た.
この先も読み進めていきたい.
少し変更を要したが,家で書いたコードを実験用のマシンで動かすことが出来ている状態である.変更というのは,実験用のマシンが 32bit CPUを使用していたため,レジスタ名の変更等を行う必要があったのだ.
他の諸々の環境から察するに,10年ほど同じマシンを使っているのかもしれない.
....なお,私はこの授業を再履修で受講していて,去年も同じ授業を受講していた.
たしか去年は ubuntu9.04 あたりを使っていたはずだ.今年は12.04になっていたが.
話を戻すと,課題として与えられている三角関数や指数関数については,既に実装が終わっている.数式からそれらの実装を呼び出せるようにするのみである.
これについては,実装された関数を動的ライブラリとしてコンパイルしておき,リンクすることができれば面白いな,と考えている.難しそうであれば,適当にインタプリタ方式に切り替えて進めることも可能だろう.
どちらにせよ,セルフホストができるようになるまでは,授業に関係なく進めたいと思っている.