Swift 编译器
主要的 Swift 仓库 包含 Swift 编译器和标准库的源代码,以及相关的组件,例如 SourceKit (用于 IDE 集成)、Swift 回归测试套件和实现级别的文档。
Swift driver 仓库 包含 Swift 编译器 “driver” 的新实现,旨在成为现有编译器 driver 的更可扩展、可维护和更强大的直接替代品。
编译器架构
总体而言,Swift 编译器主要负责将 Swift 源代码翻译成高效、可执行的机器代码。然而,Swift 编译器前端也支持许多其他工具,包括与语法着色、代码完成和其他便利功能的 IDE 集成。本文档提供了 Swift 编译器的主要组件的高级描述。
-
解析:解析器是一个简单的、递归下降的解析器(在 lib/Parse 中实现),带有一个集成的、手工编码的词法分析器。解析器负责生成不包含任何语义或类型信息的抽象语法树 (AST),并针对输入源的语法问题发出警告或错误。
-
语义分析:语义分析(在 lib/Sema 中实现)负责获取解析后的 AST,并将其转换为良好形式的、完全类型检查的 AST 形式,针对源代码中的语义问题发出警告或错误。语义分析包括类型推断,并在成功时指示可以安全地从生成的、类型检查的 AST 生成代码。
-
Clang 导入器:Clang 导入器(在 lib/ClangImporter 中实现)导入 Clang 模块,并将它们导出的 C 或 Objective-C API 映射到相应的 Swift API。语义分析可以引用生成的导入的 AST。
-
SIL 生成:Swift 中间语言 (SIL) 是一种高级的、Swift 专用的中间语言,适用于进一步分析和优化 Swift 代码。SIL 生成阶段(在 lib/SILGen 中实现)将类型检查的 AST 降低为所谓的 “raw” SIL。SIL 的设计在 docs/SIL/SIL.md 中描述。
-
SIL 保障转换:SIL 保障转换(在 lib/SILOptimizer/Mandatory 中实现)执行额外的数据流诊断,这些诊断会影响程序的正确性(例如,使用未初始化的变量)。这些转换的最终结果是 “canonical” SIL。
-
SIL 优化:SIL 优化(在 lib/SILOptimizer/Analysis、lib/SILOptimizer/ARC、lib/SILOptimizer/LoopTransforms 和 lib/SILOptimizer/Transforms 中实现)对程序执行额外的高级、Swift 专用的优化,包括(例如)自动引用计数优化、去虚拟化和泛型特化。
-
LLVM IR 生成:IR 生成(在 lib/IRGen 中实现)将 SIL 降低为 LLVM IR,此时 LLVM 可以继续优化它并生成机器代码。