Move IR 编译器
概述
Move IR 编译器将 Move IR 编译为字节码。
Move IR 编译器将在 Move 中编写的模块和脚本编译为各自的字节码。输出的两种数据类型分别是 CompiledModule 和 CompiledScript。这些数据类型在 file_format.rs 中定义。
除了将 Move IR 转换为 Move 字节码之外,编译器还是字节码验证器的测试工具。因此,它的工作应该是输出与输入 IR 相对应的字节码程序;在编译的过程中,不会执行优化和高级语义检查。实际上,编译器尽可能地将这些语义检查推送到字节码中,并将 Move IR 中的语义无效代码编译为等效的 - 语义无效的 - 字节码程序。然后由字节码验证器验证编译的字节码的语义。编译器命令行会在编译结束时自动调用字节码验证器。
命令行选项
用法
compiler [FLAGS] [OPTIONS]
标记:
-h, --help 打印帮助信息
--no-stdlib 不自动编译 stdlib 依赖项
--no-verify 不自动运行字节码验证程序
-s, --script 将输入文件视为脚本(默认是将文件视为模块)
-V, --version 打印版本信息
选项:
-o, --output 将已编译的输出序列化并写入此文件
参数:
Move IR 源的编译路径
示例用法
要编译 * .mvir 文件:
cargo build --bin compiler
- 这将构建编译器 + 验证器二进制文件。
- 二进制文件可以在 libra / target / debug / compiler 中找到。
- 或者,二进制文件可以直接使用 cargo run -p 编译器运行。
要编译和验证* .mvir模块文件:
compiler a.mvir
要编译和验证* .mvir交易脚本文件:
compiler -s *.mvir
文件夹结构
*
|- parser/
|- ast.rs # 包含所有用于构建 Move IR 输出 AST 的数据结构。
|- syntax.lalrpop # Move IR 语言的描述,lalrpop 会用这个生成解析器
|- syntax.rs # lalrpop 生成的解析器,根据 `syntax.lalrpop` 的描述,干净的输出不包含该文件。
|- compiler.rs # 编译器主逻辑——转换 `syntax.rs` 生成的 AST 到 `CompiledModule` 或 `CompiledScript`。
|- main.rs # 编译器驱动,解析命令行输入选项,调用解析器、编译器和字节码验证器
|- util.rs # 编译器工具方法.