C編譯執行的過程

2021-06-09 20:55:27 字數 2024 閱讀 6307

c編譯執行是c語言必學的的。

從巨集觀上來說主要分成了:

c源**-->編譯-->鏈結-->執行

從微觀上來說:

c源程式標頭檔案-->預編譯處理(cpp)-->編譯程式本身-->優化程式-->匯程式設計序-->鏈結程式-->可執行檔案

a)預編譯處理:將偽指令和特殊的符號進行處理。預處理就是將原始檔的包含標頭檔案,巨集定義,條件編譯等進行簡單的「替換「工作,不能進行語法的檢錯功能,生成的是乙個沒有以上內容輸出檔案放在.obj檔案中。加入預處理命令的作用是:改進程式設計的環境,提高程式設計的效率。

(1)巨集定義指令,如#define name tokenstring。對於這個偽指令,預編譯所要做的是將程式中的所有name用tokenstring替換,但作為字串常量的name則不被替換。,#undef則將取消對某個巨集的定義,使以後該串的出現不再被替換

(2)條件編譯指令,#ifdef,#ifndef,#else,#elif,#endif,等等。這些偽指令的引入使得程式設計師可以通過定義不同的巨集來決定編譯程式對哪些**進行處理。預編譯程式將根據有關的檔案,將那些不必要的**過濾掉。

(3)標頭檔案包含指令,如#include "filename"或者#include 等。

在標頭檔案中一般用偽指令#define定義了大量的巨集(最常見的是字元常量),同時包含有各種外部符號的宣告採用標頭檔案的目的主要是為了使某些定義可以供多個不同的c源程式使用。因為在需要用到這些定義的c源程式中,只需加上一條#include語句即可,而不必再在此檔案中將這些定義重複一遍。預編譯程式將把頭檔案中的定義統統都加入到它所產生的輸出檔案中,以供編譯程式對之進行處理。標頭檔案的作用就是大量減少程式設計師的重複勞動,只要將標頭檔案包含就能用其中的內容了。

(4)特殊符號,預編譯程式可以識別一些特殊的符號。例如在源程式中出現的line標識將被解釋為當前行號(十進位制數),file則被解釋為當前被編譯的c源程式的名稱。預編譯程式對於在源程式中出現的這些串將用合適的值進行替換。

b)編譯,就是將檔案中的關鍵字,資料等通過了預編譯後,進行編譯(檢查是不是都符合c語言的語法規則),翻譯成中間**。

c)優化程式,程式的優化主要有兩種優化專案,一、與計算機無關的優化,主要作用就是刪除公共表示式、迴圈優化(**外提、強度削弱、變換迴圈控制條件、已知量的合併等)、複寫傳播,以及無用賦值的刪除,等等。二、就是雨計算機硬體相關的優化,優化同機器的硬體結構密切相關,最主要的是考慮是如何充分利用機器的各個硬體暫存器存放的有關變數的值,以減少對於記憶體的訪問次數。

d)匯程式設計序。就是將匯程式設計序翻譯成目標機器指令的過程,經過這一處理得到相應的目標檔案,該目標檔案主要分成了兩段:**段和資料段。**段存放的是程式的指令,是可讀的,不可以,資料段主要放的是各種全域性變數和靜態的資料。

e)連線程式:連線接程式的主要工作就是將有關的目標檔案彼此相連線,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠誒作業系統裝入執行的統一整體。外部的檔案可以有庫檔案的連線和自己定義檔案中的函式和變數進行連線。

(1)靜態鏈結 在這種鏈結方式下,函式的**將從其所在地靜態鏈結庫中被拷貝到最終的可執行程式中。這樣該程式在被執行時這些**將被裝入到該程序的虛擬位址空間中。靜態鏈結庫實際上是乙個目標檔案的集合,其中的每個檔案含有庫中的乙個或者一組相關函式的**。

(2)動態鏈結  在此種方式下,函式的**被放到稱作是動態鏈結庫或共享物件的某個目標檔案中。鏈結程式此時所作的只是在最終的可執行程式中記錄下共享物件的名字以及其它少量的登記資訊。在此可執行檔案被執行時,動態鏈結庫的全部內容將被對映到執行時相應程序的虛位址空間。動態鏈結程式將根據可執行程式中記錄的資訊找到相應的函式**。

於可執行檔案中的函式呼叫,可分別採用動態鏈結或靜態鏈結的方法。使用動態鏈結能夠使最終的可執行檔案比較短小,並且當共享物件被多個程序使用時能節約一些記憶體,因為在記憶體中只需要儲存乙份此共享物件的**。但並不是使用動態鏈結就一定比使用靜態鏈結要優越。在某些情況下動態鏈結可能帶來一些效能上損害

C 程式的編譯執行過程

總體來說包含四步 預處理 編譯 彙編 鏈結 g 編譯器可以一步執行到底,直接生成可執行檔案,如 g o helloworld helloworld.cpp g g 表示生成除錯相關的資訊也可以分布執行,生成預處理檔案,預處理 g o helloworld.ii e helloworld.cpp 此時...

C程式編譯執行過程

c語言從源 到可執行檔案的過程 1 編譯預處理 讀取c源 對其中的偽指令 以 開頭的指令 和特殊符號進行處理 偽指令主要包括以下四個方面 1.1 巨集定義指令 define 定義巨集 undef 取消巨集的定義 預定義巨集 標準c中定義了一些物件巨集,這些巨集的名稱以 兩個下劃線 開頭和結尾,並且都...

C 編譯,執行過程 詳解。

要更深入了解c 必須要知道乙個程式從開始到結束都幹了些什麼,怎麼幹的。所以我從c 編譯到執行過程,解析下程式是怎麼跑的。首先,初略的說一下之前c 的編譯過程,c 編譯過程包括預編譯 彙編 編譯 鏈結。稱為乙個可執行檔案。windows平台下為.exe檔案 預編譯主要展開包含的標頭檔案,巨集定義等操作...