程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 深入淺出編譯原理-2-gcc編譯器概覽

深入淺出編譯原理-2-gcc編譯器概覽

編輯:關於C語言

引言

gcc現在的意思是“GUN編譯器集合”,這裡說的是上個世紀的意思“GUN C語言編譯器”。

 

2.1程序的一般編譯過程

以gcc為例:

一般情況下,比如我們有一個源文件:main.c,裡面寫的是我們的代碼。想執行以下,gcc main.c,執行以下這個命令就會生成一個a.out的文件。然後./a.out就可以執行了。但是,這中間的過程可注意過嗎?這就是編譯原理要研究的內容了。這一節先說一下整個的處理過程,具體細節會在以後逐漸討論,包括,詞法分析,語法分析,中間代碼生成和優化,優化又包括機器無關優化,並行性和局部性優化,等等這些內容。以及如何自己發明一種語言,然後自己動手寫一個編譯器將其編譯!

分別加入參數可查看各個階段的結果。

 

 

在上圖中,CPP是“預編譯”的縮寫,AST是“抽象語法樹”的縮寫,SSA是“靜態單賦值”的縮寫,RTL是“寄存器傳輸語言”的縮寫。各種含義,需要仔細品味一下,呵呵。

過程如下:

1》將不同語言,進行詞法分析,語法分析,得到對應語言的AST

2》這些AST之間有稍微的差別,然後把這些差別去除,生成通用AST

3》按照AST,生成中間代碼(三地址代碼,即:x=y op z)

4》對中間代碼進行優化,這部分的任務很艱巨

5》根據目標機器的匯編描述,生成對應機器架構的匯編語言

6》到此編譯器的任務就算完了,剩下的匯編器。

7》匯編器將其匯編成機器代碼(010100101000101010010101010000101011110.。。。。。)

8》連接器ld將源碼中調用的庫函數連接進來

9》最後,是加載器,將可執行文件加載到內存,並執行之。

 

2.2編譯器的前端處理過程

下面是一句簡單的c語句的編譯過程。

如圖所示:

 

 

 

2.3小結

一個高級語言寫的程序的執行,要經過很復雜漫長的過程。這個過程對我們程序員來說卻經常被忽視。

向編譯器創造者致敬。

編譯原理的學習過程一般比較枯燥,多一個人同行,就多一份趣味和快樂!
作者:rill_zhen

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved