世界を動かす技術を、日本語で。

クロードのCコンパイラとGCCの比較

2026年2月9日原文(harshanu.space)

概要

  • Anthropic社のClaude が完全自動でCコンパイラ「CCC」を開発した事例の検証
  • GCC との比較実験をSQLiteとLinuxカーネルで実施
  • CCCはCコードの正確なパース はできるが、最適化やリンカ処理で課題
  • SQLiteの機能的正しさは確保 されるも、実行速度はGCCに大きく劣後
  • リンクエラーやパフォーマンス低下 の根本原因を技術的に解説

Claudeが自動生成したCコンパイラ「CCC」の実力検証

  • Anthropic社のClaude Opus 4.6 が100%自動生成したCコンパイラ「CCC」の性能検証
  • CCCはRust製 で、x86-64/i686/AArch64/RISC-V 64に対応
  • フロントエンド、SSAベースIR、最適化、コード生成、アセンブラ、リンカ、DWARFデバッグ情報まで 全て自作実装
  • GCCとCCC を同一ハードウェア・同一ソースで比較検証
  • SQLite(標準C)とLinuxカーネル(超巨大Cコード) をテスト対象に選定

Cコンパイルの4段階と各工程の難易度

  • プリプロセッサ :#includeや#define等の前処理、ソース展開
  • コンパイラ :C言語構文からアセンブリ生成、型チェックや最適化も担当
  • アセンブラ :アセンブリを機械語(オブジェクトファイル)に変換
  • リンカ :複数オブジェクトを一つの実行ファイルに結合、アドレス解決やメモリ配置
    • リンカ工程が最難関 :複雑な再配置やシンボル管理、PIE、スクリプト対応等

CCCとGCCの比較検証方法

  • Debian系VM(6vCPU, 16GB RAM) 上で同一条件テスト
  • GCC 14.2.0 vs CCC(gcc_m16機能で一部GCC委譲)
  • .S(アセンブリ)はGCC、.cはCCC で処理するラッパースクリプト運用
  • SQLiteベンチマーク :I/O影響排除、42種SQL操作・10フェーズでCPU性能重視
  • Linuxカーネル :v6.9(x86_64 defconfig)、ビルド完了までの挙動観察

主な検証結果と数値比較

  • カーネルビルド時間 :GCC 73.2分、CCC 42.5分(リンク失敗で未完了)
  • カーネルビルド結果 :GCCは成功、CCCはリンク失敗(約40,784件の未定義参照)
  • SQLiteコンパイル速度 :GCC(-O0)64.6秒、CCC 87.0秒(1.3倍遅い)
  • SQLiteバイナリサイズ :GCC 1.55MB、CCC 4.27MB(約3倍)
  • SQLite実行時間 :GCC(-O0)10.3秒、CCC 2時間6分(737倍遅い)
  • メモリ使用量 :CCCはGCC比で5.9倍消費
  • クラッシュ・正当性テスト :両者とも全パス

カーネルビルド失敗の詳細

  • CCCは全Cファイルを正確にコンパイル (0エラー、96警告)
  • リンカで40,784件の未定義参照 :__jump_table, __ksymtab等の再配置・シンボル生成ミス
  • リンカ実装の難しさ を象徴、C言語処理自体は問題なし

SQLiteベンチマーク詳細

  • CCCは最適化フラグ(-O2等)を無視 :常に同一バイナリ生成
  • GCCの-O2は多段最適化(レジスタ割付、ループ展開、関数インライン化等) を実施
    • CCCは最適化パスが15個あるが、全レベルで同一動作
  • 「最適化なし」での比較が公平 :CCCは1.3倍遅いのみ
  • 最適化有効時はGCCが圧倒的に高速 :CCCは全く追いつけない

実行性能とボトルネック分析

  • 単純クエリは1~7倍遅いが、複雑なJOINやサブクエリは数千~十万倍遅い
  • 主原因はレジスタスピリング :変数がレジスタに乗らずスタック多用
    • SQLiteの主要関数(sqlite3VdbeExec)はローカル変数100個超、巨大switch文
    • CCCはほぼ全変数をスタックに退避し、スタックオフセットが1万バイト超に達する例も
  • GCCは最適化なしでも効率的なスタック・レジスタ管理 を実施

今後の課題とAI自動生成コンパイラの展望

  • C言語の正確なパース・アセンブリ生成はAIでも可能
  • 最適化・リンカ・アセンブラの精度と効率性が圧倒的に不足
  • GCCは40年分の知見と最適化技術の塊、現状のAI生成コンパイラは実用には遠い
  • CCCの「動くCコンパイラを完全自動生成できた」点は画期的
  • 今後は最適化パスの強化・リンカ精度向上が課題

まとめ・総評

  • Claude Opus 4.6によるCCCは「Cコードを通す」レベルには到達
  • 実用レベル(高速・コンパクト・複雑コード対応)には大きな壁
  • AI自動生成コンパイラの「現状の限界」と「今後の可能性」 を示す好事例

Hackerたちの意見

Cの最適化されてない状態がどれだけ遅いかを見るのは本当に面白いね。Cが他の言語に比べてパフォーマンスで圧倒的に優れているのを見慣れているから、まるでそれが言語自体に内在する特性だと思っちゃう。でもベンチマークを見ると、SQLite3の最適化されてないビルドはCCCで12倍遅く、最適化されたビルドでも20倍遅いんだ。これはすごい!CCCをディスってるわけじゃなくて、GCCが本来は速いとされる言語からどれだけスピードを引き出しているかに感心してるんだ。

