3

我是一個外人,試圖看看Rust是否適合我的項目。Rust完全沒有增量編譯意味着什麼?

我讀過Rust沒有增量編譯(儘管有測試版功能)。

  1. 這是與具有一切都在C++中的頭文件來實現(像許多Boost)?

  2. 如果上述內容是正確的,這是否將Rust限制在相對較小的小項目中? (比如說,如果QtKDE只有頭庫,然後程序使用它們將是非常痛苦的發展,因爲你要自己編譯的代碼,每次有效重新編譯的Qt/KDE)。

回答

5

在C和C++中,編譯單元通常是一個源文件及其傳遞包含的所有頭文件。應用程序或庫通常由多個鏈接在一起的編譯單元組成。應用程序或庫可以另外與其他庫鏈接。這意味着更改源文件只需重新編譯該源文件然後重新鏈接,更改外部庫只需重新鏈接,但更改頭文件(無論它是項目的一部分還是外部;編譯器無法區分)需要重新編譯使用它的所有源文件,然後重新鏈接。

在Rust中,箱子是編譯單元。 (一個箱子可以是一個應用程序或一個庫。)Rust不使用頭文件;相反,等效信息作爲元數據存儲在已編譯的包裝箱中(解析速度更快,並且與C/C++中的預編譯頭文件具有相同的效果)。一個箱子可以另外與其他箱子連接。這意味着更改一個箱子的任何源文件需要重新編譯整個箱子,並且更改箱子需要重新編譯依賴它的所有箱子(目前,這意味着即使API沒有改變也要從源碼重新編譯)。

要回答您的問題,不,Rust每次重新編譯項目時都不會重新編譯所有依賴項;事實上恰恰相反。

Rust中的漸進式編譯是關於重複使用前一個編譯器編譯工作來加快編譯時間。例如,如果更改模塊並且不影響其他模塊,編譯器將能夠重用上次編譯其他模塊時生成的數據。增量編譯的缺乏通常只是大型或複雜的箱子(例如那些大量使用宏)的問題。