編譯過程有哪6個階段
1. 一個編譯器至少包含三個部分的進程是什麼
一個典型的編譯程序通常包含8個組成部分,它們是詞法分析程序、語法分析程序、語義分析程序、中間代碼生成程序、中間代碼優化程序、目標代碼生成程序、表格管理程序和錯誤處理程序。
(1) 編譯程序:如果源語言為高級語言,目標語言為某台計算機上的匯編語言或機器語
言,則此翻譯程序稱為編譯程序。
(2) 源程序:源語言編寫的程序稱為源程序。
(3) 目標程序:目標語言書寫的程序稱為目標程序。
(4) 編譯程序的前端:它由這樣一些階段組成:這些階段的工作主要依賴於源語言而與
目標機無關。通常前端包括詞法分析、語法分析、語義分析和中間代碼生成這些階
段,某些優化工作也可在前端做,也包括與前端每個階段相關的出錯處理工作和符
號表管理等工作。
(5) 後端:指那些依賴於目標機而一般不依賴源語言,只與中間代碼有關的那些階段,
即目標代碼生成,以及相關出錯處理和符號表操作。
(6) 遍:是對源程序或其等價的中間語言程序從頭到尾掃視並完成規定任務的過程。
詞法分析程序:輸人源程序,拼單詞、檢查單詞和分析單詞,輸出單詞的機內表達形式。
語法分析程序:檢查源程序中存在的形式語法錯誤,輸出錯誤處理信息。
語義分析程序:進行語義檢查和分析語義信息,並把分析的結果保存到各類語義信息表中。
中間代碼生成程序:按照語義規則,將語法分析程序分析出的語法單位轉換成一定形式的中間語言代碼,如三元式或四元式。
中間代碼優化程序:為了產生高質量的目標代碼,對中間代碼進行等價變換處理
2. c語言源程序的編譯過程包括哪三個階段
編譯:將源程序轉換為擴展名為.obj的二進制代碼
連接:將obj文件進行連接,加入庫函數等生成可執行文件
運行:執行可執行文件,有錯返回修改,無錯結束
3. c語言的編譯過程是什麼
c語言的編譯過程如下:
1、預處理:預處理過程實際上是處理「#」的過程:#include包含的頭文件直接拷貝到hello.c中;#define定義的宏定義進行替換,同時刪除代碼中沒有的注釋部分。2、編譯:編譯的過程實質上是將高級語言翻譯成機器語言的過程。3、匯編:匯編器是將匯編代碼轉變成機器可以執行的命令,每一個匯編語句幾乎都對應一條機器指令。匯編相對於編譯過程比較簡單,根據匯編指令和機器指令的對照表一一翻譯即可。4、鏈接:就像hello.c中使用到了C標准庫的東西「printf」,但是編譯過程只是將源文件翻譯成二進制文件而已,這個二進制文件還不能直接執行,還需要一個動作:將翻譯成的二進制文件與需要用到的庫綁定在一塊。
補充:編譯過程可分為6步:掃描(詞法分析)、語法分析、語義分析、源代碼優化、代碼生成、目標代碼優化。
4. C語言代碼的頭文件與源文件有什麼區別
頭文件和源文件在本質上沒有任何區別。 只不過一般:後綴為 .h 的文件是頭文件,內含函數聲明、宏定義、結構體定義等內容。後綴為 .c 的文件是源文件,內含函數實現,變數定義等內容。而且是什麼後綴也沒有關系,只不過編譯器會默認對某些後綴的文件採取某些動作。這樣分開寫成兩個文件是一個良好的編程風格。
簡單的說其實要理解C文件與頭文件(即.h)有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程:
①預處理階段
②詞法與語法分析階段
③ 編譯階段,首先編譯成純匯編語句,再將之匯編成跟CPU相關的二進制碼,生成各 個目標文件 (.obj文件)
④連接階段,將各個目標文件中的各段代碼進行絕對地址定位,生成跟特定平台相關 的可執行文件,當然,最後還可以用obj生成純二進制碼,也就是去掉了文件格 式信 息。(生成.exe文件)
3.比方說 在aaa.h里定義了一個函數的聲明,然後在aaa.h的同一個目錄下建立aaa.c , aaa.c里定義了這個函數的實現,然後是在main函數所在.c文件里#include這個aaa.h 然後我就可以使用這個函數了。 main在運行時就會找到這個定義了這個函數的aaa.c文件。這是因為:main函數為標准C/C++的程序入口,編譯器會先找到該函數所在的文件。假定編譯程序編譯myproj.c(其中含main())時,發現它include了mylib.h(其中聲明了函數void test()),那麼此時編譯器將按照事先設定的路徑(Include路徑列表及代碼文件所在的路徑)查找與之同名的實現文件(擴展名為.cpp或.c,此例中為mylib.c),如果找到該文件,並在其中找到該函數(此例中為void test())的實現代碼,則繼續編譯;如果在指定目錄找不到實現文件,或者在該文件及後續的各include文件中未找到實現代碼,則返回一個編譯錯誤.其實include的過程完全可以「看成」是一個文件拼接的過程,將聲明和實現分別寫在頭文件及C文件中,或者將二者同時寫在頭文件中,理論上沒有本質的區別。以上是所謂動態方式。對於靜態方式,基本所有的C/C++編譯器都支持一種鏈接方式被稱為Static Link,即所謂靜態鏈接。在這種方式下,我們所要做的,就是寫出包含函數,類等等聲明的頭文件(a.h,b.h,...),以及他們對應的實現文件(a.cpp,b.cpp,...),編譯程序會將其編譯為靜態的庫文件(a.lib,b.lib,...)。在隨後的代碼重用過程中,我們只需要提供相應的頭文件(.h)和相應的庫文件(.lib),就可以使用過去的代碼了。相對動態方式而言,靜態方式的好處是實現代碼的隱蔽性,即C++中提倡的「介面對外,實現代碼不可見」。有利於庫文件的轉發.
5. 典型的編譯器可以劃分成幾個邏輯階段
這是我們今天的作業,
典型的編譯器可以劃分成七個主要的邏輯階段,分別是詞法分析器、語法分析器、語義分析器、中間代碼生成器、獨立於機器的代碼優化器、代碼生成器、依賴於機器的代碼優化器。各階段的主要功能:
(1)詞法分析器:詞法分析閱讀構成源程序的字元流,按編程語言的詞法規則把它們組成詞法記號流。
(2)語法分析器:按編程語言的語法規則檢查詞法分析輸出的記號流是否符合這些規則,並依據這些規則所體現出的該語言的各種語言構造的層次性,用各記號的第一元建成一種樹形的中間表示,這個中間表示用抽象語法的方式描繪了該記號流的語法情況。
(3)語義分析器:使用語法樹和符號表中的信息,依據語言定義來檢查源程序的語義一致性,以保證程序各部分能有意義地結合在一起。它還收集類型信息,把它們保存在符號表或語法樹中。
(4)中間代碼生成器:為源程序產生更低級的顯示中間表示,可以認為這種中間表示是一種抽象機的程序。
(5)獨立於機器的代碼優化器:試圖改進中間代碼,以便產生較好的目標代碼。通常,較好是指執行較快,但也可能是其他目標,如目標代碼較短或目標代碼執行時能耗較低。
(6)代碼生成器:取源程序的一種中間表示作為輸入並把它映射到一種目標語言。如果目標語言是機器代碼,則需要為源程序所用的變數選擇寄存器或內存單元,然後把中間指令序列翻譯為完成同樣任務的機器指令序列。
(7)依賴於機器的代碼優化器:試圖改進目標機器代碼,以便產生較好的目標機器代碼。
6. c++編譯後產生的一些文件是什麼
c++程序在編譯後,在目標路徑下會生成多個文件:
Debug文件夾(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg。
1、exe:是生成的可執行文件。
2、ilk:當選定漸增型編譯連接時,連接器自動生成ILK文件,記錄連接信息。
3、obj:是目標文件,源程序編譯後的產物。
4、pch:全稱是PreCompiled Header,就是預先編譯好的頭文件。
5、idb:文件保存的信息,使編譯器在重新編譯的時候只重編譯最新改動過的函數和只對最新類定義改動過的源文件進行重編譯,以提高編譯速度。
6、pdb:全稱是Program DataBase,即程序資料庫文件,用來記錄調試信息。
(6)編譯過程有哪6個階段擴展閱讀:
工作原理:
C++語言的程序因為要體現高性能,所以都是編譯型的。但其開發環境,為了方便測試,將調試環境做成解釋型的。即開發過程中,以解釋型的逐條語句執行方式來進行調試,以編譯型的脫離開發環境而啟動運行的方式來生成程序最終的執行代碼。
生成程序是指將源碼(C++語句)轉換成一個可以運行的應用程序的過程。如果程序的編寫是正確的,那麼通常只需按一個功能鍵,即可搞定這個過程。該過程實際上分成兩個步驟。
第一步是對程序進行編譯,這需要用到編譯器(compiler)。編譯器將C++語句轉換成機器碼(也稱為目標碼);如果這個步驟成功,下一步就是對程序進行鏈接,這需要用到鏈接器(linker)。鏈接器將編譯獲得機器碼與C++庫中的代碼進行合並。