本页面解释了 Sway 编译器如何将中间表示 (IR) 代码转换为目标平台的汇编语言指令。汇编生成是编译的最后一个主要阶段,将优化后的 IR 转换为可由 Fuel 虚拟机 (Fuel VM) 或 EVM 等其他目标平台执行的具体汇编指令。
有关 IR 如何从 Sway 抽象语法树 (AST) 生成的信息,请参阅IR 生成。
汇编生成过程将优化后的 IR 代码转换为特定于平台的汇编指令。此转换包括寄存器分配、指令选择和代码布局优化,以生成高效的机器代码。
来源
汇编生成过程始于 compile_ir_context_to_finalized_asm 函数,该函数负责将 IR 上下文转换为最终汇编代码。此过程涉及根据目标平台(Fuel VM 或 EVM)选择合适的汇编构建器,然后使用该构建器编译 IR 模块。
来源
汇编构建器负责将 IR 转换为特定于目标的汇编代码。对于 Fuel VM,FuelAsmBuilder 执行此任务。它维护各种映射和集合,以跟踪 IR 实体和汇编实体之间的关系。
来源
汇编生成过程涉及从使用虚拟寄存器的虚拟操作过渡到使用物理寄存器的已分配操作。这是通过寄存器分配完成的,这是一个关键的优化步骤。
来源
Sway IR 包含各种必须翻译成汇编代码的指令类型。这些包括算术运算、控制流操作、内存操作以及特定于虚拟机的特殊指令。
| 指令类型 | 描述 | 示例 |
|---|---|---|
| 算术逻辑单元指令 | 算术和逻辑运算 | ADD, SUB, MUL, DIV, AND, OR, XOR |
| 控制流指令 | 管理程序执行流 | JMP, BR, CBR, RET |
| 内存指令 | 访问和操作内存 | LOAD, STORE, ALOC, CFE, CFS |
| 合约指令 | 区块链合约交互 | CALL, LOG, SMO, BAL |
| 加密指令 | 加密操作 | ECK1, K256, S256 |
| FuelVM 特定指令 | Fuel VM 特有的操作 | GTF, JmpMem, StateLoad, StateStore |
来源
寄存器分配是一个关键的优化步骤,它将虚拟寄存器映射到物理寄存器,在遵守程序约束的同时最大限度地减少物理寄存器的使用数量。Sway 编译器使用活跃性分析来确定虚拟寄存器何时可以共享同一个物理寄存器。
来源
Sway 编译器实现了一种特定的函数调用约定。该约定规定了参数如何传递、返回值如何处理以及函数调用期间栈如何管理。
来源
一旦所有函数编译完成且寄存器分配完毕,汇编代码将通过多步过程进行最终确定。这包括创建抽象程序、分配寄存器、优化指令以及生成最终汇编代码。
来源
汇编生成器处理不同类型的存储,包括用于常量的数据段存储、用于局部变量的栈存储以及立即值。
来源
汇编生成过程包括验证步骤,以确保生成的汇编代码有效。这包括检查无效操作码并执行各种一致性检查。
来源
Sway 编译器的汇编生成阶段是一个复杂的过程,它将优化后的 IR 转换为目标平台的高效机器代码。这涉及寄存器分配、指令选择和各种优化,以生成高质量的汇编代码。该过程灵活,支持多种目标平台,包括 Fuel VM 和 EVM。
汇编生成是编译的最后一个主要阶段,在此之后,生成的字节码才能部署并在目标平台上执行。它确保程序高效执行,同时保持源 Sway 代码定义的语义。