LLVM 编译流程
问题
LLVM 编译器的工作流程?Swift 和 ObjC 的编译有何不同?
答案
编译器前后端
Swift 编译阶段
Swift 源码
→ Parsing(解析为 AST)
→ Semantic Analysis(类型检查)
→ SIL Generation(Swift 中间语言)
→ SIL Optimization(优化)
→ LLVM IR
→ Machine Code
SIL(Swift Intermediate Language)
SIL 是 Swift 特有的中间表示,在 LLVM IR 之上。Swift 编译器在 SIL 层面做了大量优化(ARC 优化、泛型特化、方法内联等),这是 Swift 性能优于手写 ObjC 的重要原因。
静态分发 vs 动态分发
| ObjC | Swift | |
|---|---|---|
| 默认分发 | 动态(objc_msgSend) | 静态(直接调用/VTable) |
| 优化空间 | 无法内联 | 编译器可内联 |
| 方法替换 | Swizzling | 需 @objc dynamic |
常见面试问题
Q1: Swift 比 ObjC 快的原因?
答案:
- 静态分发:编译器可以确定调用的方法,直接跳转,无需运行时查找
- 方法内联:编译器将小函数直接展开到调用处
- 泛型特化:编译器为具体类型生成特化版本(无需装箱/拆箱)
- ARC 优化:SIL 层面分析引用计数,消除不必要的 retain/release