3.8K Views
August 12, 22
スライド概要
Cコンパイラを作ったよ セキュリティ・キャンプ 2022 成果発表 L3 Cコンパイラゼミ 受講生 kanataso @kanapipopipo
開発コース L3 Cコンパイラゼミ 講師 : uint256_tさんとhsjoihsさん やること : Cコンパイラを作る
成果物 https://github.com/nananapo/9cc テストを除く行数 : 7777行 ↑少ない! セルフホスト達成済み!
セルフホストとは ① 自作コンパイラを既存のコンパイラでコンパイルする -> 第一世代コンパイラ ② 第一世代コンパイラで自作コンパイラをコンパイルする -> 第二世代コンパイラ ③ 第二世代コンパイラで自作コンパイラをコンパイルする -> 第三世代コンパイラ 第二世代と第三世代のアセンブリが一致すればOK 4人中2人がセルフホスト達成
セキュリティキャンプ以前 4/20 :「低レイヤを知りたい人のためのCコンパイラ作成入門」を 読みながら開発開始 7/14 : セルフホスト(x86_64) それ以降は少しずつ機能を追加 & リファクタリング
セキュリティキャンプ 1日目 ~ 3日目昼 別のアーキテクチャにも対応してみたかったので、 QEMUでRISC-Vで動くFedoraの上でも動くようにした。 3日目昼ごろにセルフホスト達成! キャンプ数日前までに、コード生成パスを 中間表現 -> コード生成に分けていたのが効果を発揮!
コンパイラにいろいろ食わせる sl: 先頭車両が高速回転してしまう https://youtu.be/VnGHP4mfMwY 乗客がHelpと叫ぶのも納得!
slが暴走! 原因 : array[N][M] を array[M][N]として扱ってしまっていた sizeof(char[N][M]), sizeof(char[M][N])を gccと比較するテストはあったけれど検知できない
slが暴走! 対策 : int array[N][M]; printf(“%lu”, sizeof(*array)); で検知できる プログラムは正しいので、コンパイラを作らないと変なバグを見る ことはできない
コンパイラに🍩ドーナツ🍩を食べさせる ドーナツ
コンパイラに🍩ドーナツ🍩を食べさせる hsjoihsさんが浮動小数点数を食べたドーナツ
整数ドーナツが回転! https://youtu.be/xHNtLSEE2N0
でもやっぱり浮動小数点数でドーナツを回転させたかった ・6.28, 0.07, 0.04 0.02だけパースできるように ・浮動小数点数演算は頑張って対応する
floatドーナツを動かしたらターミナルがこわれた
何かがおかしいが、floatドーナツが回転! https://youtu.be/LtsiMgHyK8E
感想 他人が書いたコードをコンパイルするのはつら楽しい ・全然コンパイルできない ・実装していない機能が分かる ・バグが分かる ・変な挙動をして面白い
他人のプログラムをコンパイルするのは難しい でもセルフホストはできる セルフホストは簡単(説)
おわり セルフホストは通過地点! Cコンパイラ開発の旅はまだ終わらない... 講師、チューターの方々、長い期間ありがとうございました。