rustc_codegen_cranelift
?
什么是 rustc_codegen_cranelift
,简称 cg_clif
,是 Rust 编译器一个新的实验性代码生成后端。现有的后端是 LLVM,它非常擅长生成快速、高度优化的代码,但在快速编译代码方面表现不佳。cg_clif
使用了 Cranelift 项目,它提供了一个快速后端,能显著缩短编译时间,代价是执行的优化很少。这非常适合 debug 构建,我们希望 cg_clif
最终能成为 debug 模式下的默认后端。
rustc_codegen_cranelift
的进展如何?
在 debug 构建中使用 使 cg_clif
成为 Rust 主仓库一部分的 重大变更提案 已经开放了一段时间。最近,该 MCP 被接受,编译器团队 将 rustc_cranelift_codegen
合并到 Rust 主 git 仓库。cg_clif
尚未随 rustup
一起分发,但这意味你现在可以在源码树内构建它了!
rustc_codegen_cranelift
?
如何使用 在本节中,我将逐步介绍如何从源代码构建新的后端,然后在你的项目中使用它。所有代码都可以复制粘贴,并且每个步骤都有解释。
首先,让我们从源代码构建 cg_clif
。
现在,我们可以开始使用它来编译项目。为了演示,我将使用 cargo
,但你可以使用任何由 cg_clif
支持的 Rust 项目。
$ cd ..
$ git clone https://github.com/rust-lang/cargo/
$ cd cargo
$ ../rustc_codegen_cranelift/build/cargo.sh build
...
Finished dev [unoptimized + debuginfo] target(s) in 49.93s
它成功了!为了比较,让我们看看等效的 LLVM 后端需要多长时间。
)
对于完整的构建,LLVM 需要整整 5 秒钟。接下来,让我们尝试增量构建
$ git apply <<EOF
diff --git a/src/cargo/lib.rs b/src/cargo/lib.rs
index bccb41121..703afa754 100644
--- a/src/cargo/lib.rs
+++ b/src/cargo/lib.rs
@@ -36,8 +36,8 @@ use anyhow::Error;
use log::debug;
use std::fmt;
-pub use crate::util::errors::{InternalError, VerboseError};
pub use crate::util::{CargoResult, CliError, CliResult, Config};
+pub use crate::util::errors::{InternalError, VerboseError};
pub const CARGO_ENV: &str = "CARGO";
EOF
$ ../rustc_codegen_cranelift/build/cargo.sh build
Finished dev [unoptimized + debuginfo] target(s) in 7.98s
$ cargo +nightly-2020-10-31 build
Compiling cargo v0.50.0 (/home/jyn/cargo)
Finished dev [unoptimized + debuginfo] target(s) in 5.48s
实际上 LLVM 在这里更快:serde_derive
在 cranelift 下运行花费的时间更长,因为它没有经过太多优化。在 cranelift 下它花费大约 14% 的时间,而在 LLVM 下花费不到 3%。
在源码树内构建
本节主要面向编译器开发者,但即使你只是感兴趣,也欢迎跟着操作!这不是推荐构建 cg_clif
的方式,原因在于 Rust 编译器构建需要很长时间。
首先,下载 Rust 仓库。
$ git clone https://github.com/rust-lang/rust
现在,让我们设置构建系统来使用 cg_clif
。
$ cat > config.toml <<EOF
[rust]
codegen-backends = ["cranelift"]
EOF
最后,让我们运行构建。这可能需要很长时间,在某些情况下会超过半小时。
$ ./x.py build
我如何提供帮助?
你无需成为编译器开发者就可以帮助改进 cg_clif
!你能提供的最好帮助是在生态系统中不同的 Rust crate 上测试 cg_clif
。就在撰写本文时,我发现了 两个 bug,所以还有很多工作要做。请将你发现的任何 bug 报告到 rustc_codegen_cranelift
git 仓库。
未来,我们希望通过 Rustup 分发 cg_clif
,如果它足够成熟,最终使其成为 debug 构建的默认后端。