Skip to content

Latest commit

 

History

History
91 lines (43 loc) · 4.08 KB

compiler-book-9cc.mkd

File metadata and controls

91 lines (43 loc) · 4.08 KB
tags
プログラミング

"低レイヤを知りたい人のための Cコンパイラ作成入門" を読み始めた

先日から,低レイヤを知りたい人のための 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になっていたが.

話を戻すと,課題として与えられている三角関数や指数関数については,既に実装が終わっている.数式からそれらの実装を呼び出せるようにするのみである.

これについては,実装された関数を動的ライブラリとしてコンパイルしておき,リンクすることができれば面白いな,と考えている.難しそうであれば,適当にインタプリタ方式に切り替えて進めることも可能だろう.

どちらにせよ,セルフホストができるようになるまでは,授業に関係なく進めたいと思っている.