hello.c(源程序)是一條高級C語言程序,雖然它是以一種易讀的形式,讓人們?nèi)菀桌斫?。但是,它卻無法直接驅(qū)動硬件CPU直接執(zhí)行。為了我們編寫的hello.c程序可以被執(zhí)行,驅(qū)動硬件電路工作,hello.c程序必須經(jīng)過一些列處理步驟,將源程序轉(zhuǎn)化為可執(zhí)行性的目標程序。
而我們知道,機器語言就是處理器可以直接理解(與生俱來就能理解)的編程語言,機器語言有時也被叫做原生代碼(Native Code)[1],而機器語言是一種以“0、1、0、1”的表現(xiàn)形式二進制代碼,因此源程序的編譯過程任務(wù)即就是:將以高級語言編寫的程序轉(zhuǎn)換為以二進制代碼的可執(zhí)行性目標程序。
源程序到目標程序執(zhí)行的四個階段如圖1所示,GCC編譯C源代碼有四個步驟:預(yù)處理—->編譯—->匯編—->鏈接。
編譯器將C程序的頭文件編譯進來,還有宏的替換,可以用gcc的參數(shù)-E來參看。
命令:unix>gcc –o hello hello.c 作用:將hello.c預(yù)處理輸出hello.i
這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無錯誤后后,把代碼翻譯成匯編語言[2]??捎胓cc的參數(shù)-S來參看。 編譯器(ccl)將文本文件hello.i 翻譯成文本文件hello.s, 它包含一個匯編語言程序。 一條低級機器語言指令。 命令:gcc -S hello.i -o hello.s 作用:將預(yù)處理輸出文件hello.i匯編成hello.s文件
匯編器as 將hello.s 翻譯成機器語言保存在hello.o 中(二進制文本形式)。
printf函數(shù)存在于一個名為printf.o的單獨預(yù)編譯目標文件中。必須得將其并入到hello.o的程序中,鏈接器就是負責處理這兩個的并入,結(jié)果得到hello文件,它就是一個可執(zhí)行的目標文件。
[1] 矢澤久雄胡屹.計算機是怎樣跑起來的 : How computers work[M]:人民郵電出版社,2015. [2] Bryant RandalE.,O’Hallaron DavidR.,布萊恩特等.深入理解計算機系統(tǒng)[M]:機械工業(yè)出版社,2011.
新聞熱點
疑難解答