编译期是什么
「编译期」指 Sui Move 编译器(sui move build / move build)在你把包发布上链之前完成的阶段。链上验证者执行的是字节码,不会再次运行宏展开。
一条典型的编译管线(概念)
- 解析(Parse):将源码解析为抽象语法树(AST)。
- 宏展开(Macro expansion):遇到
name!(...)调用,按宏定义把参数片段嵌入宏体,生成更大的 AST。你的自定义macro fun和标准库宏都在这一阶段处理。 - 类型检查与借用检查:在展开后的 AST 上运行,与普通
fun相同。 - 能力/验证器检查(Sui):对象模型、可发布性等。
- 代码生成:生成 Move 字节码,最终进入链上存储与执行。
因此:「编译期」≈ 在你本机(或 CI)执行 build 时;「运行时」≈ 交易执行、读写对象、扣 Gas。
与链上执行的分界
| 阶段 | 在哪里发生 | 宏是否参与 |
|---|---|---|
| 宏展开、类型检查 | 本地 / CI 编译 | 是 |
| 交易执行 | 验证者节点 | 否(只有字节码) |
理解这一点有助于排错:宏相关的错误信息往往出现在展开后的代码位置附近,但编译器会尽量把位置映射回宏调用处(与 assert! 行号行为类似,见 §11.8)。
小结
宏在编译期完成展开;链上只看到展开后的逻辑。下一节给出 macro fun 的完整定义方式与可见性规则。