✏️

コードとは?改めて振り返るコンパイルの世界

に公開

TL;DR

  • Code は「意図」を「動作」へ変換する契約書であり、
    コンパイラ はその契約を実社会(CPU 上)で執行する裁判所。
  • 字句解析 → 構文解析 → 意味解析 → IR 生成 → 最適化 → コード生成 → リンクという
    “七つの関所” を押さえると、パフォーマンス改善・デバッグ・セキュリティ強化が
    一気に解像度高くなる。
  • 2025 年現在のホットトピック
    • LLVM/MLIR の成熟 – 開発スピードは落ち着きつつ “実用段階” へ
    • WASM Component Model + WASI Preview 2 – モジュールの “LEGO 化” が進行中
    • eBPF – カーネル/ユーザー空間を縫う万能バイトコードへ進化

0. はじめに ‑ “コード” を疑う

普段当たり前に打ち込んでいる for, {}, ;
それらは人間が理解しやすい抽象記号であって、
CPU が解するのは最終的に 0/1 の “機械語” だけです。
コンパイル とは、抽象の梯子を安全かつ最適に下り切る芸
本稿では「その梯子がどう架けられ、どこが折れやすいのか」を
歴史・理論・最新動向・実践 Tips の四面から俯瞰します。

1. 歴史小話 – パンチカードから JIT まで

年代 キーワード 主なインパクト
1950s FORTRAN “機械語を書く時代” の終焉。高級言語 × 静的コンパイルの出発点。
1970s UNIX & C ポータブルな C コンパイラ = OS もユーザー空間も同じツールチェーン。
1990s JVM / .NET バイトコード + JIT。Write once, run anywhere。
2010s LLVM “IR as API”。フロントエンド/バックエンド分離で多言語化が加速。
2020s WASM / eBPF / MLIR サンドボックス、カーネル拡張、ヘテロ計算… “行き先” が爆発的に多様化。

2. コンパイル・パイプライン完全図解

  1. Lexing – トークン化
  2. Parsing – AST 構築 (Recursive‑Descent / LALR / PEG …)
  3. Semantic Analysis – 型・スコープ・依存関係解決
  4. IR Generation – SSA 形式に落とす
  5. Optimization – Inlining, Loop‑Unroll, Vectorization, PGO/LTO…
  6. Code Generation – Instruction Selection & Scheduling
  7. Linking – シンボル解決・再配置・バイナリ化
# C → LLVM IR をのぞく
clang -O2 -S -emit-llvm hello.c    # => hello.ll

IR を読む習慣は “ブラックボックス化” の解毒剤
バグも性能も 根因は IR に現れます。

3. Intermediate Representation の舞台裏

  • LLVM IR – SSA + “半抽象” 命令集合
  • MLIR – 複数の階層 (dialect) を束ねる “IR のための IR”。
    2024 年時点でコミット数は前年比 ~40 % 減。「鈍化=成熟」の声も
  • WebAssembly – 安全・コンパクト・バイトコード。
  • eBPF – Linux カーネル JIT に最適化された RISC‑like IR。

Why IR matters?

  • フロントエンド/バックエンドの 分業 を可能にする。
  • 複数言語・複数アーキを 一つの最適化パイプライン で共有。
  • セキュリティ検証・形式的検証の アンカー にも使える。

4. 最適化パス – “速さ” と “正しさ” の綱渡り

  • クラシック – DCE, Mem2Reg, Peephole, LICM
  • プロファイル駆動 – PGO/PGO‑CS, BOLT
  • LTO/ThinLTO – “リンク時” に全体最適化
  • ML Assisted – LLVM‑MLGO が inlining/loop unroll を強化
  • Debug‑ability-Og, -fsanitize=*, -femit‑compile‑unit‑info

Tip : “-O3 = 速い” は誤解。デバッグ・ビルド時間・二進サイズと
トレードオフ。CI では -O2 + -g に ASan/UBSan が鉄板。

5. リンカとビルドシステム – 最後の砦

  • gold / lld / mold – 並列化でリンク 10× 以上高速化。
  • 再配置禁止 (-fPIC 無効化) はパフォーマンス◎だが
    セキュリティ (ASLR) ○×要考慮。
  • Reproducible Builds – build‑id, DWARF 刻印, hermetic toolchain。

6. 現代コンパイル最前線 (2024–2025)

6.1 LLVM & MLIR

  • LLVM 20 系: C23 機能・RISC‑V Vector CC・SPIR‑V backend 強化。
  • MLIR: IREE/TF‑XLA/ CIRCT など “下流” が主戦場へ移行。
    コミュニティ議論 “MLIR は完成か停滞か?”

6.2 WebAssembly + WASI Component Model

  • WASI Preview 2 (0.2)wasi-http, wasi-sockets 追加。
  • Component Model多言語 × 動的リンク を公式サポート。
    “WASM 版 dlopen” 時代到来。

6.3 eBPF

  • BPF tokens, arenas, exceptions など新 opcode 群で
    “安全な unprivileged eBPF” が実用段階。
  • Tracing, Networking, Security LSM… ユースケースがカーネル外へ拡大

6.4 AI × コンパイラ

  • Neural‑Guided Inlining / Loop Unroll – LLVM‑MLGO, Facebook Prophet
  • 学習型 Autotuner – TVM Meta‑Schedule, IREE, OpenAI Triton

6.5 Supply‑Chain Security

  • 署名付きツールチェーン、SBOM、二段コンパイル (Diverse−Double‑Compiling)。
  • LLVM Dev‑Mtg 2024 “Supply Chain Security” セッション参照。

7. ハンズオン – IR を読む3ステップ

  1. clang -S -emit-llvm -Xclang -disable-O0-optnone sample.c
  2. opt -dot-cfg sample.ll → CFG を Graphviz で可視化。
  3. llc -filetype=asm sample.ll で命令選択結果を観察。

何が最適化され、何が残ったか” を自眼で確認すると
パフォーマンスチューニングの勘所 が劇的に磨かれます。

8. 今後の展望

  • マルチランタイム IR – Wasm × eBPF × SVSM (?) のクロスコンパイル。
  • 量子 IR – QIR、OpenQASM など “非ノイマン” 向け IR にも体系化の波。
  • Verifying Compiler – CompCert / Lean‑verified LLVM Pass で “証明付き最適化”。

9. まとめ

  • “コードを書く” だけでは 30 %、残り 70 % は
    コンパイラと友達になる ことで引き出せる。
  • IR を覗く・最適化フラグを試す・リンカを疑う
    三位一体 の習慣でデバッグ速度もビルド速度も段違い。
  • 2025 年は LLVM/MLIR の成熟 × WASM の台頭 × eBPF の拡張 が交わり
    “コンパイル” の射程がアプリ/OS/クラウド/IoT を横断する
    メタレイヤ へと進化する年になるでしょう。

Further Reading

  • Engineering a Compiler – Cooper & Torczon
  • Linkers and Loaders – Levine
  • LLVM 公式ブログ & YouTube Dev‑Mtg Videos
  • Bytecode Alliance, Wasmtime Docs
  • BPF Performance Tools – Brendan Gregg

Discussion