查ICP網:全新的綜合網站備案信息查詢網
Copyright ? 2008-2028 www.mshuangcha.com [ 查icp] All Rights Reserved.
編譯過程中分哪幾個階段?
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;中間代碼生成;代碼優(yōu)化;目標代碼生成。
編譯程序一般分為詞法分析、語法分析、語義分析與中間代碼產生、代碼優(yōu)化、目標代碼生成程序5個階段:
下面是對編譯過程的五個階段的詳解
對于編譯程序的工作,從輸入源程序開始到輸出目標程序為止的整個過程,是非常復雜的。但就其過程而言,它與人們進行自然語言直接的翻譯有許多相近之處。當我們把一種文字翻譯為另一種文字,例如把一段英文翻譯為中文時,通常需要經以下列幾個步驟:
(1)先要識別出句子中的一個個單詞;
(2)分析句子的語法結構;
(3)根據句子的含義進行初步翻譯;
(4)對譯文進行修飾;
(5)寫出最后的譯文。
類似地,我們可以把編譯程序的工作過程劃分為五個階段:詞法分析、語法分析、語義分析與中間代碼產生、優(yōu)化和目標代碼生成。
第一階段:詞法分析
詞法分析的任務是:輸入源程序,對構成源程序的字符串進行掃描和分解,識別出一個個的單詞(亦稱單詞符號或簡稱符號),如基本字(begin、end、if、for、while),標識符、常數、運算符和界符(標點符號、左右括號)。
單詞符號是語言的基本組成成分,是人們理解和編寫程序的基本要素。識別和理解這些要素無疑也是翻譯的基礎。如同將英文翻譯成中文的情形一樣,如果你對英語單詞不理解,那就談不上進行正確的翻譯。在詞法分析階段的工作中所依循的是語言的詞法規(guī)則(或稱構詞規(guī)則)。描述詞法規(guī)則的有效工具是正規(guī)式和有效自動機。
第二階段:語法分析
語法分析的任務是:在詞法分析的基礎上,根據語言的語法規(guī)則,把單詞符號串分解成各類語法單位(語法范疇),如“短語”、“句子”、“程序段”和“程序”等。通過語法分析,確定整個輸入串是否構成語法上正確的“程序”。語法分析所依循的是語言的語法規(guī)則。語法規(guī)則通常用上下文無關文法描述。詞法分析是一種線性分析,而語法分析是一種層次結構分析。例如:Z= X + 0168*Y;代表一個“賦值語句”,而其中的代表X + 0168*Y一個“算術表達式”。因而,語法分析的任務就是識別X + 0.618 * Y為算術表達式,同時,十倍上述整個符號串屬于賦值語句這個范疇。
第三階段:語義分析與中間代碼產生
這一階段的任務是:對語法分析所識別出的各類語法范疇,分析其含義,并進行初步翻譯(產生中間代碼)。這一階段通常包含兩個方面的工作。首先,對每種語法范疇進行語義i安插,例如,變量是否定義、類型是否正確等等。如果語義正確,則進行另一方面工作,即進行中間代碼的解釋。
這一階段所依循的是語言的語義規(guī)則。通常使用屬性文法描述語義規(guī)則。“翻譯”僅僅在這里才開始涉及到。所謂“中間代碼”是一種含義明確、便于處理的記號系統(tǒng),它通常獨立于具體的硬件。這種記號系統(tǒng)或者與現代計算機的指令形式有某種程度的接近,或者能夠比較容易地把它變換成現代計算機的機器指令。
例如,許多編譯程序采用了一種與“三地址指令”非常近似的“四元式”作為中間代碼。它的意義是:對“左右操作數”進行某種運(由“算符”指明),把運算所得的值作為“結果”保留下來。在采用四元式作為中間代碼的情形下,中間代碼產生的任務就是按語言的語法規(guī)則把各類范疇翻譯成四元式序列。
一般而言,中間代碼是一種獨立于具體硬件的記號系統(tǒng)。常用的中間大媽,除了四元式之外,還有三元式、間接三元式、逆波蘭記號和樹形表示等等。
第四階段:代碼優(yōu)化
優(yōu)化的任務在于對前段產生的中間代碼進行加工變換,以期在最后階段能產生出更為高效(省時間和空間)的目標代碼。優(yōu)化的主要方面有:公關子表達式的提取、循環(huán)優(yōu)化、刪除無用代碼等等。有時,為了便于“并行運算”,還可以對代碼進行并行化處理。優(yōu)化所依循的原則是程序的等價變換規(guī)則。
第五階段:目標代碼生成程序
這一階段的任務是:把中間代碼(或經優(yōu)化處理之后)變換成特定機器上的低級語言代碼。這階段實現了最后的翻譯,它的工作有賴于硬件系統(tǒng)結構和機器指令含義。這階段工作非常復雜,設計到硬件系統(tǒng)功能部件的運用,機器指令的選擇,各種數據類型變量的存儲空間分配,以及寄存器和后援寄存器的調度,等等。
目標代碼的形式可以是絕對指令代碼或可重定位的指令代碼或匯編指令代碼。如目標代碼是絕對指令代碼,則這種目標代碼可立即執(zhí)行。如果目標代碼是匯編指令代碼,則需匯編器匯編之后才行運行。必須指出,現在多數實用編譯程序所產生的目標代碼都是一種可重定位的指令代碼。這種目標代碼在運行前必須借助于一個連接裝配程序把各個目標模塊(包括系統(tǒng)提供的庫函數)連接在一起,確定程序變量(或常數)在主存中的位置,裝入內存中指定的起始地址,使之成為一個可以運行的絕對指令代碼程序。