編譯過程的五個階段

編譯程序的工作,從輸入源程序開始到輸出目標程序為止的整個過程,是非常複雜的。但就其過程而言,它與人們進行自然語言直接的翻譯有許多相近之處。當我們把一種文字翻譯為另一種文字,例如把一段英文翻譯為中文時,通常需經下列步驟:

(1)識別出句子中的一個個單詞;

(2)分析句子的語法結構;

(3)根據句子的含義進行初步翻譯;

(4)對譯文進行修飾;

(5)寫出最後的譯文。

類似地,編譯程序的工作過程一般也可以劃分為五個階段:詞法分析、語法分析、語義分析與中間代碼產生、優化、目標代碼生成。

第一階段:詞法分析

詞法分析的任務是:輸入源程序,對構成源程序的字符串進行掃描和分解,識別出一個個的單詞(亦稱單詞符號或簡稱符號),如基本字(begin、end、if、for、while),標識符、常數、運算符和界符(標點符號、左右括號)。

單詞符號是語言的基本組成成分,是人們理解和編寫程序的基本要素。識別和理解這些要素無疑也是翻譯的基礎。如同將英文翻譯成中文的情形一樣,如果你對英語單詞不理解,那就談不上進行正確的翻譯。在詞法分析階段的工作中所依循的是語言的詞法規則(或稱構詞規則)。描述詞法規則的有效工具是正規式和有效自動機。

第二階段:語法分析

語法分析的任務是:在詞法分析的基礎上,根據語言的語法規則,把單詞符號串分解成各類語法單位(語法範疇),如“短語”、“句子”、“程序段”和“程序”等。通過語法分析,確定整個輸入串是否構成語法上正確的“程序”。語法分析所依循的是語言的語法規則。語法規則通常用上下文無關文法描述。詞法分析是一種線性分析,而語法分析是一種層次結構分析。例如:

Z = X + 0.618 * Y;

代表一個“賦值語句”,而其中的X + 0.618 * Y 代表一個“算術表達式”。因而,語法分析的任務就是識別X + 0.618 * Y為算術表達式,同時,十倍上述整個符號串屬於賦值語句這個範疇。

第三階段:詞義分析與中間代碼產生

這一階段的任務是:對語法分析所識別出的各類語法範疇,分析其含義,並進行初步翻譯(產生中間代碼)。這一階段通常包含兩個方面的工作。首先,對每種語法範疇進行語義i安插,例如,變量是否定義、類型是否正確等等。如果語義正確,則進行另一方面工作,即進行中間代碼的解釋。這一階段所依循的是語言的語義規則。通常使用屬性文法描述語義規則。

“翻譯”僅僅在這裡才開始涉及到。所謂“中間代碼”是一種含義明確、便於處理的記號系統,它通常獨立於具體的硬件。這種記號系統或者與現代計算機的指令形式有某種程度的接近,或者能夠比較容易地把它變換成現代計算機的機器指令。例如,許多編譯程序採用了一種與“三地址指令”非常近似的“四元式”作為中間代碼。這種寺院是的形式是:

算符左操作數右操作數結果

它的意義是:對“左右操作數”進行某種運算(由“算符”指明),把運算所得的值作為“結果”保留下來。在採用四元式作為中間代碼的情形下,中間代碼產生的任務就是按語言的語法規則把各類範疇翻譯成四元式序列。例如,下面的賦值語句

Z = (X + 0.418) * Y / W;

可被翻譯為如下的四元式序列:

編譯過程的五個階段

其中,T1和T2是編譯期間引進的臨時工作變量;第一個四元式意味著把X的值加上0.418存放在T1中;第二個四元式值將T1的值和Y的值相乘存於T2中;第三個四元式指將T2的值除以Y的值留結果於Z中。

一般而言,中間代碼是一種獨立於具體硬件的記號系統。常用的中間大媽,除了四元式之外,還有三元式、間接三元式、逆波蘭記號和樹形表示等等。

第四階段:優化

優化的任務在於對前段產生的中間代碼進行加工變換,以期在最後階段能產生出更為高效(省時間和空間)的目標代碼。優化的主要方面有:公關子表達式的提取、循環優化、刪除無用代碼等等。有時,為了便於“並行運算”,還可以對代碼進行並行化處理。優化所依循的原則是程序的等價變換規則。

第五階段:目標代碼生成

這一階段的任務是:把中間代碼(或經優化處理之後)變換成特定機器上的低級語言代碼。這階段實現了最後的翻譯,它的工作有賴於硬件系統結構和機器指令含義。這階段工作非常複雜,設計到硬件系統功能部件的運用,機器指令的選擇,各種數據類型變量的存儲空間分配,以及寄存器和後援寄存器的調度,等等。

目標代碼的形式可以是絕對指令代碼或可重定位的指令代碼或彙編指令代碼。如目標代碼是絕對指令代碼,則這種目標代碼可立即執行。如果目標代碼是彙編指令代碼,則需彙編器彙編之後才行運行。必須指出,現在多數實用編譯程序所產生的目標代碼都是一種可重定位的指令代碼。這種目標代碼在運行前必須藉助於一個連接裝配程序把各個目標模塊(包括系統提供的庫函數)連接在一起,確定程序變量(或常數)在主存中的位置,裝入內存中指定的起始地址,使之成為一個可以運行的絕對指令代碼程序。

編譯過程的五個階段


分享到:


相關文章: