Facebook Move 语言 IR 编译器简介

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           # 编译器工具方法.

译自:https://developers.libra.org/docs/crates/ir-to-bytecode

发布了293 篇原创文章 · 获赞 260 · 访问量 232万+

猜你喜欢

转载自blog.csdn.net/zhangxin09/article/details/93990786