跳到主要内容

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 动态分发

ObjCSwift
默认分发动态(objc_msgSend)静态(直接调用/VTable)
优化空间无法内联编译器可内联
方法替换Swizzling需 @objc dynamic

常见面试问题

Q1: Swift 比 ObjC 快的原因?

答案

  1. 静态分发:编译器可以确定调用的方法,直接跳转,无需运行时查找
  2. 方法内联:编译器将小函数直接展开到调用处
  3. 泛型特化:编译器为具体类型生成特化版本(无需装箱/拆箱)
  4. ARC 优化:SIL 层面分析引用计数,消除不必要的 retain/release

相关链接