C++編譯原理

來源:互聯網
上載者:User

     首先是先行編譯,這一步可以粗略的認為只做了一件事情,那就是“宏展開”,也就是對那些#***的命令的一種展開。

      例如define MAX 1000就是建立起MAX和1000之間的對等關係,好在編譯階段進行替換。

      例如ifdef/ifndef就是從一個檔案中有選擇性的挑出一些合格代碼來交給下一步的編譯階段來處理。這裡面最複雜的莫過於include了,其實也很簡單,就是相當於把那個對應的檔案裡面的內容一下子替換到這條include***語句的地方來。

      其次是編譯,這一步很重要,編譯是以一個個獨立的檔案作為單元的,一個檔案就會編譯出一個目標檔案。(這裡插入一點關於編譯的檔案的說明,編譯器通過尾碼名來辨識是否編譯該檔案,因此“.h”的標頭檔一概不理會,而“.cpp”的源檔案一律都要被編譯,我實驗過把.h檔案的尾碼名改為.cpp,然後在include的地方相應的改為***.cpp,這樣一來,編譯器就會編譯許多不必要的標頭檔,只不過標頭檔裡我們通常只放置聲明而不是定義,因此最後連結產生的可執行檔的大小是不會改變的)

      清楚編譯是以一個個單獨的檔案為單元的,這一點很重要,因此編譯只負責本單元的那些事,而對外部的事情一概不理會,在這一步裡,我們可以調用一個函數而不必給出這個函數的定義,但是要在調用前得到這個函數的聲明(其實這就是include的本質,不就是為了給你提前提供個聲明而好讓你使用嗎?至於那個函數到底是如何?的,需要在連結這一步裡去找函數的入口地址。因此提供聲明的方式可以是用include把放在別的檔案中的聲明拿過來,也可以是在調用之前自己寫一句void max(int,int);都行。),編譯階段剩下的事情就是分析文法的正確性之類的工作了。好啦,總結一下,可以粗略的認為編譯階段分兩步:    

        第一步,檢驗函數或者變數是否存在它們的聲明;

        第二步,檢查語句是否符合C++文法。

最後一步是連結,它會把所有編譯好的單元全部連結為一個整體檔案,其實這一步可以比作一個“連線”的過程,比如A檔案用了B檔案中的函數,那麼連結的這一步會建立起這個關聯。連結時最重要的我認為是檢查全域空間裡面是不是有重複定義或者缺失定義。這也就解釋了為什麼我們一般不在標頭檔中出現定義,因為標頭檔有可能被釋放到多個源檔案中,每個源檔案都會單獨編譯,連結時就會發現全域空間中有多個定義了。

標準C和C++將編譯流程定義為9個階段(Phases of Translation):

1.字元對應表(Character Mapping)

    檔案中的物理源字元被映射到源字元集中,其中包括三字元運算子的替換、控制字元(行尾的斷行符號換行)的替換。許多非美式鍵盤不支援基本源字元集中的一些字元,檔案中可用三字元來代替這些基本源字元,以??為前置。但如果所用鍵盤是美式鍵盤,有些編譯器可能不對三字元進行尋找和替換,需要增加-trigraphs編譯參數。在C++程式中,任何不在基本源字元集中的字元都被它的通用字元名替換。

2.行合并(Line Splicing)

    以反斜線/結束的行和它接下來的行合并。

3.標記化(Tokenization)

    每一條注釋被一個單獨的Null 字元所替換。C++雙字元運算子被識別為標記(為了開發可讀性更強的程式,C++為非ASCII碼開發人員定義了一套雙字元運算子集和新的保留字集)。原始碼被分析成預先處理標記。

4.預先處理(Preprocessing)

    調用預先處理指令並擴充宏。使用#include指令包含的檔案,重複步驟1到4。上述四個階段統稱為預先處理階段。

5.字元集映射(Character-set Mapping)

    源字元集成員、逸出序列被轉換成等價的執行字元集成員。例如:'/a'在ASCII環境下會被轉換成值為一個位元組,值為7。

6.字串串連(String Concatenation)

    相鄰的字串被串連。例如:"""hahaha""huohuohuo"將成為"hahahahuohuohuo"。

7.翻譯(Translation)

    進行文法和語義分析編譯,並翻譯成目標代碼。

8.處理模板

    處理模板執行個體。

9.串連(Linkage)

    解決外部參考的問題,準備好程式映像以便執行。

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/shiwenbin333/archive/2010/01/08/5157797.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.