为什么 Rust 需要 C++ 工具链来生成 Rust 二进制文件,而像 Go 这样的语言没有这个要求?
Why does Rust require a C++ toolchain to produce a Rust binary, while languages like Go do not have this requirement?
如果我没有安装 C++ 工具链,使用 rustc foo.rs
编译 Rust 文件会失败。但是在编译 Go 程序时,不需要这样的工具链。这是为什么?
TL;DR: 因为每个人都有一个 C 工具链。
稍作更正:rustc不需要C++工具链,只需要C工具链。值得注意的是,rustc 创建的二进制文件仅依赖于 libc
(或等效项),而不依赖于 libstdc++
(或等效项)。
正如 Go 所展示的,不需要 C 工具链是可能的。你只需要re-implement它的功能:
- 您需要根据目标平台格式实现自己的链接器。
- 您需要实现自己的 libc(又名 OS 层)。
这样做有很多好处,例如编译速度可能更快或更容易 cross-compiling,但是实施会产生一定的成本,而且 很容易 get things wrong.
与工具链相比,Rust 社区更愿意在语言上投入更多的精力,因此重用库存工具链更容易。具体来说,rustc 将需要一个平台链接器(ld
在 Unix 上)和相当于 libc
.
的平台
这不是核心设计原则,它只是一种务实的方法,并且有一些项目可以减少这些依赖性:
- 使用 lld 而不是 ld 将允许使用可以针对所有平台的 rustc 发送单个链接器。
- 使用 cranelift 作为替代后端也可以消除对 ld 的依赖。
- Redox 项目正在研究 relibc,
libc
API. 的可移植 Rust 实现
这些都在进行中,同时 rustc 将需要一个 C 工具链。此外,即使在可预见的未来,我希望 rustc 需要一个 C 工具链用于任何 Rust 工具链尚未涵盖的目标,这样您就可以使用目标而无需等待一些假设的开发。
如果我没有安装 C++ 工具链,使用 rustc foo.rs
编译 Rust 文件会失败。但是在编译 Go 程序时,不需要这样的工具链。这是为什么?
TL;DR: 因为每个人都有一个 C 工具链。
稍作更正:rustc不需要C++工具链,只需要C工具链。值得注意的是,rustc 创建的二进制文件仅依赖于 libc
(或等效项),而不依赖于 libstdc++
(或等效项)。
正如 Go 所展示的,不需要 C 工具链是可能的。你只需要re-implement它的功能:
- 您需要根据目标平台格式实现自己的链接器。
- 您需要实现自己的 libc(又名 OS 层)。
这样做有很多好处,例如编译速度可能更快或更容易 cross-compiling,但是实施会产生一定的成本,而且 很容易 get things wrong.
与工具链相比,Rust 社区更愿意在语言上投入更多的精力,因此重用库存工具链更容易。具体来说,rustc 将需要一个平台链接器(ld
在 Unix 上)和相当于 libc
.
这不是核心设计原则,它只是一种务实的方法,并且有一些项目可以减少这些依赖性:
- 使用 lld 而不是 ld 将允许使用可以针对所有平台的 rustc 发送单个链接器。
- 使用 cranelift 作为替代后端也可以消除对 ld 的依赖。
- Redox 项目正在研究 relibc,
libc
API. 的可移植 Rust 实现
这些都在进行中,同时 rustc 将需要一个 C 工具链。此外,即使在可预见的未来,我希望 rustc 需要一个 C 工具链用于任何 Rust 工具链尚未涵盖的目标,这样您就可以使用目标而无需等待一些假设的开发。