Rust 缺少增量编译究竟意味着什么?

What does Rust's lack of incremental compilation mean, exactly?

This question was asked before Rust officially supported incremental compilation. Rust 1.24.0 and later enable incremental compilation by default for development (debug) builds.

我是一个局外人,想看看 Rust 是否适合我的项目。

我读到 Rust 缺少增量编译(尽管有测试版功能)。

  1. 这是否类似于在 C++ 的 headers 中实现所有内容(就像 Boost 的大部分内容一样)?

  2. 如果以上是正确的,这是否将 Rust 限制在具有小依赖项的相当小的项目中? (如果,比方说,Qt or KDE 是 header-only 库,那么使用它们的程序开发起来会非常痛苦,因为每次你想编译自己的代码时,你都会有效地重新编译 Qt/KDE。 )

在 C 和 C++ 中,一个编译单元通常是一个源文件和它传递包含的所有 header 文件。应用程序或库通常由多个链接在一起的编译单元组成。应用程序或库还可以与其他库链接。这意味着更改源文件只需要重新编译该源文件然后重新链接,更改外部库只需要重新链接,但是更改 header 文件(无论它是项目的一部分还是外部的;编译器无法分辨差异)需要重新编译所有使用它的源文件,然后重新链接。

在 Rust 中,crate 是编译单元。 (板条箱可以是应用程序或库。)Rust 不使用 header 文件;相反,等同的信息作为 元数据存储在已编译的 crates 中(解析速度更快,并且与 C/C+ 中的预编译 headers 具有相同的效果+).一个 crate 还可以与其他 crate 链接。这意味着更改一个 crate 的任何源文件需要重新编译整个 crate,而更改一个 crate 需要重新编译依赖它的所有 crate(目前,这意味着从源代码重新编译,即使 API 碰巧没有已经改变了)。

为了回答您的问题,不,Rust 不会在您每次重新编译项目时重新编译所有依赖项;事实恰恰相反。

Rust 中的增量编译是关于重用在以前的 crate 编译中完成的工作以加快编译时间。例如,如果您更改了一个模块并且它不影响其他模块,则编译器将能够重用上次编译其他模块时生成的数据。缺少增量编译通常只是大型或复杂的箱子的问题(例如那些大量使用宏的箱子)。