LLVM / Clang 编译器架构
一、核心思想:LLVM 解决了什么问题?
传统编译器痛点:
一门编程语言如果需要跨平台(Windows / macOS / Linux / ARM / x86),需要为每一套平台单独编写对应的编译工具,前端、优化、后端全部耦合,开发成本极高、复用性极差。
LLVM 解决方案(模块化架构) :
新增一门语言,只需要写一套前端,把源码统一编译成 LLVM IR(跨平台中间代码) 。
IR 是平台无关的,无需适配不同系统、不同 CPU,直接复用 LLVM 现成的多平台后端,即可编译出各平台可执行文件。
核心口诀:一次 IR,到处编译
二、LLVM 与 Clang 的准确关系
- LLVM:是一套通用编译器基础设施 + 架构规范,包含 前端规范、IR 中间层、优化器、多平台后端,是底层框架,不是可执行命令。
- Clang:是严格遵循 LLVM 规范实现的 C/C++/Objective-C 编译器前端命令行工具,是 LLVM 生态的具体落地产物(Xcode 默认编译器)。
三、LLVM 三段式编译架构(重点)
1. 编译器前端(语言相关、平台无关)
职责:识别、解析、校验源代码。
流程:词法分析 → 语法分析(AST)→ 语义检查 → 生成 LLVM IR
特点:只关心编程语言语法,完全不关心运行的 CPU、操作系统。
2. 中间层 LLVM IR(跨平台核心)
IR 是一种平台无关、CPU无关、可优化、可读的中间指令集。
所有语言(C/C++/ObjC/Swift/Rust)都可以统一编译为 IR,再由 LLVM 统一做全局代码优化。
3. 编译器后端(平台相关、硬件相关)
职责:将优化后的 LLVM IR,翻译成对应架构的机器码。
支持 ARM64、x86_64、RISC-V 等主流 CPU,自动适配 macOS、iOS、Linux、Windows 多平台。
四、完整编译链路(ObjC 开发视角)
源代码(.m) → Clang前端 → LLVM IR → LLVM中端优化 → LLVM后端 → 机器码(.o) → 链接成可执行文件
五、新旧架构对比
- 传统编译器:语言、优化、平台深度耦合,一门语言适配多平台需要多套编译逻辑。
- LLVM 编译器:模块化解耦,语言前端和硬件后端完全分离,极高复用、易扩展、易优化。
六、极简总结(可直接背诵)
-
LLVM 是编译器架构框架与规范,提供 IR、优化器、多平台后端;
-
Clang 是基于 LLVM 规范实现的 C/ObjC 前端编译工具;
-
前端负责源码转IR,只懂语言、不懂硬件;
-
后端负责IR转机器码,只懂硬件、不懂源码;
-
依靠 IR 中间层,实现了 一套前端、全平台运行 的跨平台编译能力。