3 个版本 (破坏性更新)
使用旧 Rust 2015
0.2.0 | 2024 年 7 月 5 日 |
---|---|
0.1.0 | 2024 年 3 月 11 日 |
0.0.1 | 2015 年 4 月 28 日 |
#502 在 编程语言 中
14,510 每月下载量
用于 gccjit
37KB
504 行
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,但在 mandlebrot 集合基准测试中 JIT 以 170 倍的速度将解释器甩在后面!
错误处理
目前,如果您错误地调用 API,gccjit 将将愤怒的消息打印到标准错误。可能值得将其编码到 API 中。目前,如果 API 返回 null(Rust 永远不解除引用不可见指针,如果它们为 null,gccjit 也不会解除引用),则没有惩罚,但除了标准错误上的消息外,用户没有其他指示表明出了问题。