#jit-compiler #compiler #jit #gcc

gccjit

libgccjit的高级Rust绑定

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 2015年4月28日

#26编程语言

Download history 2928/week @ 2024-04-26 2992/week @ 2024-05-03 2971/week @ 2024-05-10 3213/week @ 2024-05-17 3559/week @ 2024-05-24 3410/week @ 2024-05-31 3871/week @ 2024-06-07 3473/week @ 2024-06-14 3589/week @ 2024-06-21 3078/week @ 2024-06-28 3598/week @ 2024-07-05 3860/week @ 2024-07-12 3610/week @ 2024-07-19 3500/week @ 2024-07-26 3999/week @ 2024-08-02 3157/week @ 2024-08-09

每月14,876次下载

GPL-3.0许可协议

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

依赖项