首先是圖1-3展示的乙個helloworld程式的整個執行過程。
1:預處理階段
預處理器(cpp)根據以字元#開頭的語句,修改原始的c程式。比如#include命令,就會告訴預處理器把頭檔案中的內容直接插入到程式文字中,得到了另乙個c程式,通常以.i作為字尾名。
2:編譯階段
編譯器(ccl) (compiler) 負責把hello.i 翻譯為組合語言hello.s,包含了乙個組合語言程式。 組合語言為不同的高等語言的不同編譯器提供了通用的輸出語言。
3:彙編器
彙編器(as)會把組合語言翻譯為機器指令語言,儲存在hello.o 中,是二進位制檔案。
4:鏈結器(ld)
在hello的main中呼叫了已定義好的printf函式,該函式是每個c編譯器都提供的標準c庫中的乙個函式。printf函式存在於名為printf.o的單獨的預編譯好了的目標檔案中,鏈結器負責把這個檔案合併到hello.o中,結果得到乙個hello檔案,這是乙個可執行的二進位制檔案,可以被載入到記憶體中由系統執行。
深入理解計算機系統1
hello.c include int main 源程式 原始檔 實際上就是乙個由0和1組成的位 又成位元bit 序列,8個位被組組成一組,稱為位元組。每個位元組表示程式中的某些文字字元 大部分的現代計算機系統都使用ascii標準來表示文字字元 hello.c 預處理器 cpp hello.i 修改...
深入理解計算機系統 程式的執行過程
hello,world 是各程式語言的開門語句,那我的第一篇就以 hello,world 為例來說明程式是如何執行的。與書本保持一致,本系列文件的程式語言均為c語言。本篇內容會分三個部分來介紹程式的執行過程,即,計算機系統的硬體組成 程式的編寫和編譯 程式的執行 首先,我們來看一下乙個典型的計算機系...
深入理解計算機系統
關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...