#jit-compiler #jit #gcc #编译器

gccjit_sys

libgccjit 的原始绑定。gccjit crate 的配套工具。

3 个版本 (破坏性更新)

使用旧 Rust 2015

0.2.0 2024 年 7 月 5 日
0.1.0 2024 年 3 月 11 日
0.0.1 2015 年 4 月 28 日

#502编程语言

Download history 2930/week @ 2024-05-05 2842/week @ 2024-05-12 3519/week @ 2024-05-19 3287/week @ 2024-05-26 3530/week @ 2024-06-02 3991/week @ 2024-06-09 3530/week @ 2024-06-16 3413/week @ 2024-06-23 3371/week @ 2024-06-30 3336/week @ 2024-07-07 3935/week @ 2024-07-14 3542/week @ 2024-07-21 3647/week @ 2024-07-28 4036/week @ 2024-08-04 3411/week @ 2024-08-11 3006/week @ 2024-08-18

14,510 每月下载量
用于 gccjit

GPL-3.0 许可证

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 也不会解除引用),则没有惩罚,但除了标准错误上的消息外,用户没有其他指示表明出了问题。

依赖关系