ちは
Cコンパイラの自作に入門してみた感想です。
参考文献
こちらのサイトを参考に実装を進めました。
ステップ12以降は執筆途中(221207)とのことですが, ここまでの知識と提供されているソースコードを確認しながら進めれば問題なくセルフホストのCコンパイラを作成できると思います。
参考ソースコードはこちら
github.com
なぜ作ろうと思ったのか
アセンブラの知識があまりにも未熟で自作OSの入門書が読めなかったことが始まりで, 楽しく手を動かしてアセンブラに触れられるものはないかなぁと探しているときに上記のコンパイラ自作のサイトに出会いました。
表題の「低レイヤを知りたい人のためのCコンパイラ作成入門」からわかる通り, x86-64命令セットを使用しながらセルフホストのCコンパイラを作成するまでの過程が解説されていて, 自分の「手を動かしてアセンブラに触れる」という目的と合っていたので取り組んでみた感じです。
ちなみに自分のレベルは
- 学生の時に言語処理系の講義を取ってた
- 電卓に変数を導入した超簡単な自作言語のインタプリタ作成
です。
きっかけとなった自作OS本はこちら
環境
WSL2でも良かったのですが,何となく仮想マシンにUbuntuを立てて行いました。
成果
とりあえず1週間以内でセルフホスト達成を目標に取り組みましたが,
自分の能力では「あらかじめ用意されたC言語の引数なし関数を自作コンパイラの出力とgccでリンクして動作させることが出来る」までしか実装できませんでした。
(参考文献の「ステップ14: 関数の呼び出しに対応する」の途中までです)
こんな感じの構文を読むことが出来ます。
関数は事前に戻り値・引数なしの関数をC言語で作成して,そのオブジェクトファイルを出力したアセンブラとリンクしないと動作しません。
要は電卓に変数・if-else・while・スコープの概念を取り組んだだけ。
(関数電卓にこの機能があれば便利そうだと思った(小並感))
もっと時間をかけてソースコードを参考にしながら取り組んでみたかったのですが, 自作OS入門書を読むという目的から外れてしまいそうだったのでとりあえず1週間の結果で終了。
テストはこんな感じになりました。
ソースコードはこちら(コミットやブランチはテキトウ)
github.com
いっちょ前にfree()とかを使って個性を出していますが,本文を読むとわかる通り使わない方が簡単です。。。
最終的にメモリリークや冗長な処理の最適化などは面倒になって投げてます。。。
まあ,完成しない神コードより完成したクソコードの方が正義だしね(?)
反省
初めに全て読み終えてからプログラムを書き始めた方が良かったなと思いました。
冗長な部分を書き直したり,メモリ解放のコードを書いたりしましたが, 本文中に冗長な理由やメモリ解放を敢えて行っていない理由が書かれています。
取り組む前によく確認する癖は重要だと感じました。
感想
セルフホストは達成できませんでしたが,コンパイラ自作は「コンパイラというモンスター」を自作する育成ゲームをしているようでめっっちゃ面白かったのです。
特に出力されたアセンブラをテストするスクリプトを書き,そのテストが試行錯誤の果てに通った時は化け物を錬成した気分になりました(?)
次は限界まで時間をかけてセルフホストのコンパイラを育成してみたいと思います!
おわり