4 个版本

0.0.1-sol52020 年 5 月 1 日
0.0.1-sol42019 年 10 月 25 日
0.0.0 2019 年 8 月 6 日
0.0.0-sol152019 年 7 月 27 日

#3 in #libra


6 个包中使用 (3 直接)

Apache-2.0

1MB
24K SLoC


id: ir-to-bytecode title: Move IR 编译器 custom_edit_url: https://github.com/libra/libra/edit/master/language/compiler/README.md

Move IR 编译器

概述

Move IR 编译器将 Move IR 编译为其字节码表示。

概述

Move IR 编译器将用 Move 编写的模块和脚本编译为其各自的字节码表示。用于表示这些输出的两种数据类型是 CompiledModuleCompiledScript。这些数据类型在 file_format.rs 中定义。

除了将 Move IR 转换为 Move 字节码之外,编译器的目的是作为字节码验证器的测试工具。因此,其任务是输出尽可能接近输入 IR 的字节码程序;在编译过程中不执行优化和高级语义检查。实际上,编译器甚至将这些语义检查推入字节码,并将 Move IR 中的语义无效代码编译为等效的——语义无效的——字节码程序。然后,编译的字节码的语义由 字节码验证器 验证。编译器命令行自动在编译结束时调用字节码验证器。

命令行选项

USAGE:
    compiler [FLAGS] [OPTIONS] <source_path>

FLAGS:
    -h, --help                 Prints help information
    -l, --list_dependencies    Instead of compiling the source, emit a dependency list of the compiled source
    -m, --module               Treat input file as a module (default is to treat file as a program)
        --no-stdlib            Do not automatically compile stdlib dependencies
        --no-verify            Do not automatically run the bytecode verifier
    -V, --version              Prints version information

OPTIONS:
    -a, --address <address>       Account address used for publishing
        --deps <deps_path>        Path to the list of modules that we want to link with
    -o, --output <output_path>    Serialize and write the compiled output to this file

ARGS:
    <source_path>    Path to the Move IR source to compile

示例用法

cargo build --bin compiler

  • 这将构建编译器和验证器二进制文件。
  • 二进制文件可在 libra/target/debug/compiler 中找到。
  • 或者,可以直接使用 cargo run -p compiler 运行二进制文件。

编译和验证包含Move IR模块的foo.mvir

编译器-m foo.mvir

编译和验证包含交易脚本的bar.mvir

编译器 bar.mvir

文件夹结构

compiler                        # Main compiler crate. This depends on stdlib.
├── ir_to_bytecode              # Core backend compiler logic, independent of stdlib.
│   ├── src
│   │   ├── compiler.rs         # Main compiler logic - converts an AST generated by `syntax.rs` to a `CompiledModule` or `CompiledScript`.
│   │   └── parser.rs           # Wrapper around Move IR syntax crate.
│   └── syntax                  # Crate containing Move IR syntax.
│       └── src
│           ├── ast.rs          # Contains all the data structures used to build the AST representing the parsed Move IR input.
│           ├── syntax.lalrpop  # Description of the Move IR language, used by lalrpop to generate a parser.
            └── syntax.rs       # Parser generated by lalrpop using the description in `syntax.lalrpop` - a clean checkout won't contain this file.
└── src
    ├── main.rs                 # Compiler driver - parses command line options and calls the parser, compiler, and bytecode verifier.
    └── util.rs                 # Misc compiler utilities.

依赖关系

~20–32MB
~462K SLoC