4 个版本
0.0.1-sol5 | 2020 年 5 月 1 日 |
---|---|
0.0.1-sol4 | 2019 年 10 月 25 日 |
0.0.0 | 2019 年 8 月 6 日 |
0.0.0-sol15 | 2019 年 7 月 27 日 |
#3 in #libra
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 编写的模块和脚本编译为其各自的字节码表示。用于表示这些输出的两种数据类型是 CompiledModule
和 CompiledScript
。这些数据类型在 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