本页概述了 Swift 编译器架构,介绍了其主要组件及其交互。它解释了从 Swift 源代码到机器码的编译管道,并详细介绍了实现此过程的关键子系统。有关编译过程中特定阶段的信息,请参阅编译管道。
Swift 编译器通过多阶段管道将 Swift 源代码转换为可执行的机器码。该编译器设计为模块化,不同编译阶段之间有清晰的分离。
来源:lib/Frontend/Frontend.cpp lib/FrontendTool/FrontendTool.cpp
Swift 编译器由几个关键子系统组成,它们协同工作将源代码转换为机器码。
来源:lib/Frontend/CompilerInvocation.cpp utils/build-script-impl
驱动程序是 Swift 编译器的主入口点。它解析命令行参数,设置编译环境,并管理编译过程。驱动程序可以作为 swift(交互模式)或 swiftc(批量编译模式)调用。
前端工具(swift -frontend)是实现实际编译功能的 [核心组件]。它由驱动程序调用,并带有相应的选项,处理不同的编译模式,如解析、类型检查、SIL 生成和代码生成。
来源:lib/FrontendTool/FrontendTool.cpp192-330
CompilerInvocation 类封装了编译器单次调用的所有配置选项和设置。它处理目标三元组设置、语言选项、搜索路径和其他编译器配置。
来源:lib/Frontend/CompilerInvocation.cpp54-114 lib/Frontend/Frontend.cpp
解析器将 Swift 源代码转换为抽象语法树(AST)。它执行词法分析,将源代码分解为标记,然后应用 Swift 语法规则来构建 AST。
来源:lib/Parse/Parser.h lib/Parse/ParseDecl.cpp167-250 lib/Parse/ParseExpr.cpp lib/Parse/ParseType.cpp
类型检查器分析 AST,执行名称绑定、类型推断,并验证代码是否符合 Swift 的类型系统规则。它是 Swift 编译器中最复杂的子系统之一。
来源:include/swift/AST/DiagnosticsParse.def
Swift 中间语言 (SIL) 是一种高级的、特定于 Swift 的中间表示,用于优化和代码生成。SIL 生成器将 AST 转换为 SIL,然后 SIL 会经历多个优化过程。
来源:lib/SIL/IR/SILPrinter.cpp lib/SIL/Parser/ParseSIL.cpp lib/SIL/Verifier/SILVerifier.cpp include/swift/SIL/SILInstruction.h include/swift/SIL/SILBuilder.h
IR 生成器将 SIL 转换为 LLVM IR(中间表示),然后 LLVM 的优化过程和代码生成器对其进行处理,以生成机器码。
Swift 模块系统处理 Swift 模块的加载、序列化和反序列化。它允许代码被编译一次并在不同编译中使用。
来源:lib/Serialization/Serialization.cpp lib/Serialization/Deserialization.cpp lib/Serialization/ModuleFormat.h
Swift 编译过程涉及多个阶段,每个阶段由编译器中的不同子系统处理。
Swift 编译器的行为可以通过各种语言选项和配置进行自定义。这些选项控制着可用性检查、类型检查、优化级别和目标特定行为等功能。
来源: include/swift/Basic/LangOptions.h include/swift/Option/Options.td include/swift/Option/FrontendOptions.td
Swift 编译器的构建系统旨在构建编译器本身以及标准库。它使用 CMake 和自定义构建脚本及预设来处理复杂的构建过程。
来源: utils/build-script utils/build-script-impl utils/build-presets.ini CMakeLists.txt cmake/modules/AddSwift.cmake stdlib/cmake/modules/AddSwiftStdlib.cmake stdlib/cmake/modules/SwiftSource.cmake
Swift 编译器使用属性来注解声明,并使用诊断来向用户报告错误、警告和注意事项。
来源: include/swift/AST/Attr.h lib/AST/Attr.cpp
该架构为编译 Swift 代码提供了一个强大而灵活的系统,在不同编译阶段之间具有清晰的关注点分离,并支持各种编译模式和目标。