編譯過程可分為5個階段:1、詞法分析階段,該階段會對構成原始程式的字串進行掃描分解,辨識出一個個的單字。 2.文法分析階段,此階段用於分析句子的語法結構。 3.語意分析與中間代碼產生階段。 4.程式碼優化階段。 5.目標程式碼生成程式階段。
本教學操作環境:windows10系統、Dell G3電腦。
編譯程式把一個原始程式翻譯成目標程式的工作過程分為五個階段:詞法分析;語法分析;中間程式碼產生;程式碼最佳化;目標程式碼生成。
編譯程式一般分為詞法分析、語法分析、語意分析與中間程式碼產生、程式碼最佳化、目標程式碼產生程式5個階段:
以下是對編譯過程的五個階段的詳解
對於編譯程式的工作,從輸入原始程式開始到輸出目標程式為止的整個過程,是非常複雜的。但就其過程而言,它與人們進行自然語言直接的翻譯有許多相似之處。當我們把一種文字翻譯為另一種文字,例如把一段英文翻譯為中文時,通常需要經以下列幾個步驟:
(1)先要辨識出句子中的一個單字;
(2)分析句子的語法結構;
(3)根據句子的意義進行初步翻譯;
(4)修飾譯文;
(5)寫出最後的譯文。
類似地,我們可以把編譯程式的工作過程分成五個階段:詞法分析、語法分析、語意分析與中間程式碼產生、最佳化和目標程式碼產生。
第一階段:詞法分析
詞法分析的任務是:輸入原始程序,對構成原始程式的字串進行掃描和分解,識別出一個個的單字(亦稱單字符號或簡稱符號),如基本字(begin、end、if、for、while),識別字、常數、運算子和界符(標點符號、左右括號)。
單字符號是語言的基本組成成分,是人們理解和編寫程式的基本要素。辨識和理解這些要素無疑也是翻譯的基礎。如同將英文翻譯成中文的情形一樣,如果你對英文單字不理解,那就談不上進行正確的翻譯。在詞法分析階段的工作中所依據的是語言的詞法規則(或稱構詞規則)。描述詞法規則的有效工具是正規式和有效自動機。
第二階段:語法分析
語法分析的任務是:在詞法分析的基礎上,根據語言的語法規則,把單字符號串分解成各類語法單位(語法範疇),如「片語」、「句子」、「程序段」和「程序」等。透過語法分析,確定整個輸入串是否構成語法上正確的「程式」。語法分析所依據的是語言的語法規則。文法規則通常用上下文無關文法來描述。詞法分析是一種線性分析,而語法分析是一種層次結構分析。例如:Z= X 0168*Y;代表一個“賦值語句”,而其中的代表X 0168*Y一個“算術表達式”。因而,語法分析的任務就是辨識X 0.618 * Y為算術表達式,同時,十倍上述整個符號字串屬於賦值語句這個範疇。
第三階段:語意分析與中間程式碼產生
這一階段的任務是:對語法分析所辨識出的各類語法範疇,分析其意義,並進行初步翻譯(產生中間代碼)。這一階段通常包含兩個面向的工作。首先,對每種語法範疇進行語意i安插,例如,變數是否定義、型別是否正確等等。如果語意正確,則進行另一方面工作,即進行中間代碼的解釋。
這一階段所依據的是語言的語意規則。通常使用屬性文法來描述語意規則。 「翻譯」就在這裡才開始涉及。所謂「中間代碼」是一種含義明確、便於處理的記號系統,它通常獨立於特定的硬體。這種記號系統或與現代電腦的指令形式有某種程度的接近,或是能夠比較容易地把它變換成現代電腦的機器指令。
例如,許多編譯程式採用了一種與「三位址指令」非常近似的「四元式」作為中間程式碼。它的意義是:對「左右操作數」進行某種運(由「算符」指明),把運算所得的值當作「結果」保留下來。在採用四元式作為中間程式碼的情況下,中間程式碼產生的任務就是依語言的語法規則把各類範疇翻譯成四元式序列。
一般而言,中間程式碼是一種獨立於特定硬體的記號系統。常用的中間大媽,除了四元式之外,還有三元式、間接三元式、逆波蘭記號和樹形表示等等。
第四階段:程式碼最佳化
優化的任務在於對前段產生的中間程式碼進行加工變換,以期在最後階段能產生出更有效率(省時間和空間)的目標碼。優化的主要面向有:公關子表達式的提取、循環優化、刪除無用程式碼等等。有時,為了便於“並行運算”,也可以將程式碼並行化處理。優化所依循的原則是程序的等價變換規則。
第五階段:目標程式碼產生程式
這一階段的任務是:把中間程式碼(或經過最佳化處理之後)轉換成特定機器上的低階語言代碼。這個階段實現了最後的翻譯,它的工作有賴於硬體系統結構和機器指令意義。這階段工作非常複雜,設計到硬體系統功能部件的運用,機器指令的選擇,各種資料類型變數的儲存空間分配,以及暫存器和後援暫存器的調度,等等。
目標程式碼的形式可以是絕對指令碼或可重定位的指令碼或組譯指令碼。如目標程式碼是絕對指令程式碼,則這種目標程式碼可立即執行。如果目標程式碼是組譯指令程式碼,則需組譯器組譯之後才行運行。必須指出,現在多數實用編譯程式所產生的目標程式碼都是一種可重定位的指令碼。這種目標程式碼在運行前必須藉助於一個連接組裝程式把各個目標模組(包括系統提供的函式庫函數)連接在一起,確定程式變數(或常數)在主記憶體中的位置,裝入記憶體中指定的起始位址,使之成為一個可以運行的絕對指令碼程式。
更多程式相關知識,請造訪:程式設計影片! !
以上是編譯過程可分為幾個階段的詳細內容。更多資訊請關注PHP中文網其他相關文章!