菜单

编译器架构

相关源文件

本页面介绍了 Sway 编译器的架构,描述了其主要组件以及它们如何协同工作,将 Sway 源代码转换为 Fuel 虚拟机字节码。有关使用 Forc 工具构建 Sway 程序的信息,请参阅Forc 工具

概述

Sway 编译器采用传统的多阶段编译流水线,逐步将源代码转换为字节码。该编译器在设计时考虑了模块化,允许在不同的编译目标之间高效重用组件,并提供强大的缓存机制以提高性能。

来源:sway-core/src/lib.rs80-132 sway-core/src/lib.rs361-409 sway-core/src/lib.rs735-938

编译管道

编译过程通过几个关键函数进行协调,这些函数将代码逐步转换。

来源:sway-core/src/lib.rs941-986 sway-core/src/semantic_analysis/program.rs32-120

解析阶段

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

  1. 词法分析:将源文本转换为词元流。
  2. 语法解析:从词元流构建解析树。
  3. AST 构建:将解析树转换为抽象语法树(Abstract Syntax Tree)。
  4. 依赖解析:构建模块依赖图。

来源:92-132 508-614

模块依赖分析

在类型检查之前,编译器会分析模块之间的依赖结构。

模块依赖分析可检测循环依赖,并确定评估模块的正确顺序,确保在处理依赖方之前先处理被依赖方。

来源:sway-core/src/semantic_analysis/module.rs41-196 sway-core/src/lib.rs719-729

符号收集

符号收集阶段构建程序中所有声明的映射。

符号收集会创建一个包含所有声明的初始命名空间,该命名空间在类型检查期间使用。

来源:sway-core/src/semantic_analysis/program.rs32-47 sway-core/src/semantic_analysis/module.rs232-265

类型检查

类型检查对 AST 执行语义分析。

类型检查

  1. 推断表达式的类型
  2. 检查类型兼容性
  3. 验证 trait 实现
  4. 确保安全属性

来源:sway-core/src/semantic_analysis/program.rs54-120 sway-core/src/semantic_analysis/module.rs306-500

IR 生成

IR 生成将类型化的 AST 转换为更易于优化的中间表示。

IR 使用基于图的结构来表示函数的控制流,这比 AST 更适合优化。

来源:test/src/ir_generation/mod.rs285-301

IR 优化

优化过程转换 IR 以提高代码效率。

常见的优化过程包括:

  • 函数内联
  • 死代码消除
  • 内存到寄存器提升
  • 控制流图简化
  • 常量折叠

来源:test/src/ir_generation/mod.rs304-327 sway-core/src/lib.rs51-56

汇编生成

汇编生成将优化后的 IR 转换为 Fuel VM 汇编代码。

汇编生成:

  1. 将 IR 指令转换为汇编指令
  2. 分配寄存器
  3. 解析分支目标
  4. 生成调试元数据

来源:sway-core/src/lib.rs31-33 test/src/ir_generation/mod.rs427-441

关键编译器组件

引擎系统

Sway 编译器使用一组“引擎”来封装编译的不同方面。

这些引擎为类型、声明以及已解析/类型化的模块提供了一个中心注册表,从而实现了高效查找和基于引用的数据共享。

来源:sway-core/src/lib.rs77 sway-core/src/query_engine/mod.rs143-159

查询引擎和缓存

查询引擎为编译产物提供复杂的缓存。

CowCache(写时复制缓存)系统提供:

  1. 对缓存数据的线程安全共享访问
  2. 可取消操作的本地修改
  3. 显式提交步骤以更新共享状态
  4. 为语言服务器协议(Language Server Protocol)等交互式工具优化性能

来源:sway-core/src/query_engine/mod.rs236-332 sway-core/src/query_engine/mod.rs60-94

缓存失效和增量编译

编译器使用多种策略来确定何时可以重用缓存的编译产物。

这种缓存失效系统实现了高效的增量编译,显著提高了 IDE 和重复构建的性能。

来源:sway-core/src/lib.rs654-699 sway-core/src/semantic_analysis/module.rs271-301

与构建系统的集成

编译器与 Fuel Orchestrator (forc) 构建系统集成,该系统提供:

BuildConfig 提供编译过程的配置,包括目标平台、优化级别以及 LSP 支持等特殊模式。

来源:sway-core/src/lib.rs941-986 sway-core/src/lib.rs34

编译器扩展

编译器支持多种扩展机制。

实验性功能

编译器接受一个 ExperimentalFeatures 标志集,该标志集启用正在开发的功能,例如:

  • 新的编码格式
  • 错误类型系统
  • 特殊语法扩展

来源:sway-core/src/semantic_analysis/module.rs397-427 sway-core/src/semantic_analysis/module.rs598-613

自动实现

对于某些 trait,编译器可以自动生成实现。

该系统允许编译器提供常见的 trait 实现,而无需用户编写样板代码。

来源:sway-core/src/semantic_analysis/module.rs574-594 sway-core/src/semantic_analysis/module.rs599-636

结论

Sway 编译器采用模块化架构,具有不同的编译阶段:

  1. 解析和 AST 构建
  2. 模块依赖分析
  3. 符号收集和命名空间构建
  4. 类型检查和语义分析
  5. IR 生成和优化
  6. 汇编生成:

这种架构实现了高效编译、强大的错误处理以及通过语言服务器协议(Language Server Protocol)与 IDE 工具的集成。缓存机制,特别是写时复制(Copy-on-Write)缓存系统,为增量编译场景提供了卓越的性能。

有关如何通过 Forc 工具使用编译器的信息,请参阅Forc 工具,有关特定编译器组件的详细信息,请参阅语义分析IR 生成汇编生成的相关维基页面。