程序被其他程序翻譯成不同的格式

在hello程序生命週期的一開始時是一個高級C程序,因爲當處於這種形式時,它是能夠被人讀懂的。然而,爲了在系統上運行hello.c程序,每條C語句都必須被其他程序轉化爲一系列的低級機器語言指令。然後這些指令按照一種稱爲可執行目標程序(executable object program)的格式打好包,並以二進制磁盤文件的形式存放起來。目標程序也稱爲可執行目標文件(executable object file)。

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章