C語言程序的編譯過程

C語言程序的編譯過程

#include<stdio.h>

int main()
{
    printf("Hello World!\n");
    return 0;
}

        對於這個最簡單的“Hello World!”程序——hello.c,它的生命週期一開始時是一個高級c程序,因爲它處於這種形式時,它是能夠被人讀懂的。然而,爲了在系統上運行hello.c程序,每條c語句都必須被其它程序轉化爲一系列的低級機器語言指令。然而這些指令按照一種稱爲可執行目標程序的格式打好包,並已二進制磁盤文件的形式存放起來。目標程序也稱爲可執行目標文件。
        在Unix/Linux系統上,從源文件到目標文件的轉化是由編譯器驅動程序完成的:
        linux> gcc –o hello hello.c
        在這裏,gcc編譯器驅動程序讀取源程序文件hello.c,並把它翻譯成一個可執行目標文件hello,這個翻譯的過程是分爲四個階段完成的,如下圖所示,執行這四個階段的程序(預處理器、編譯器、彙編器和鏈接器)一起構成了編譯系統。

預處理階段。預處理器(cpp)根據以字符#開頭的命令,修改原始c程序。比如hello.c中的第一行的#include <stdio.h>指令告訴預處理器讀取系統文件stdio.h的內容。並把它直接插入到程序文本中去。結果就得到了另一個C程序,通常是以 “.i”作爲文件擴展名。

編譯階段。編譯器(ccl)將文本文件 hello.i 翻譯成文本文件 hello.s ,它包含一個彙編語言程序。彙編語言程序中的每條語句都以一種標準的文本格式確切地描述了一條低級機器語言指令。彙編語言是非常有用的,因爲它爲不同高級語言的不同編譯器提供了通用輸出語言。例如:c語言編譯器和Fortran編譯器產生的輸出文件用的都是一樣的彙編語言。

彙編階段。接下來,彙編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成爲一種叫做可重定位目標程序的格式,並將結果保存在目標文件hello.o中。hello.o文件是一個二進制文件,它的字節編碼是機器語言指令而不是字符,如果我們在文本編輯器中打開hello.o文件,呈現的將是一堆亂碼。

鏈接階段。請注意,我們的hello程序調用了printf函數,它是標準c庫中的一個函數,每個C編譯器都提供,printf函數存在與一個名爲printf.o的單獨的預編譯目標文件中,而這個文件必須以某種方式併入到我們的hello.o程序中。鏈接器(ld)就負責這種併入,結果就得到hello文件,它是一個可執行目標文件(或者簡稱爲可執行文件)。可執行文件加載到存儲器後,由系統負責執行。

發佈了91 篇原創文章 · 獲贊 55 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章