-
Notifications
You must be signed in to change notification settings - Fork 0
c compiler chains
hiromi-mi edited this page Mar 2, 2023
·
1 revision
このページは暫定的な置き場です。いずれどこかに移動します
https://github.com/rui314/chibicc および 低レイヤを知りたい人のためのCコンパイラ入門 により、いわゆる小さなCコンパイラを作ることが流行した。
主要なマイルストーンとして、セルフホスト (自分自身で自分自身を何度も再帰的にコンパイルできること) があり、多くのCコンパイラがそれを達成している。 ということは「複数のCコンパイラを数珠つなぎにする形でツールチェーンにすると楽しいのではないか」との提起が@hsjoihs さんによりなされた。
これに対して@hiromi-mi がいくつか試行錯誤を行ったので、その結果を記録しておく。
ひとまず、本稿では以下のルールで行いました。
- アセンブラやリンカの未実装は問わない。gccに任せる
- プリプロセッサ周りの未実装は問わない
- プリプロセスはgccに任せる
- 多少のパッチは許容する
- chibicc -> 9cc のビルドに成功しました
- コンパイルできない場合は 1ファイルでさえも通らないことが多い
- プリプロセッサ周りに関しては、微妙に実装している機能がコンパイラによって微妙にずれている. これが通らない理由になりがち。なので実装の状況を問わないのは妥当
- chibicc
- おおむね普通のCコンパイラとして扱える
- 準拠されているために dirty hack が通らない
- ex.
typedef __builtin_va_list va_list; - このせいで sk2cc のコンパイルは不可
- ex.
- chibicc -> {9cc} コンパイル可能
- 準拠されているために dirty hack が通らない
- chibicc -> 8cc コンパイル不能
- 8ccソースコード中に
&((Token){ .sval = "1" });が含まれるがsval = "1"の形に未対応
- 8ccソースコード中に
- 構造体中のboolも不可
- おおむね普通のCコンパイラとして扱える
- 8cc
- 8cc -> 9cc、コンパイルはできるがテストは通らない (作業ログ参照)
- ソースコード中に
#include <が含まれている- 他のコンパイラで おおよそ 8cc がコンパイルできない原因
- これにより9ccでのコンパイル不可
- 8cc は未確認だが
#include <>をアドホックに処理する模様- 無視している?
- ソースコード中 (ex. parse.c:237) に
&((Token){ .sval = "1" });が含まれる- これによりchibiccでのコンパイル不可
- 構造体中にboolが含まれている
- long がある
- 9cc
- ソースコード中に
#include <が含まれている- これにより aqccでのコンパイル不可
- ソースコード中に
- aqcc
- aqcc にはcc だけでなく as や ld 相当のものもあるが、今回は
cc/ccのみを使った - long, bool 未対応
- aqcc にはcc だけでなく as や ld 相当のものもあるが、今回は
(いつか追記予定)