菜单

类型系统

相关源文件

Swift 的类型系统结合了静态类型和强大的类型推断能力,从而提供了安全性和表达性。本文档描述了 Swift 编译器类型系统的架构和组件,重点介绍了基于约束的类型检查机制、协议一致性验证以及专门的类型处理功能。

有关相关子系统的更多信息,请参阅 抽象语法树(AST)中间表示

类型系统架构概述

Swift 类型系统围绕基于约束的类型检查和推断方法构建。这种架构允许 Swift 提供类型推断、泛型、具有相关类型的协议以及重载解析等功能,同时保持类型安全。

来源

基于约束的类型检查

Swift 使用基于约束的系统进行类型检查,该系统生成、简化和求解约束以确定类型。此系统对于类型推断尤其重要,它允许开发者在可以推断类型时省略显式类型注解。

来源

约束生成

约束是根据语法结构和期望类型从表达式生成的。约束生成器会遍历表达式的 AST 并创建相应的约束。

生成的约束示例包括:

  • 等式约束:Type T1 = Type T2
  • 子类型约束:Type T1 <: Type T2
  • 转换约束:Type T1 -> Type T2
  • 成员约束:Type T 具有成员 M
  • 析取约束:Constraint C1 或 Constraint C2

来源

约束简化

简化过程将复杂约束转换为更简单的约束,并在可能的情况下直接尝试解析约束。此步骤有助于减少求解器的搜索空间。

来源

约束求解

约束求解器使用迭代简化和回溯的组合来查找类型变量的有效绑定。求解器尝试找到一组满足所有约束的类型赋值。

来源

类型变量与绑定

类型变量在约束求解过程中代表未知的类型。约束系统在求解过程中将固定类型分配给这些变量。

来源

类型解析

类型解析是将类型的语法表示(TypeRepr)转换为语义表示(Type)的过程。这发生在不同的阶段和上下文中。

来源

结构化解析 vs 接口解析

类型解析分为两个主要阶段:

  1. 结构化解析:类型的基本结构(例如,它是类、结构体等)
  2. 接口解析:完整的类型解析,包括泛型参数

来源

协议一致性检查

Swift 通过检查类型是否实现了所有必需的方法、属性和关联类型来验证类型是否符合协议。

来源

需求匹配

协议一致性检查器将协议需求与类型的成员进行匹配,以确定是否满足所有需求。

来源

条件一致性

Swift 支持条件一致性,即类型仅在满足特定要求时才符合协议。

来源

泛型类型与类型参数

Swift 的泛型系统允许编写灵活、可重用的代码,其类型参数可以用不同的类型填充。

来源

并发类型检查

Swift 在并发编程方面包含编译时安全功能,这些功能通过专门的类型检查来强制执行。

来源

Actor 隔离

Actor 隔离确保 Actor 内的可变状态仅从 Actor 上下文内的代码访问。

来源

Sendable 检查

Sendable 协议标记了可以在并发上下文之间安全传递的类型。类型检查器会验证标记为 Sendable 的类型是否确实可以安全地并发使用。

来源

诊断与错误处理

Swift 为类型错误提供详细的错误消息,并具备提供修复建议的机制。

来源

约束修复

约束系统可以为常见的类型错误生成特定的修复建议,为程序员提供有用的建议。

来源

高级类型系统特性

Swift 的类型系统包含多个高级功能,提供了强大的表达力和安全保证。

存在类型(协议作为类型)

Swift 允许将协议用作类型,表示任何符合该协议的类型的值。

来源

关联类型

协议可以包含关联类型的要求,这些是占位符类型,由符合的类型指定。

来源

类型推断

Swift 语言的类型推断系统非常先进,在许多情况下允许编译器在无需显式注解的情况下推断出类型。

来源

可用性检查

Swift 的类型系统包含用于检查不同平台和操作系统版本之间 API 可用性的机制。

来源

实现架构

Swift 的类型系统实现分布在几个关键文件中

文件目的
ConstraintSystem.h/cpp核心的基于约束的类型检查系统
CSGen.cpp从表达式生成约束
CSSimplify.cpp简化复杂的约束
CSSolver.cpp求解约束以查找类型绑定
CSApply.cpp将解应用到表达式
CSDiagnostics.cpp生成类型错误诊断
TypeCheckProtocol.cpp验证协议遵从性
TypeCheckType.cpp解析和验证类型
TypeCheckDecl.cpp类型检查声明
TypeCheckConcurrency.cpp处理 actor 隔离和 sendable 检查

来源

关键类型系统类

Swift 类型系统实现中最重要的一些类

来源

Swift 的类型系统是编译器中最复杂的部分之一,它通过强大的类型推断、面向协议编程和泛型等特性,在类型安全与程序员人体工学之间取得了平衡。