一、什么是編譯程序
一個編譯程序就是一個語言翻譯程序。語言翻譯程序把一種語言(稱作源語言)書寫的程序翻譯成另一種語言(稱作目標程序)的等價程序。
高級語言程序 ------> 編譯程序 -------> 低級語言程序(目標程序)
高級語言程序的處理過程
需預處理的源程序-------->預處理程序(文件合並、文件包含、宏處理、條件編譯)----->編譯程序---->目標匯編代碼-->匯編程序-->可再裝配的機器代碼
------>可在裝配的目標文件(裝配/鏈接-編譯程序)--->絕對的機器代碼
二、編譯過程和編譯程序的結構
編譯過程可划分為 詞法分析、語法分析、語義分析、中間代碼生成、代碼優化和目標代碼生成 六個階段。
1.詞法分析
詞法分析是編譯過程的第一個階段。這個階段的任務是從左到右一個字符一個字符的讀入源程序,對構成源程序的字符流進行掃描和分解,從而識別出一個個
單詞(也稱單詞符號或符號)。這里所謂的單詞是指邏輯上緊密相連的一組字符,這些字符具有集體含義。比如標識符是由字母字符開頭,后跟字母、數字字符的字符序列組成一種單詞。保留字(關鍵字或基本字)是一種單詞,此外還有算符、界符等。
源程序------>單詞特別序列,把注釋、換行等直接忽略
2.語法分析
語法分析是編譯過程的第二個階段,語法分析的任務是在詞法分析的基礎上講單詞序列分解成各類語法短語,如“”“程序”“”“語句”“”“表達式”等。一般這種語法短語,也稱為語法單位,可表示成語法樹。
單詞序列---->語法短語(語法樹)
語法分析所依據的是語言的語法規則,即描述程序結構的規則,通過語法分析確定整個輸入串是否構成一個語法上正確的程序。程序的機構通常由遞歸規則表示的。
可用以下規則來定義表達式:
(1)任何標識符都是表達式。
(2)任何常數(整常數、實常數)是表達式。
(3)若表達式1和表達式2都是表達式,那么
表達式1 + 表達式2
表達式1 * 表達式2
(表達式1)
都是表達式1
類似的,語句也可以遞歸的定義,如
(1)標識符 := 表達式 是語句
(2)while(表達式) do 語句 和
if (表達式) then 語句 else 語句
都是語句。
3.語義分析
語義分析是審查源程序有無錯誤。為代碼生成階段收集類型信息。比如語義分析的一個工作是進行類型審查,審查每個算符是否具有語言規范允許的運算對象,當不符合語言規范時,編譯程序應報告錯誤。
功能:類型是否匹配,數組下標有無越界,變量是否定義
4.中間代碼生成
在進行了上述的語法分析和語義分析階段的工作之后,有的編譯程序將源程序變成一種內部表示形式,這種內部表示形式叫做中間語言或中間代碼。所謂“中間代碼生成式”是一種結構簡單。含義明確的記號系統,這種記號系統可以設計為多種多樣的形式,重要的設計原則分為兩點:一是容易生成;而是容易將它翻譯成目標代碼。很多編譯程序采用了一種近似“三地址指令”和“四元式”中間代碼,這種四元式的形式為(運算符,運算對象1,運算對算2,結果)。
5.代碼優化
在此階段的任務是對前階段產生的中間代碼進行變換或者進行改造,目的是使生成的目標代碼更為高效,即省時間和省空間、
6.目標代碼生成
這一階段的任務是把中間代碼變換成特定機器上的絕對指令代碼或可或可重定位的指令代碼或匯編指令代碼。這個階段的工作很復雜,涉及到硬件系統功能部件的運用、機器指令的選擇、各種數據類型變量的存儲空間以及寄存器和后續緩存寄存器的調度等。
中間代碼----->匯編代碼
三、編譯程序和解釋程序的區別
解釋程序不產生目標程序,寫一句執行一句,解釋程序一般是把源程序一個語句一個語句的進行語法分析,轉換成一種內部表示形式,存放在源程序區。
拓展:動態語言和靜態語言
靜態類型語言是指在編譯時變量的數據類型即可確定的語言,多數靜態類型語言要求在使用變量之前必須聲明數據類型,某些具有類型推導能力的現代語言可能能夠部分減輕這個要求. 動態類型語言是在運行時確定數據類型的語言。變量使用之前不需要類型聲明,通常變量的類型是被賦值的那個值的類型。