6个版本 (3个重大更新)

0.4.2 2023年3月13日
0.4.1 2022年7月7日
0.4.0 2021年10月21日
0.3.0 2021年6月15日
0.1.0 2021年5月29日

模拟器中排名第303

每月下载量21

MIT/Apache

425KB
10K SLoC

Cranefack

docs.rs badge crates.io badge Rust

Cranefack是一个由cranelift驱动的优化Brainfuck编译器套件。

命令行界面

Cranefack提供命令行工具以运行、编译和基准测试程序。

cargo install cranefack-cli

运行

使用解释器或JIT运行程序。
传递-v选项将打印一些统计信息和执行时间。

USAGE:
    cranefack run [FLAGS] [OPTIONS] <FILE>

FLAGS:
        --debug-optimizations    Print statistics for optimization passes
    -j, --jit                    Use JIT compiler
    -v, --verbose                
        --wrapping-is-ub         Wrapping overflows are undefined behavior during optimization
    -h, --help                   Prints help information
    -V, --version                Prints version information

OPTIONS:
        --jit-level <level>    Optimization level for JIT [possible values: none, speed, speed_and_size]
    -O <mode>                  Optimization mode [default: 2]  [possible values: 0, 1, 2, 3, s, wtf]

ARGS:
    <FILE>    Brainfuck source file. Use - to read from stdin

编译

编译程序。
目前,这默认会创建一个类似于汇编的表示形式,这对于调试很有用。
如果您需要将内容编译成原生二进制文件,可以使用rust输出格式以获取可以被rustc编译的丑陋Rust代码。

cranefack compile -f=rust some_app.bf > some_app.rs
rustc -O some_app.rs
./some_app
USAGE:
    cranefack compile [FLAGS] [OPTIONS] <FILE>

FLAGS:
        --debug-optimizations    Print statistics for optimization passes
    -v, --verbose                
        --wrapping-is-ub         Wrapping overflows are undefined behavior during optimization
    -h, --help                   Prints help information
    -V, --version                Prints version information

OPTIONS:
    -f, --format <format>      Format of compiled code [default: dump]  [possible values: dump, clir, rust]
        --jit-level <level>    Optimization level for JIT [possible values: none, speed, speed_and_size]
    -O <mode>                  Optimization mode [default: 2]  [possible values: 0, 1, 2, 3, s, wtf]

ARGS:
    <FILE>    Brainfuck source file. Use - to read from stdin

基准测试

以不同的优化设置运行程序,并返回一个包含每次程序运行时间的表格。

USAGE:
    cranefack benchmark [FLAGS] [OPTIONS] <FILE>

FLAGS:
    -j, --jit               Only benchmark jit
    -o, --optimized-only    Don't benchmark O0
    -h, --help              Prints help information
    -V, --version           Prints version information

OPTIONS:
    -i, --iterations <ITERATIONS>    Number of benchmarking iterations [default: 2]
    -r, --runs <RUNS>                Number of runs per optimization in each round [default: 4]

ARGS:
    <FILE>    Brainfuck source file. Use - to read from stdin

将cranefack用作库

要将cranefack用作库,请在您的Cargo.toml依赖项中添加以下内容

cranefack = "0.4"

使用JIT编译运行程序

use std::error::Error;
use cranefack::{parse, optimize_with_config, OptimizeConfig, CompiledJitModule};

fn main() -> Result<(), Box<dyn Error>> {

    // Parse program
    let mut program = parse("++[<].")?;

    // Create optimization config for level 2
    let opt_level = OptimizeConfig::o2();

    // Optimize with optimization level 2
    optimize_with_config(&mut program, &opt_level);

    // Compile program into module
    let module = CompiledJitModule::new(&program, &opt_level)?;

    // Execute compiled module reading from stdin and writing to stdout
    module.execute(std::io::stdin(), std::io::stdout());

    Ok(())
}

许可证

该项目受以下任一许可证的约束:

贡献

除非您明确声明,否则您提交给cranefack的任何贡献,根据Apache-2.0许可证的定义,应如上所述双重许可,不附加任何额外条款或条件。

依赖项

~8–16MB
~211K SLoC