3 个版本 (破坏性更新)
0.3.0 | 2023 年 7 月 12 日 |
---|---|
0.2.0 | 2023 年 2 月 23 日 |
0.1.0 | 2022 年 11 月 10 日 |
#929 在 编程语言
1MB
19K SLoC
AirScript 编译器
此包将 AirScript 编译器的所有组件聚合到单个位置。具体来说,它重新导出从 解析器、IR 和 Winterfell 代码生成器 包中导出的功能。此外,当编译为可执行文件时,此包可以通过 CLI 使用,将 AirScript 中定义的 AIR 转译为目标语言。
基本用法
关于 AirScript 的详细描述可以在完整的 AirScript 文档 中找到。
编译器有三个阶段,可以独立或一起导入和使用。
- 解析器:扫描和解析 AirScript 文件,并构建 AST
- IR:从 AirScript AST 生成中间表示
- 代码生成:将
AirIR
转换为目标语言- Winterfell 代码生成器:为目标为 Winterfell 验证器 的 Rust 代码生成。
示例用法
use air_script::{Air, parse, passes, Pass, transforms, WinterfellCodeGenerator};
use miden_diagnostics::{
term::termcolor::ColorChoice, CodeMap, DefaultEmitter, DiagnosticsHandler,
};
// Used for diagnostics reporting
let codemap = Arc::new(CodeMap::new());
let emitter = Arc::new(DefaultEmitter::new(ColorChoice::Auto));
let diagnostics = DiagnosticsHandler::new(Default::default(), codemap.clone(), emitter);
// Parse into AST
let ast = parse(&diagnostics, codemap, source.as_str()).expect("parsing failed");
// Lower to IR
let air = {
let mut pipeline = transforms::ConstantPropagation::new(&diagnostics)
.chain(transforms::Inlining::new(&diagnostics))
.chain(passes::AstToAir::new(&diagnostics));
pipeline.run(ast).expect("lowering failed")
};
// Generate Rust code targeting the Winterfell prover
let code = WinterfellCodeGenerator::new(&ir).generate().expect("codegen failed");
可以在 examples/
目录中找到在 AirScript 中定义的 AIR 的示例。
为了方便起见,可以使用 CLI 运行完整的转译管道。
命令行界面 (CLI)
有一个命令行界面可用于转译 AirScript 文件。目前,唯一可用的目标是用于与 Winterfell STARK 验证器库一起使用的 Rust 代码。
要使用 CLI,首先运行
cargo build --release
然后,运行 airc
目标并使用 transpile
。例如
./target/release/airc transpile examples/example.air
当未指定输出目标时,输出文件将使用输入文件的路径和名称,将 .air
扩展名替换为 .rs
。对于上述示例,examples/example.rs
将包含生成的输出。
您可以使用 help
选项查看其他可用选项。
./target/release/airc transpile --help
依赖关系
~12-23MB
~308K SLoC