飛刀推球搜眾神推球 c語言程式的編譯過程

2021-10-10 22:15:36 字數 1225 閱讀 1813

**根據知名球料公中號「眾神推球」表明:**經典的hello world,通常是你的第乙個c語言程式:

#include

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的內容。並把它直接插入到程式文字中去。結果就得到了另乙個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檔案,它是乙個可執行目標檔案(或者簡稱為可執行檔案)。可執行檔案載入到儲存器後,由系統負責執行。

推箱子 廣搜

題目 時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述絕大多數人都玩過推箱子的遊戲,控制乙個人將箱子推動到目標位置即獲得勝利。現請你編寫乙個程式,判斷將箱子推到目標位置至少需要多少步。輸入推箱子的平面區域為固定大小 10 10 使用10行10列輸入推箱子的初始局面。其中,0代...

hdu 1254 推箱子 廣搜 深搜

注意以下幾點 1.箱子是否可走 2.人是否可達箱子後面 3.箱子的每個方向只走一次,而不是每個位置 廣搜箱子路徑,深搜人可否達箱子後面,記錄方向用visb 10 10 4 來記錄 include include include include include includeusing namespa...

眾推平台架構 分布式爬蟲

經過新一輪的投票,專案的範圍已經基本確定。大家決定 全力以付,集中攻克 分布式爬蟲 使用佇列,即生產者,消費都模式。由於生產者將規則生成到佇列,然後由爬蟲集群 消費者 到佇列中取規則,然後按優先順序等規則進行爬取。分布式爬蟲架構3,參考的cola是乙個分布式的爬蟲框架,使用者只需編寫幾個特定的函式,...