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次
425KB
10K SLoC
Cranefack
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(())
}
许可证
该项目受以下任一许可证的约束:
- Apache License,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
贡献
除非您明确声明,否则您提交给cranefack的任何贡献,根据Apache-2.0许可证的定义,应如上所述双重许可,不附加任何额外条款或条件。
依赖项
~8–16MB
~211K SLoC