2 个版本

0.1.1 2023年6月5日
0.1.0 2023年6月5日

#741编程语言

Apache-2.0

61KB
1.5K SLoC

Autophagy

GitHub Action Crate License

又一个用于Rust的AOT编译器,以实现真正的同构。

背景

现有的Rust解释器大多是在cargo build或rustc的基础上构建的。这会产生额外的开销,如启动进程和访问文件系统。根据使用场景,这种方法可能不适合在Rust程序中编译和运行Rust代码。

这个crate旨在提供Rust代码到汇编的完全内存编译及其执行。这将使需要动态代码生成的软件获得能力。

示例

use autophagy_mlir::Compiler;
use melior::{
    dialect::DialectRegistry,
    ir::{Location, Module},
    pass::{self, PassManager},
    utility::{register_all_dialects, register_all_llvm_translations},
    Context, ExecutionEngine,
};

#[autophagy::quote]
fn fibonacci(x: i32) -> i32 {
    if x <= 0i32 {
        0i32
    } else if x == 1i32 {
        1i32
    } else {
        fibonacci(x - 1i32) + fibonacci(x - 2i32)
    }
}

let registry = DialectRegistry::new();
register_all_dialects(&registry);

let context = Context::new();
context.append_dialect_registry(&registry);
context.load_all_available_dialects();
register_all_llvm_translations(&context);
context.attach_diagnostic_handler(|diagnostic| {
    eprintln!("{}", diagnostic);
    true
});

let location = Location::unknown(&context);

let mut module = Module::new(location);

Compiler::new(&context, &module).compile_fn(&fibonacci_fn()).unwrap();

assert!(module.as_operation().verify());

let pass_manager = PassManager::new(&context);
pass_manager.add_pass(pass::conversion::create_func_to_llvm());

pass_manager
    .nested_under("func.func")
    .add_pass(pass::conversion::create_arith_to_llvm());
pass_manager
    .nested_under("func.func")
    .add_pass(pass::conversion::create_index_to_llvm_pass());
pass_manager.add_pass(pass::conversion::create_scf_to_control_flow());
pass_manager.add_pass(pass::conversion::create_control_flow_to_llvm());
pass_manager.add_pass(pass::conversion::create_mem_ref_to_llvm());

pass_manager.run(&mut module).unwrap();

assert!(module.as_operation().verify());

let engine = ExecutionEngine::new(&module, 2, &[], false);

let mut argument = 5;
let mut result = -1;

assert_eq!(
    unsafe {
        engine.invoke_packed(
            "fibonacci",
            &mut [
                &mut argument as *mut _ as *mut _,
                &mut result as *mut _ as *mut _,
            ],
        )
    },
    Ok(())
);

assert_eq!(result, fibonacci(argument));

支持的功能

语法

  • 算术/布尔/位运算符
  • 解引用运算符
  • 函数调用
  • let 绑定
  • = 赋值
    • 变量
    • struct 字段
    • 解引用指针
  • while 语句
  • loop 语句
  • if 表达式
  • struct 字段访问
  • 运算符赋值(例如 +=
  • impl 块和 self 接收者

类型

  • 布尔值
  • 整数
  • 浮点数
  • 引用
  • 结构体
  • 数组
  • 原子

字面量

  • 布尔值
  • 整数
  • 浮点数
  • 结构体
  • 数组

其他

  • HM 类型推断

许可证

双重许可,受MITApache 2.0协议保护。

依赖关系

~10–22MB
~322K SLoC