本節課研究c語言如何編譯語言程式。對編譯器的了解程度決定**的產品質量。
file.i 中間**
file.s 彙編檔案
file.o 二進位制檔案
預編譯(文字處理工作)
1)處理所有的注釋,用空格代替;
2)將所有的#define刪除,並且展開所有的巨集定義;
3)處理條件編譯命令,#if,#ifdef,#elif,#else,#endif
4)處理#include,展開被包含的檔案;
5)保留編譯器需要使用的#pragma命令;
預處理指令示例:
gcc –e file.c –o file.i
編譯
1)對預處理檔案進行詞法分析,語法分析和語義分析;
a> 詞法分析:分析關鍵字,指示符,立即數等是否合法;
b> 語法分析:分析表示式是否遵循語法原則;
c> 語義分析:在語法分析的基礎上進一步分析表示式是否合法;
分析結束後進行**優化生成相應的彙編**檔案;
編譯指令示例:
gcc –s file.i –o file.s
彙編(相對編譯器工作簡單)
1)彙編器將彙編**轉變為機器的可以執行**;
2)每條彙編語句幾乎都對應一條機器指令;
彙編指令示例:
gcc –c file.s –o file.o
小結:編譯過程分為預處理,編譯,彙編和鏈結四個階段。
1)預處理:處理注釋,巨集以及#開頭的符號;
2)編譯:進行詞法分析,語法分析和語義分析;
3)彙編:將彙編**翻譯為機器指令的目標檔案;
C 語言學習記錄 19 記憶體的分割槽模型
c 在執行時,將記憶體從大方向上劃分為四個區域,在這些不同區域中存放的資料,會被賦予不同的生命週期,以便我們靈活程式設計。1.區 由作業系統管理,用於存放函式體的二進位制 2.全域性區 用於存放全域性變數和靜態變數以及常量 3.棧區 由編譯器自動分配 釋放,存放函式的引數值和區域性變數等 4.堆區 ...
C語言學習記錄20 鏈結過程
問題 工程中的每個c語言原始檔被編譯後生產目標檔案,這些檔案如何生成最終的可執行程式?鏈結器的主要作用是把各個模組之間相互引用的部分處理好,使得模組之間能夠爭取的銜接。靜態鏈結 由鏈結器在鏈結時將庫的內容直接加入到可執行程式中。在linux靜態庫下的建立和使用 1 編譯靜態庫原始碼 gcc c li...
C語言學習要點記錄
1.運算的優先順序 算數 關係 邏輯 賦值 逗號運算子 2.複製是程式不良的表現 因為一旦乙個地方有變動要在很多地方修改 3.程式設計的過程中最好使用單一出口 4.本地變數在定義的時候不會預設初始化,引數在定義的時候一定要初始化 5.本地變數的生存期和作用域在定義的塊內 6.程式這次執行正常下次執行...