8次重大版本发布
0.9.0 | 2022年8月21日 |
---|---|
0.7.0 | 2022年8月21日 |
0.1.1 | 2022年6月15日 |
#454 in 编程语言
每月32次下载
40KB
902 行
gnu-libjit
警告:此包装器仅包含我为自己的项目所需的libjit的所有功能。您可能会发现它缺少某些功能。添加它们应该不会太难(
该crate是一个安全且性能良好的libjit即时编译器的包装器。它具有自己的IR、优化过程和易于互操作。
可以即时编译一个小程序并在 < 5 毫秒内执行它,与LLVM的 ~ 80 毫秒相比。我强烈推荐inkwell库作为安全、功能丰富且文档齐全的LLVM Rust包装器。请注意,您不太可能使用任何LLVM包装器在个位数毫秒内执行即时编译的程序,但您确实可以获得比此库更强大的优化、更安全和更稳定的性能。
示例
use gnu_libjit::{Abi, Context};
fn main() {
let mut context = Context::new();
context.build_start();
let int_type = Context::int_type();
let params = vec![int_type, int_type, int_type];
let mut func = context.function(Abi::Cdecl, int_type, params).unwrap();
let x = func.arg(0).unwrap();
let y = func.arg(1).unwrap();
let z = func.arg(2).unwrap();
let temp1 = func.insn_mult(&x, &y);
let temp2 = func.insn_add(&temp1, &z);
func.insn_return(temp2);
func.compile();
context.build_end();
let result: extern "C" fn(i32,i32,i32) -> i32 = func.to_closure();
println!("3*5+2 = {}", result(3,5,2))
}
有关更多信息,请参阅./examples
和./src/test.rs
。没有文档。函数的命名几乎与libjit库中的函数完全相同。您可以使用其文档在此处。
功能
- 支持最常见的类型
f32
、f64
、i64
、i32
、i8
、u8
*mut c_void
- 易于调用原生Rust函数
- 支持将标签插入到IR中
if
if_not
分支加上eq
操作符来调用它们
许可证
请参阅LICENSE
依赖项
~2.5MB
~72K SLoC