Cranelift:Rust的新一代代码生成后端

不爱学习 2024-03-29 10:07:10

Cranelift是一个Apache-2.0许可的代码生成后端,作为Wasmtime WebAssembly运行时的一部分而开发。自2023年10月起,Rust项目将Cranelift作为其nightly工具链的可选组件提供。用户现在可以在用Rust编写的项目的调试构建中使用Cranelift作为代码生成后端,这是一个值得关注的时机。Cranelift旨在通过生成速度更快的代码与现有编译器竞争,其设计侧重于仅优化最重要的部分。快速编译时间是用户从他们的编程语言中希望获得的许多要求之一。尽管Rust和LLVM项目持续稳步进展,但编译时间一直是人们对Rust(以及其他使用LLVM的语言)抱怨的来源。

Cranelift与其他JIT编译器的区别

Cranelift首次用作Wasmtime即时(JIT)编译器的后端。许多语言现在配备了JIT编译器,这些编译器通常使用专门技巧快速编译独立函数。与其他JIT编译器不同,Cranelift选择使用更通用的架构,这意味着Cranelift可用于WebAssembly之外的项目。尽管SpiderMonkey项目目前决定暂不使用Cranelift,但Cranelift项目仍具有易于整合到其他程序中的设计。

Cranelift的优化

尽管Cranelift专注于快速代码生成,但它确实通过多种方式优化所生成的代码。Cranelift的优化管线基于等价图(E-graphs),这是一种有效表示等价中间表示集合的数据结构。E-graphs比直接存储每种可能替代方案更高效,但它们仍然比传统中间表示占用更多内存。为了防止E-graph变得过大,Cranelift设置了对图执行操作数量的限制。

Cranelift用于Rust

虽然Cranelift可能旨在成为Rust的备用后端,但实际上使其可用需要大量努力。Rust编译器具有称为中级IR(mid-level IR)的内部表示,通常情况下,编译器会将其转换为LLVM IR然后发送给LLVM代码生成后端。为了使用Cranelift,编译器需要另一个库来接收中级IR并发出CLIF。这个库主要由Rust编译器团队成员“bjorn3”撰写,并且他对Rust的Cranelift后端贡献了大约4000次提交中约3000次。

总体而言,Cranelift代表了一种不同于传统编译器设计方法的有趣展示。它专注于快速代码生成,并通过E-graphs等技术进行优化,使得它在速度和效率方面具有独特之处。虽然目前还无法确定Cranelift是否能解决Rust中缓慢编译时间的问题,但初步迹象是令人鼓舞的。随着技术不断发展,我们可以期待看到更多关于Cranelift和其在Rust等项目中应用的进展和成就。

0 阅读:0

不爱学习

简介:感谢大家的关注