編譯和鏈結的區別是什麼?

2021-08-22 13:39:49 字數 761 閱讀 7855

編譯

將預處理生成的檔案,經過詞法分析、語法分析、語義分析以及優化後編譯成若干個目標模組。可以理解為將高階語言翻譯為計算機可以理解的二進位制**,即機器語言。

鏈結

由鏈結程式將編譯後形成的一組目標模組以及它們所需要的庫函式鏈結在一起,形成乙個完整的載入模型。鏈結主要解決模組間的相互引用問題。分為位址和空間分配,符號解析和重定位幾個步驟。在編譯階段生成目標檔案時,會暫時擱置那些外部引用,而這些外部引用就是在鏈結時進行確定的,鏈結器在鏈結時,會根據符號名稱去相應模組中尋找對應符號。待符號確定之後,鏈結器會重寫之前那些未確定的符號的位址,這個過程就是重定位。鏈結一般分為靜態鏈結、載入時動態鏈結以及執行時動態鏈結三種。

載入

由引導程式將載入模組載入記憶體

編譯和鏈結是為將使用者程式從硬碟上調入記憶體並將其轉換成可執行程式服務的。用編譯器時的compile就是在進行編譯,link就是鏈結,執行程式可以看到。

以c/c++語言為例,把原始檔編譯成中間**我那件,在windows下面為.obj檔案,在unix、linux下面就是.o檔案,即object file,該動作被稱為編譯。然後再把大量的object file合成執行檔案,這個動作稱為鏈結。

編譯時,編譯器需要的是語法正確,函式與變數的宣告正確。而一般來說,每個原始檔都應該對應於乙個中間目標檔案(.o檔案或是.obj檔案)來鏈結應用程式。鏈結就是那些目標檔案之間相互鏈結自己所需要的函式和全域性變數,而函式可能**於其他目標檔案或庫檔案。

和 的區別是什麼?

符號一般用來當作佔位符,常使用linux指令碼的同學應該對此有更深的體會吧。既然是佔位符,當然就是被用來替換的。知道了這點就能很容易區分 和 從而不容易記錯了。比如說用 和 傳參的區別,使用 傳入引數是,sql語句解析是會加上 比如 select from table where name 傳入的n...

和 equals 的區別是什麼?

string x string string y string string z newstring string system.out.println x y true system.out.println x z false system.out.println x.equals y true ...

和equals的區別是什麼

1 是關係運算子,equals是方法,結果都返回布林值 2 object類的和equals都是比較位址,作用相同 作用 jdk中的類一般已經重寫了equals 方法,比較的是內容 自定義的類如果沒有重寫equals方法,將呼叫父類的equals方法 可以根據自己的需求重寫equals方法,重寫equ...