本页面介绍了 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 源代码转换为结构化表示。
在类型检查之前,编译器会分析模块之间的依赖结构。
模块依赖分析可检测循环依赖,并确定评估模块的正确顺序,确保在处理依赖方之前先处理被依赖方。
来源: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 执行语义分析。
类型检查
来源:sway-core/src/semantic_analysis/program.rs54-120 sway-core/src/semantic_analysis/module.rs306-500
IR 生成将类型化的 AST 转换为更易于优化的中间表示。
IR 使用基于图的结构来表示函数的控制流,这比 AST 更适合优化。
来源:test/src/ir_generation/mod.rs285-301
优化过程转换 IR 以提高代码效率。
常见的优化过程包括:
来源:test/src/ir_generation/mod.rs304-327 sway-core/src/lib.rs51-56
汇编生成将优化后的 IR 转换为 Fuel VM 汇编代码。
汇编生成:
来源: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(写时复制缓存)系统提供:
来源: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 编译器采用模块化架构,具有不同的编译阶段:
这种架构实现了高效编译、强大的错误处理以及通过语言服务器协议(Language Server Protocol)与 IDE 工具的集成。缓存机制,特别是写时复制(Copy-on-Write)缓存系统,为增量编译场景提供了卓越的性能。
有关如何通过 Forc 工具使用编译器的信息,请参阅Forc 工具,有关特定编译器组件的详细信息,请参阅语义分析、IR 生成和汇编生成的相关维基页面。