菜单

Sway 编译器

相关源文件

Sway 编译器是 Fuel 工具链的核心组件,负责将 Sway 源代码转换为 Fuel 虚拟机可执行的字节码。本文档概述了编译器的架构、编译管道和关键组件。有关调用编译器的 Forc CLI 工具的信息,请参阅Forc 工具

编译器架构概述

Sway 编译器遵循传统的、多阶段的编译管道,并包含一些针对区块链开发领域的特定语言增强功能。

编译器围绕几个核心“引擎”构建,这些引擎在编译过程中维护全局状态

  1. 类型引擎:管理类型信息,执行类型推断和统一
  2. 声明引擎:处理声明(函数、结构体、枚举、特质)和引用
  3. 查询引擎:缓存模块信息并充当编译缓存

来源:sway-core/src/lib.rs1-78, sway-core/src/engine_threading.rs

编译管道

让我们更详细地探讨编译过程的每个阶段

解析阶段

解析阶段将源代码转换为结构化表示

  1. 词法分析:将源代码转换为标记
  2. 语法分析:从标记构建语法树
  3. 模块解析:解析模块依赖关系并构建模块树
  4. 树类型检测:识别程序类型(脚本、合约、谓词或库)

解析的主要入口点是 parsesway-core/src/lib.rs 中的函数。

来源:sway-core/src/lib.rs80-132

符号收集和语义分析

语义分析阶段将已解析的 AST 转换为类型化的 AST

  1. 符号收集:将声明收集到命名空间中
  2. 类型解析:解析类型注解和约束
  3. 类型检查:根据预期类型验证表达式
  4. 特质解析:验证特质实现和约束

此阶段涉及的主要组件是

  • TypeCheckContext:包含类型检查期间所需的上下文信息
  • Namespace:管理符号和作用域
  • TraitMap:跟踪各种类型的特质实现

来源:sway-core/src/semantic_analysis/ast_node/mod.rs1-321 sway-core/src/semantic_analysis/type_check_context.rs1-120 sway-core/src/semantic_analysis/namespace/trait_map.rs1-150

IR 生成

IR 生成阶段将类型化的 AST 转换为中间表示

  1. IR 上下文创建:设置 IR 环境
  2. 函数编译:将函数转换为 IR
  3. 表达式编译:将表达式编译为 IR 指令
  4. 常量求值:对编译时常量进行求值

IR 生成的核心是 FnCompiler 结构体,它负责将 Sway 代码转换为 IR。

来源:sway-core/src/ir_generation/function.rs1-90 sway-core/src/ir_generation/compile.rs1-75 sway-core/src/ir_generation/const_eval.rs1-100

优化和汇编生成

最后阶段优化 IR 并生成汇编

  1. IR 优化:应用各种优化过程
  2. 汇编生成:将 IR 转换为 Fuel VM 汇编
  3. 寄存器分配:将虚拟寄存器分配给物理寄存器
  4. 字节码生成:生成最终字节码

在此阶段,编译器还执行控制流分析以检测死代码和不可达路径。

来源:sway-core/src/control_flow_analysis/dead_code_analysis.rs1-100

核心组件深入解析

类型系统

类型系统是 Sway 编译器最关键的组件之一

关键组件

  • TypeEngine:程序中所有类型的中央管理器
  • TypeId:类型实例的唯一标识符
  • TypeInfo:表示不同类型种类的枚举
  • Unification:确定两种类型是否兼容的过程

类型系统处理泛型、特质约束和类型推断等复杂功能。

来源:sway-core/src/type_system/engine.rs1-35 sway-core/src/type_system/id.rs1-60 sway-core/src/type_system/info.rs1-78

声明引擎

声明引擎管理声明及其引用

声明引擎

  • 存储带唯一标识符的声明
  • 提供声明的引用
  • 处理泛型声明的单态化
  • 管理特质实现

来源:sway-core/src/semantic_analysis/ast_node/declaration/declaration.rs1-50 sway-core/src/language/ty/declaration/declaration.rs1-50

TypeCheckContext

The TypeCheckContext 在类型检查期间维护状态

主要职责

  • 在类型检查期间提供上下文信息
  • 维护当前命名空间和模块路径
  • 通过类型注解跟踪预期类型
  • 管理泛型类型参数的替换

来源:sway-core/src/semantic_analysis/type_check_context.rs38-145

表达式类型检查

表达式类型检查是语义分析的核心部分

类型检查过程

  1. 确定表达式的种类
  2. 对该种类执行特定类型检查
  3. 统一实际类型与预期类型
  4. 递归地对子表达式进行类型检查

来源:sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs290-617 sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs28-100

函数编译

函数编译将类型化的 Sway 代码转换为 IR

The FnCompiler

  • 递归遍历 AST
  • 将表达式编译为 IR 指令
  • 管理控制流和基本块
  • 处理作用域和变量分配

来源: sway-core/src/ir_generation/function.rs151-252 sway-core/src/ir_generation/function.rs325-400

特色功能

无效代码分析

无效代码分析可以发现永远无法执行的代码

  • 从 AST 构建控制流图
  • 识别入口点(公共函数、main、测试)
  • 从入口点执行可达性分析
  • 用警告标记不可达代码

来源: sway-core/src/control_flow_analysis/dead_code_analysis.rs27-98 sway-core/src/control_flow_analysis/dead_code_analysis.rs100-187

常量求值

常量求值

  • 在编译时解析表达式
  • 处理字面量、算术运算和部分函数调用
  • 创建不需要运行时计算的 IR 常量
  • 报告常量上下文中非常量表达式的错误

来源: sway-core/src/ir_generation/const_eval.rs62-189 sway-core/src/ir_generation/const_eval.rs218-226

系统集成

引擎线程

编译器使用“引擎线程”系统在整个编译过程中传递核心引擎

引擎被传递给各种编译器组件,以提供

  • 对全局编译状态的一致访问
  • 类型管理和统一
  • 声明存储和引用
  • 编译产物的缓存

来源: sway-core/src/lib.rs69-77 sway-core/src/engine_threading.rs

Trait 系统

Trait 系统

  • 将 Trait 映射到其特定类型的实现
  • 验证类型是否满足 Trait 约束
  • 在方法调用期间解析 Trait 方法
  • 处理 Trait 超 Trait 和默认实现

来源: sway-core/src/semantic_analysis/namespace/trait_map.rs151-250

结论

Sway 编译器是一个复杂的系统,可将 Sway 源代码转换为 Fuel VM 字节码。其多阶段流水线执行全面的分析和优化,以确保在 Fuel 区块链平台上的类型安全和高效执行。

有关 Sway 生态系统其他组件的更多详细信息,请参阅

来源: sway-core/src/lib.rs sway-core/src/semantic_analysis/ast_node/mod.rs sway-core/src/ir_generation/function.rs