CPU的全稱是中央處理單元,是計算機進行運算的核心,根據使用的技術不同,CPU又分為X86,X64,ARM、DSP、單片機等不同的體系結構。在每種CPU上都有一套特定的指令集,這就是人們常說的機器指令,直接使用機器指令編寫的程序就是機器語言程序。
理論上來說,是可以通過機器語言直接編寫任何程序的(早期都是直接使用機器語言編程,那時程序相對比較簡單),并且編寫的程序可以直接運行,但是使用機器語言編程對程序員的要求極高,代碼無法移植且不便于人直接閱讀,于是人們發明了一組符號,用來表示這些機器指令,這就是匯編語言。匯編語言編寫的程序計算機無法直接運行,需要一個叫做匯編器的程序轉換為機器語言才可以在特定機器上運行。
而C語言是比匯編語言更高級的語言,使用C語言編寫的程序也是無法在計算機上直接運行的,它需要編譯器將C語言代碼轉換為機器語言,這個過程又分為幾個子步驟,見下圖。
為了使題主的問題更加完善,在這里補充兩個概念,鏈接器與反匯編。
在大型程序中,往往會將任務分解為許多不同的子任務,每個子任務對應一個源文件,在C語言中就是多個C文件,編譯器將每個C文件編譯成一個目標文件(一般在Windows中是obj文件,Linux中是
.o
文件),這些目標文件也是機器指令,但是缺少一些必要的信息,無法直接運行,需要鏈接器將這些文件鏈接起來,再加上一些庫文件與可執行文件頭信息,成為一個可執行文件(Windows是PE格式,Linux是ELF格式)。通常,在查看一個二進制文件時(目標文件或者可行性文件),不會直接顯示機器指令,而是以匯編語言顯示,這是因為此過程中有一個反匯編程序,將機器指令轉換為匯編語言,它的功能剛好與匯編過程相反。