2010-06-11 146 views

回答

13

效率。 當你編譯一個程序時,你爲每個源文件創建一個目標文件,如果你改變一個源文件,你只需要重新編譯該模塊,然後重新鏈接(重新連接很便宜)。 如果編譯器一次完成所有操作,它將不得不爲每次更改重新編譯所有內容。

這也符合與該做一件事的小程序的UNIX哲學,讓你有一個預處理器,編譯器,鏈接器,庫的創建者。這些步驟現在可能是相同工具的不同模式。

然而,有一些原因讓你希望編譯器在一個步驟中鏈接,如果你允許編譯器在鏈接時改變目標文件,你可以做一些優化 - 大多數現代編譯器都允許這樣做,但它要求他們把在編譯時將額外的信息放入目標文件中。

它會更好,如果編譯器可以在整個項目存儲在一個數據庫中,而不是源,資源的混亂,瀏覽信息文件,目標文件等 - 但開發商很保守!

+0

是的,這也是我提到的開發生產力,但是,從編譯器算法的角度來看還有沒有考慮? – 2010-06-11 15:43:31

+2

另一件要考慮的事情是,它完全可以從不同的obj文件子集創建更多的可執行文件(即兩個項目可以使用相同的源代碼files = modules = obj文件)。這當然是可能的,這要歸功於編譯和鏈接階段的分離。你不需要從頭開始重建所有的東西。 – PeterK 2010-06-11 16:06:40

+0

-1:這與Unix無關 – 2010-06-13 01:30:49

-3

編譯文件改變了代碼轉換成二進制計算機可以讀取。鏈接文件告訴計算機如何完成一個命令。所以不可能一下子完成,沒有兩個步驟。

+0

什麼?這甚至沒有意義。 – 2010-06-11 18:16:08

+0

我試圖解釋編譯和鏈接過程的作用。 – 2010-06-12 06:26:15

+0

-1:那麼你做了一個非常糟糕的工作。 – 2010-06-13 01:28:37

2

這是歷史的一部分。回到黑暗時代,電腦幾乎沒有記憶。創建一個帶有足夠源代碼的程序很容易,它不能一次處理所有程序。所以處理必須分階段完成:預處理源代碼,將源代碼編譯爲程序集(逐個),彙編到目標代碼,將所有目標文件鏈接到最終的可執行文件中。每個步驟都有一個或多個獨立工具來完成其任務。多年來,這些工具逐漸得到了改進,但過程的重大設計並未成爲主流。

2

重要的是,建造時間,即使是一個非常大的項目,是24小時。而且能夠在一夜之間建立更好。 獨立編譯,這就是將程序分爲「編譯單元」獨立編譯它們,是爲了減少編譯時間的方式:

  • 如果編譯單元尚未改變,如果沒有它取決於已經改變,你可以重用舊編譯的結果。

  • 您通常可以並行編譯多個單元,甚至可以通過工作站網絡進行分佈。低級Make將會並行編譯,並且存在其他工具,如ccdist來分配編譯工作。

鏈接本身幾乎沒有什麼好處,但使用單獨編譯的結果是必要的。

2

這是一個非常好的時間來教你的門徒關於單一責任原則!

相關問題