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

时间:2017-06-03 22:09:50

标签: rust incremental-build incremental-compiler incremental-linking

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

我读过Rust缺少渐进式编译(尽管有beta版功能)。

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

  2. 如果以上是正确的,这是否会将Rust限制为具有较小依赖关系的相当小的项目? (如果,QtKDE只是标题库,那么使用它们的程序开发会非常痛苦,因为每次要编译自己的Qt / KDE时都会有效地重新编译代码)。

1 个答案:

答案 0 :(得分:7)

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

在Rust中,crate是编译单元。 (包可以是应用程序或库。) Rust不使用头文件;相反,等效信息作为元数据存储在已编译的包中(解析速度更快,并且与C / C ++中的预编译头具有相同的效果)。箱子还可以与其他板条箱相连。这意味着更改包的任何源文件需要重新编译整个包,并且更改包需要重新编译依赖它的所有包(当前,这意味着从源重新编译,即使API恰好没有更改)。

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

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