✏️
コードとは?改めて振り返るコンパイルの世界
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. コンパイル・パイプライン完全図解
- Lexing – トークン化
- Parsing – AST 構築 (Recursive‑Descent / LALR / PEG …)
- Semantic Analysis – 型・スコープ・依存関係解決
- IR Generation – SSA 形式に落とす
- Optimization – Inlining, Loop‑Unroll, Vectorization, PGO/LTO…
- Code Generation – Instruction Selection & Scheduling
- 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ステップ
clang -S -emit-llvm -Xclang -disable-O0-optnone sample.c
-
opt -dot-cfg sample.ll
→ CFG を Graphviz で可視化。 -
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