> For the complete documentation index, see [llms.txt](https://koshizuow.gitbook.io/compilerbook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://koshizuow.gitbook.io/compilerbook/separate_compile_linking/separate_compilation/to_separate_compile.md).

# 分離編譯與其必要性

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

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

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

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

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

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