Skip to content

c compiler chains

hiromi-mi edited this page Mar 2, 2023 · 1 revision

Cコンパイラ数珠つなぎの試み (仮)

このページは暫定的な置き場です。いずれどこかに移動します

概要

https://github.com/rui314/chibicc および 低レイヤを知りたい人のためのCコンパイラ入門 により、いわゆる小さなCコンパイラを作ることが流行した。

主要なマイルストーンとして、セルフホスト (自分自身で自分自身を何度も再帰的にコンパイルできること) があり、多くのCコンパイラがそれを達成している。 ということは「複数のCコンパイラを数珠つなぎにする形でツールチェーンにすると楽しいのではないか」との提起が@hsjoihs さんによりなされた。

これに対して@hiromi-mi がいくつか試行錯誤を行ったので、その結果を記録しておく。

目的

ルール(仮)

ひとまず、本稿では以下のルールで行いました。

  • アセンブラやリンカの未実装は問わない。gccに任せる
  • プリプロセッサ周りの未実装は問わない
    • プリプロセスはgccに任せる
  • 多少のパッチは許容する

結果

  • chibicc -> 9cc のビルドに成功しました

考察

全般

  • コンパイルできない場合は 1ファイルでさえも通らないことが多い
  • プリプロセッサ周りに関しては、微妙に実装している機能がコンパイラによって微妙にずれている. これが通らない理由になりがち。なので実装の状況を問わないのは妥当

さまざまなCコンパイラとその特性

  • chibicc
    • おおむね普通のCコンパイラとして扱える
      • 準拠されているために dirty hack が通らない
        • ex. typedef __builtin_va_list va_list;
        • このせいで sk2cc のコンパイルは不可
      • chibicc -> {9cc} コンパイル可能
    • chibicc -> 8cc コンパイル不能
      • 8ccソースコード中に &((Token){ .sval = "1" }); が含まれるが sval = "1" の形に未対応
    • 構造体中のboolも不可
  • 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 未対応

作業記録

(いつか追記予定)

Clone this wiki locally