C語言的編譯過程

來源: 白開水的博客  發布時間: 2012-02-18 16:32  閱讀: 8121 次  推薦: 7   原文鏈接   [收藏]  

  編譯: 編譯程序讀取源程序(字符流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,并且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。

  流程:C源程序頭文件 --> 預編譯處理(cpp) --> 編譯程序本身 --> 優化程序 --> 匯編程序 --> 鏈接程序 -–> 可執行文件

  1. 編譯預處理

  讀取C語言源程序,對其中的偽指令(以#開頭的指令)和特殊符號進行處理。

  偽指令主要包括以下四個方面:

  (1)宏定義指令

  (2)條件編譯指令,如#ifdef, #ifndef, #else, #elif, #endif

  (3)頭文件包含指令,如#include “FileName” 或者 #include 等。

  (4)特殊符號,預編譯程序可以識別一些特殊的符號。

  預編譯程序所完成的基本上是對源程序的“替代”工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。

  2. 編譯階段

  經過預編譯得到的輸出文件中,將只有常量,如數字、字符串、變量的定義,以及C語言的關鍵字,如main, if, else, for, while, {, }, +, -, *, \, 等等。預編譯程序所要做的工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之后,將其翻譯成等價的中間代碼表示或匯編代碼。

  3. 優化階段

 優化處理是編譯系統中一項比較艱深的技術。它涉及到的問題不僅同編譯技術本身有關,而且同機器的硬件環境也有很大的關系。優化一部分是對中間代碼的優化。這種優化不依賴于具體的計算機。另一種優化則主要針對目標代碼的生成而進行的。

  經過優化得到的匯編代碼必須經過匯編程序的匯編轉換成相應的機器指令,方可能被機器執行。

  4. 匯編過程

  匯編過程實際上指把匯編語言代碼翻譯成目標機器指令的過程。對于被翻譯系統處理的每一個C語言源程序,都將最終經過這一處理而得到相應的目標文件。目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。

  5. 鏈接程序

  由匯編程序生成的目標文件并不能立即就被執行,其中可能還有許多沒有解決的問題。例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變量或者函數調用等);在程序中可能調用了某個庫文件中的函數,等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。

  鏈接程序的主要工作就是將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來。

7
0
 
標簽:C語言 編譯
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()