分離編譯與其必要性

分離編譯是指把1個程式分成數份程式碼檔案來撰寫,並分別編譯。分離編譯中,編譯器並不是讀整個程式,而是只讀程式的部份,並只輸出對應該部份的指令。而這種包含無法單獨執行的部份程式的檔案,被稱為「目標檔」(object file,副檔名為 .o)。分離編譯的最後,會把目標檔們結合為1個檔案。把目標檔整合為1個可執行檔的程式就稱為「連結器」(linker)。

我們來了解一下為什麼分離編譯有其必要性吧。其實,從技術的角度來看,並沒有非得把程式碼分割開來的必要。理論上,只要一口氣把程式碼全部給編譯器,是可以不借助連結器的幫忙輸出完整的可執行檔的。

但是如果要這樣做,編譯器真的得知道所有用到的程式碼。舉例來說,像printf等標準函式庫的函式,通常是標準函式庫的作者以C所寫的函式,如果想要省掉連結器這個步驟,每次編譯都需要把函式的原始程式碼輸給編譯器才行。一直重複編譯同一個函式,在多數情況下,只是浪費時間。所以標準函式庫一般是以編譯完的目標檔的形式所發佈,不需要自己重新編譯。也就是說,就算程式碼是只有一個檔案構成的程式,只要用到標準函式庫,都還是分離編譯。

如果不做分離編譯,就算只改一行程式碼也要把整體程式碼全部重編。數萬行長度的程式碼的話要花上數十秒。大型專案的程式原始碼可能超過1000萬行,如果要一口氣編譯的話可能一整天也編不完,記憶體也需要100GiB單位以上的空間。這樣的流程非常地與現實不符。

而且,還有個非常單純的問題是,對人類來說,非常難在1個檔案中管理所有需要的函式和變數。

如上所述,分離編譯的必要性是顯而易見的。

Last updated