1. 程式人生 > >程式編譯的4個過程

程式編譯的4個過程

0.引言
hello.c(源程式)是一條高階C語言程式,雖然它是以一種易讀的形式,讓人們容易理解。但是,它卻無法直接驅動硬體CPU直接執行。為了我們編寫的hello.c程式可以被執行,驅動硬體電路工作,hello.c程式必須經過一些列處理步驟,將源程式轉化為可執行性的目標程式。

而我們知道,機器語言就是處理器可以直接理解(與生俱來就能理解)的程式語言,機器語言有時也被叫做原生程式碼(Native Code)[1],而機器語言是一種以“0、1、0、1”的表現形式二進位制程式碼,因此源程式的編譯過程任務即就是:將以高階語言編寫的程式轉換為以二進位制程式碼的可執行性目標程式。

1.編譯過程的四個階段


源程式到目標程式執行的四個階段如圖1所示,GCC編譯C原始碼有四個步驟:預處理—->編譯—->彙編—->連結。 


以源程式hello.c為例
#include <stdio.h>

int main()
{
    printf("happy new year!\n");
    return 0;
}

2.預處理階段(.c—.i)
編譯器將C程式的標頭檔案編譯進來,還有巨集的替換,可以用gcc的引數-E來參看。

命令:unix>gcc –o hello hello.c 
作用:將hello.c預處理輸出hello.i

3 編譯(.i—.s)轉換為組合語言檔案
這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無錯誤後後,把程式碼翻譯成組合語言[2]。可用gcc的引數-S來參看。 
編譯器(ccl)將文字檔案hello.i 翻譯成文字檔案hello.s, 它包含一個組合語言程式。 
一條低階機器語言指令。 
命令:gcc -S hello.i -o hello.s 
作用:將預處理輸出檔案hello.i彙編成hello.s檔案

4.彙編階段(.s—.o)得到機器語言
彙編器as 將hello.s 翻譯成機器語言儲存在hello.o 中(二進位制文字形式)。

5.連結階段
printf函式存在於一個名為printf.o的單獨預編譯目標檔案中。必須得將其併入到hello.o的程式中,連結器就是負責處理這兩個的併入,結果得到hello檔案,它就是一個可執行的目標檔案。