4个版本 (稳定)
使用旧Rust 2015
2.1.0 | 2024年7月5日 |
---|---|
2.0.0 | 2024年3月11日 |
1.0.0 | 2015年8月15日 |
0.0.2 | 2015年4月28日 |
0.0.1 |
|
#26 在 编程语言
每月14,876次下载
160KB
3.5K SLoC
gccjit.rs - Rust对libgccjit的绑定
该仓库包含了一些高级绑定到libgccjit的基础。原始绑定本身在gccjit_sys中,位于该仓库内。
构建和运行
该项目要求您在机器上已经安装了libgccjit.so。您可能可以从您发行版的包管理器中获取它。我在Ubuntu上,看起来我无法使用apt-get获取它,所以我从源代码构建了它。YMMV。
一旦您获得了libgccjit.so,简单的
cargo build
就足够了。目前没有太多的单元测试,但可以使用cargo test
运行。
目前有四个示例位于examples/
目录中
square_function
- 一个平方函数,作为代码生成的简单示例,factorial
- 一个阶乘函数,作为涉及递归和条件跳转的更复杂示例。gcc在O3下移除所有递归。hello_world
- 一个示例,它从JIT编译的代码中调用用Rust编写的函数。brainfuck
- brainfuck的前端编译器。考虑到使用libgccjit设置起来非常容易,速度非常令人印象深刻。
一些基准测试,我的编译器与我在Haskell中编写的朴素解释器进行比较
sierpinski_triangle, haskell:
real 0m0.052s
user 0m0.026s
sys 0m0.004s
sierpinski_triangle, libgccjit AOT:
real 0m0.001s
user 0m0.000s
sys 0m0.001s
sierpinski_triangle, libgccjit JIT:
real 0m0.140s
user 0m0.106s
sys 0m0.028s
mandlebrot_set, haskell:
real 16m0.317s
user 15m53.721s
sys 0m6.291s
mandlebrot_set, libgccjit AOT:
real 0m1.392s
user 0m1.374s
sys 0m0.004s
mandlebrot_set, libgccjit JIT
real 0m5.498s
user 0m5.446s
sys 0m0.041s
在sierpinski三角形基准测试中,解释器击败了JIT,但在mandelebrot集合基准测试中,JIT以170倍的速度击败了解释器
错误处理
目前,如果您错误地调用API,gccjit将向标准错误打印愤怒的消息。这可能会值得将其编码到API中。目前API返回null没有惩罚(Rust永远不会解引用不可见指针,gccjit如果它们是null也不会解引用),但没有指示用户其他任何事情,除了标准错误上的消息表明出了问题。