① 一個編譯器至少包含三個部分的進程是什麼
一個典型的編譯程序通常包含8個組成部分,它們是詞法分析程序、語法分析程序、語義分析程序、中間代碼生成程序、中間代碼優化程序、目標代碼生成程序、表格管理程序和錯誤處理程序。
(1) 編譯程序:如果源語言為高級語言,目標語言為某台計算機上的匯編語言或機器語
言,則此翻譯程序稱為編譯程序。
(2) 源程序:源語言編寫的程序稱為源程序。
(3) 目標程序:目標語言書寫的程序稱為目標程序。
(4) 編譯程序的前端:它由這樣一些階段組成:這些階段的工作主要依賴於源語言而與
目標機無關。通常前端包括詞法分析、語法分析、語義分析和中間代碼生成這些階
段,某些優化工作也可在前端做,也包括與前端每個階段相關的出錯處理工作和符
號表管理等工作。
(5) 後端:指那些依賴於目標機而一般不依賴源語言,只與中間代碼有關的那些階段,
即目標代碼生成,以及相關出錯處理和符號表操作。
(6) 遍:是對源程序或其等價的中間語言程序從頭到尾掃視並完成規定任務的過程。
詞法分析程序:輸人源程序,拼單詞、檢查單詞和分析單詞,輸出單詞的機內表達形式。
語法分析程序:檢查源程序中存在的形式語法錯誤,輸出錯誤處理信息。
語義分析程序:進行語義檢查和分析語義信息,並把分析的結果保存到各類語義信息表中。
中間代碼生成程序:按照語義規則,將語法分析程序分析出的語法單位轉換成一定形式的中間語言代碼,如三元式或四元式。
中間代碼優化程序:為了產生高質量的目標代碼,對中間代碼進行等價變換處理
② 編譯程序有哪些主要構成成分它們各自的主要功能是什麼
編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。
編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。
例如,可以把詞法分析作為第一遍;語法分析和語義分析作為第二遍;代碼優化和存儲分配作為第三遍;代碼生成作為第四遍。
反之,為了適應較小的存儲空間或提高目標程序質量,也可以把一個邏輯步驟的工作分為幾遍去執行。例如,代碼優化可劃分為代碼優化准備工作和實際代碼優化兩遍進行。
(2)一個編譯程序由哪幾個階段構成擴展閱讀
從左至右逐個字元地對源程序進行掃描,產生一個個的單詞符號,把作為字元串的源程序改造成為單詞符號串的中間程序。執行詞法分析的程序稱為詞法分析程序或掃描器。
源程序中的單詞符號經掃描器分析,一般產生二元式:單詞種別;單詞自身的值。單詞種別通常用整數編碼,如果一個種別只含一個單詞符號,那麼對這個單詞符號,種別編碼就完全代表它自身的值了。若一個種別含有許多個單詞符號,那麼,對於它的每個單詞符號,除了給出種別編碼以外,還應給出自身的值。
詞法分析器一般來說有兩種方法構造:手工構造和自動生成。手工構造可使用狀態圖進行工作,自動生成使用確定的有限自動機來實現。
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。編譯程序的語法規則可用上下文無關文法來刻畫。
③ 編譯過程可分為幾個階段
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;中間代碼生成;代碼優化;目標代碼生成。
編譯程序一般分為詞法分析、語法分析、語義分析與中間代碼產生、代碼優化、目標代碼生成程序5個階段:
下面是對編譯過程的五個階段的詳解
對於編譯程序的工作,從輸入源程序開始到輸出目標程序為止的整個過程,是非常復雜的。但就其過程而言,它與人們進行自然語言直接的翻譯有許多相近之處。當我們把一種文字翻譯為另一種文字,例如把一段英文翻譯為中文時,通常需要經以下列幾個步驟:
(1)先要識別出句子中的一個個單詞;
(2)分析句子的語法結構;
(3)根據句子的含義進行初步翻譯;
(4)對譯文進行修飾;
(5)寫出最後的譯文。
類似地,我們可以把編譯程序的工作過程劃分為五個階段:詞法分析、語法分析、語義分析與中間代碼產生、優化和目標代碼生成。
第一階段:詞法分析
詞法分析的任務是:輸入源程序,對構成源程序的字元串進行掃描和分解,識別出一個個的單詞(亦稱單詞符號或簡稱符號),如基本字(begin、end、if、for、while),標識符、常數、運算符和界符(標點符號、左右括弧)。
單詞符號是語言的基本組成成分,是人們理解和編寫程序的基本要素。識別和理解這些要素無疑也是翻譯的基礎。如同將英文翻譯成中文的情形一樣,如果你對英語單詞不理解,那就談不上進行正確的翻譯。在詞法分析階段的工作中所依循的是語言的詞法規則(或稱構詞規則)。描述詞法規則的有效工具是正規式和有效自動機。
第二階段:語法分析
語法分析的任務是:在詞法分析的基礎上,根據語言的語法規則,把單詞符號串分解成各類語法單位(語法范疇),如「短語」、「句子」、「程序段」和「程序」等。通過語法分析,確定整個輸入串是否構成語法上正確的「程序」。語法分析所依循的是語言的語法規則。語法規則通常用上下文無關文法描述。詞法分析是一種線性分析,而語法分析是一種層次結構分析。例如:Z= X + 0168*Y;代表一個「賦值語句」,而其中的代表X + 0168*Y一個「算術表達式」。因而,語法分析的任務就是識別X + 0.618 * Y為算術表達式,同時,十倍上述整個符號串屬於賦值語句這個范疇。
第三階段:語義分析與中間代碼產生
這一階段的任務是:對語法分析所識別出的各類語法范疇,分析其含義,並進行初步翻譯(產生中間代碼)。這一階段通常包含兩個方面的工作。首先,對每種語法范疇進行語義i安插,例如,變數是否定義、類型是否正確等等。如果語義正確,則進行另一方面工作,即進行中間代碼的解釋。
這一階段所依循的是語言的語義規則。通常使用屬性文法描述語義規則。「翻譯」僅僅在這里才開始涉及到。所謂「中間代碼」是一種含義明確、便於處理的記號系統,它通常獨立於具體的硬體。這種記號系統或者與現代計算機的指令形式有某種程度的接近,或者能夠比較容易地把它變換成現代計算機的機器指令。
例如,許多編譯程序採用了一種與「三地址指令」非常近似的「四元式」作為中間代碼。它的意義是:對「左右操作數」進行某種運(由「算符」指明),把運算所得的值作為「結果」保留下來。在採用四元式作為中間代碼的情形下,中間代碼產生的任務就是按語言的語法規則把各類范疇翻譯成四元式序列。
一般而言,中間代碼是一種獨立於具體硬體的記號系統。常用的中間大媽,除了四元式之外,還有三元式、間接三元式、逆波蘭記號和樹形表示等等。
第四階段:代碼優化
優化的任務在於對前段產生的中間代碼進行加工變換,以期在最後階段能產生出更為高效(省時間和空間)的目標代碼。優化的主要方面有:公關子表達式的提取、循環優化、刪除無用代碼等等。有時,為了便於「並行運算」,還可以對代碼進行並行化處理。優化所依循的原則是程序的等價變換規則。
第五階段:目標代碼生成程序
這一階段的任務是:把中間代碼(或經優化處理之後)變換成特定機器上的低級語言代碼。這階段實現了最後的翻譯,它的工作有賴於硬體系統結構和機器指令含義。這階段工作非常復雜,設計到硬體系統功能部件的運用,機器指令的選擇,各種數據類型變數的存儲空間分配,以及寄存器和後援寄存器的調度,等等。
目標代碼的形式可以是絕對指令代碼或可重定位的指令代碼或匯編指令代碼。如目標代碼是絕對指令代碼,則這種目標代碼可立即執行。如果目標代碼是匯編指令代碼,則需匯編器匯編之後才行運行。必須指出,現在多數實用編譯程序所產生的目標代碼都是一種可重定位的指令代碼。這種目標代碼在運行前必須藉助於一個連接裝配程序把各個目標模塊(包括系統提供的庫函數)連接在一起,確定程序變數(或常數)在主存中的位置,裝入內存中指定的起始地址,使之成為一個可以運行的絕對指令代碼程序。
④ GCC編譯的4個階段
GCC,即GNU Compiler Collection,是GNU項目開發的一種編程語言編譯器。旨在為GNU操作系統提供一套編譯器,現已成為類Unix操作系統(包括Linux、BSD、MacOS X等)的標准編譯器,甚至在Windows系統上亦可使用。
GCC編譯過程由四個階段組成:預處理、編譯、匯編和鏈接。接下來,讓我們逐一探索。
考慮一個名為hello.c的源文件。
階段一:預處理
預處理階段主要負責處理程序中的#開頭的指令,包括頭文件、宏定義和注釋。在Linux環境下執行命令後,可以查看到生成的hello.i文件中包含了預處理後的部分。
階段二:編譯
編譯階段將C/C++源代碼轉換為匯編語言。執行Linux命令後,可看到hello.s文件內容已轉換為匯編代碼。
階段三:匯編
匯編階段將匯編語言轉化為機器可讀的二進制代碼。執行Linux命令後,hello.o文件內的內容就是匯編後的結果。
階段四:鏈接
鏈接階段將生成的hello.o文件組裝成可執行文件。在Linux環境下執行命令後,可看到程序已成功生成並列印出結果。
若想簡化整個編譯流程,只需執行單一命令即可完成上述四個階段的操作。
⑤ C編譯程序的工作過程可以劃分為哪五個階段
【答案】:C
編譯程序的工作過程一般劃分為五個階段:詞法分析、語法分析、語義分析、優化、目標代碼生成。( 1 )詞法分析:也就是從左到右一個一個的讀入源程序,識別一個單詞或符號,並進行歸類。( 2 )語法分析: 在詞法分析的基礎上,將單詞序列分解成各類語法短語,如「程序」,「語句」,「表達式」等。( 3 )語義分析:審查源程序是否有語義的錯誤,當不符合語言規范的時候,程序就會報錯。( 5 )代碼優化:這個階段是對前階段的中間代碼進行變換或改造,目的是使生成的目標代碼更為高效,即節省時間和空間。 ( 6 )目標代碼生成:也就是把優化後的中間代碼變換成指令代碼或匯編代碼。 詞法分析和語法分析本質上都是對源程序的結構進行分析。