Cのスピードはまだまだ言語自体に内在している部分が大きいよ。プリミティブは実際のシリコンに直接関連してるからね。関数呼び出しは実際には呼び出し命令に変わるし(インライン化されることもある)。構造体のバイトの順序はメモリ上での存在の仕方だし、ポインタの逆参照はロード/ストアになる。逆もまた然り。インタプリタ言語はこのハードウェアとの関連がないから遅いんだ。レジスタのシャッフルをたくさんするクソみたいなコンパイラだと、この関連が失われる。特に、1000倍遅くなる原因となった特定の関数の定数スピリングがあると、CコードがPythonコードに近く見えるようになる(Pythonではすべての変数が数回の逆参照を必要とするからね)。

まあ、常に物事を遅くすることはできるよ。最適化しない、または低最適化のコンパイラは、これよりもはるかに速いものがたくさんある。TCCが最も有名な例かもしれないけど、GCCの-O1と-O2の間のパフォーマンスを持つ他のCコンパイラもたくさんある。私の理解では、CCCは-O0よりもパフォーマンスが悪いらしいけど、正直驚きだよ。だって-O0は達成するのが難しい目標じゃないはずだから。私の理解では、-O0ではCは基本的にマクロがアセンブリに展開されるだけで、少しの演算の順序が加わるだけなんだ。レジスタの割り当てもやってないと思う。

これはこの議論の両方の視点を示す良い例だと思う。LLMコーディングエージェント支持派:「ほら!エージェントが数時間で作った動くコンパイラだ!すごい!」反対派:「でも、これは動くコンパイラじゃないよ。それに、どれだけ少ない時間で作ったかは関係ない。動かないんだから、無意味だよ。」支持派:「確かに、でもエージェントにそれを直させられるよ。」反対派:「本当にできるの?コードベースが複雑になるほど、エージェントのパフォーマンスは悪くなるのを見てきたよ。コンパイラの複雑な問題を直すのはエージェントには難しいと思う。それに、もし直せるなら、なんで直してないの?」支持派:「今はそうかもしれないけど、次の世代が直すよ。」反対派:「そうかもね。最近の世代はどんどん良くなってるけど、まだこの種の複雑さにうまく対処できてるわけじゃない。」支持派:「でも、見て!これはすごい!数時間でコンパイラができたんだ!GCCをここまで持ってくるのに何百万時間もかかったんだよ?こんな風に比較するのはフェアじゃない!」反対派:「AnthropicはLinuxカーネルをコンパイルできる動くコンパイラを作ったと言った。GCCは通常Linuxカーネルをコンパイルするために使うものだから、比較は招かれたものだよ。結果的に(理由はどうあれ)CCCはGCCができるLinuxカーネルのコンパイルに失敗した。AIの期待が現実に合わないってことだね。」支持派:「でも、LLMを使い始めて数年、エージェントを使い始めてからも1年しか経ってないんだ。これはまだ始まりに過ぎない!」反対派:「それは本当だけど、これは面白いね。でもこの技術には他にもたくさんの疑問がある。急いで進めて全部台無しにしないようにしよう。」

こんな風に比較するのはフェアじゃない!この議論で支持派に傾いている私としては、その発言はしないかな。結果はまさに予想通りだと思う。こういう高い検証可能性を持つタスクはLLMに向いているし、次の2年以内にAIツールがGCCよりも良いコンパイラを作ると思ってるよ。

これってSpaceXの会話にすごく似てると思うな: - おお、見て![小さな関数を書く / 小さなロケットのホップをする]ことができるけど、[コンパイラを書く / 軌道に乗る]ことはできない! - おお、見て![おもちゃのコンパイラを書く / 軌道に乗る]ことができるけど、[Linuxをコンパイルする / 再利用可能になる]ことはできない! - おお、見て![Linuxをコンパイルする / 再利用可能な軌道ロケットを得る]ことができるけど、[GCCに匹敵するコンパイラを作る / ロケットを素早く回転させる]ことはできない! - このポイントを証明するためだけにこのコンパイラを作り続ける理由はないよ。でも、もし数人のコンパイラエンジニアにガイドされれば、GCCにすぐ追いつくと思う。AI支援の開発からたくさんの変革が起こるだろうね。

プロ: 確かに今はそうかもしれないけど、次の世代がそれを解決するよね。「十分に賢いLLM」のためにc2のウィキページが必要なのかな? https://wiki.c2.com/?SufficientlySmartCompiler のように。

最近の「バイブコーディング」OCamlの騒動を思い出すよ[1]。PRの著者は、自分の完全にLLM生成の貢献がどうしてそんなに疑わしく見られたのか全く理解してなかった。この記事は重要なポイントを確認してるね。合格するテストがあるのと、正しさに似た出力を生成できるのは別の話だから。ただ、その出力が良くてメンテナブルであることは全く別のことなんだ。[1] https://github.com/ocaml/ocaml/pull/14369

その通り。未来のモデルで全てが解決されるというこの欠陥のある議論には毎回イライラする。

反対派としての私の主張は、「もしAIが将来良くなるなら、未来に戻ってきてみて」ってことだね。

これがプロと反対派の会話の進め方だとは思わないな。プロは、GCCの開発者がOpus 4.6を活用できれば、もっと生産的になると言うだろうし、反対派は、それが生産性を助けるわけではなく、コードベースに対する理解が薄れると言うだろうね。CCCプロジェクトは、Opusが今自律的にできることのデモンストレーションだったと思う。99.9%のソフトウェアプロジェクトは、Linuxコンパイラのような複雑なものを作ってるわけじゃないし。

まったく正当な視点だね。ただし、正しくコンパイルされたLinuxカーネルが必要な場合は、すぐに疲れちゃうかも。

Hacker Newsで議論の続きを見る