3 个版本 (破坏性更新)

0.3.0 2023 年 7 月 12 日
0.2.0 2023 年 2 月 23 日
0.1.0 2022 年 11 月 10 日

#929编程语言

MIT 许可证

1MB
19K SLoC

AirScript 编译器

此包将 AirScript 编译器的所有组件聚合到单个位置。具体来说,它重新导出从 解析器IRWinterfell 代码生成器 包中导出的功能。此外,当编译为可执行文件时,此包可以通过 CLI 使用,将 AirScript 中定义的 AIR 转译为目标语言。

基本用法

关于 AirScript 的详细描述可以在完整的 AirScript 文档 中找到。

编译器有三个阶段,可以独立或一起导入和使用。

  1. 解析器:扫描和解析 AirScript 文件,并构建 AST
  2. IR:从 AirScript AST 生成中间表示
  3. 代码生成:将 AirIR 转换为目标语言

示例用法

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