菜单

编译器架构

相关源文件

本页概述了 Swift 编译器架构,介绍了其主要组件及其交互。它解释了从 Swift 源代码到机器码的编译管道,并详细介绍了实现此过程的关键子系统。有关编译过程中特定阶段的信息,请参阅编译管道

概述

Swift 编译器通过多阶段管道将 Swift 源代码转换为可执行的机器码。该编译器设计为模块化,不同编译阶段之间有清晰的分离。

来源:lib/Frontend/Frontend.cpp lib/FrontendTool/FrontendTool.cpp

主要子系统

Swift 编译器由几个关键子系统组成,它们协同工作将源代码转换为机器码。

来源:lib/Frontend/CompilerInvocation.cpp utils/build-script-impl

驱动程序

驱动程序是 Swift 编译器的主入口点。它解析命令行参数,设置编译环境,并管理编译过程。驱动程序可以作为 swift(交互模式)或 swiftc(批量编译模式)调用。

来源:utils/build-script

前端工具

前端工具(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

SIL 生成和优化

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 生成

IR 生成器将 SIL 转换为 LLVM IR(中间表示),然后 LLVM 的优化过程和代码生成器对其进行处理,以生成机器码。

模块系统

Swift 模块系统处理 Swift 模块的加载、序列化和反序列化。它允许代码被编译一次并在不同编译中使用。

来源:lib/Serialization/Serialization.cpp lib/Serialization/Deserialization.cpp lib/Serialization/ModuleFormat.h

编译过程

Swift 编译过程涉及多个阶段,每个阶段由编译器中的不同子系统处理。

  1. 解析:源代码被解析为 AST
  2. 类型检查:AST 节点被分析以确保类型正确性
  3. SIL 生成:AST 被降级到 SIL 进行优化
  4. SIL 优化:SIL 经过各种优化
  5. IR 生成:SIL 被翻译成 LLVM IR
  6. LLVM 优化:LLVM 执行与目标无关的优化
  7. 代码生成:LLVM 生成机器码

语言选项和配置

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 代码提供了一个强大而灵活的系统,在不同编译阶段之间具有清晰的关注点分离,并支持各种编译模式和目标。