編譯過程(概念)

1. 詞法分析Lexical Analysis

從左到右一個字符一個字符的讀入源程序,對構成源程序的字符串進行掃描和分解,從而識別出一個個單詞(也稱單詞符號或簡稱符號)

例如某源程序片段如下:

var
		sum, first, count :real ;    
	begin	    
		sum=  first + count * 10 ;    
end.

詞法分析階段通過對該程序片段的掃描、分解,將會把組成這段程序的字符識別爲如下單詞序列:
1.保留字 var 2.標識符 sum 3.逗號 , 4.標識符 first 5.逗號 , 6.標識符 count 7.冒號 : 8.保留字 real 9.分號 ; 10.保留字 begin 11.標識符 sum 12.賦值號 := 13.標識符 first 14.加號 + 15.標識符 count 16.乘號 * 17.整數 10 18.保留字 end 19.界符 .

我們用id1,id2和id3分別表示sum, first和count三個標識符的內部形式,那麼分析後, sum:= first + count * 10 可表示爲: id1:= id2 + id3 * 10

2. 語法分析Syntax Analysis

在詞法分析的基礎上將單詞序列分解成各類語法單位,如“表達式” ,“語句”,“分程序”,“程序” 等等,例如,上例中的賦值語句通過語法分析可用以下語法樹( Parse tree )表示出來。
在這裏插入圖片描述

3. 語義分析Syntactic Analysis

語義分析是在語法分析程序確定出語法單位後,審查有無語義錯誤,併爲代碼生成階段收集類型信息。

(1)語法分析和語義分析是以密切合作的方式工作的。
(2) 語義分析的重要工作之一是進行語義檢查,併爲代碼生成收集類型信息(類型檢查、變量是否聲明、類型是否一致、變量是否已有值等)。

4. 中間代碼生成Generation of intermediate code

完成語法分析和語義處理工作後,編譯程序將源程序變成一種內部表示形式,這種內部表示形式叫做中間語言或稱中間代碼,它是一種結構簡單、含義明確的記號系統。

例如,四元式的形式爲:
(算符,運算對象1,運算對象2,結果)
對於賦值語句:position:= initial + rate * 60
可以生成如下所示的四元式:
在這裏插入圖片描述

5. 代碼優化 Optimization of code

爲了使生成的目標代碼更爲高效,可以對產生的中間代碼進行變換或進行改造,這就是代碼的優化。
代碼優化工作可以在不同的編譯階段進行,其中對中間代碼的優化尤其重要。

對於前面提到的四元式,優化後:
在這裏插入圖片描述

6. 代碼生成 Generation of code

目標代碼生成階段的任務就是是把中間代碼變換成特定機器上的絕對指令代碼或可重定位的指令代碼或彙編指令代碼。

對於上面所述源程序:position :=initial +rate * 60對應的中間代碼可生成下面的某彙編代碼:
在這裏插入圖片描述
編譯器生成的目標程序代碼可以有多種形式:

  • 彙編語言形式
  • 可重定位二進制代碼形式
  • 內存形式

7. 符號表

主要應用於以下情況:

  • 收集符號的屬性信息
    當分析到標識符的說明部分時,收集有關標識符的屬性,並存於符號表中;
  • 作爲進行語法的合法性檢查的依據
    同一個標識符可能在程序的不同地方出現,有關符號的屬性是在不同的情況下收集的,需要檢查標識符在上下文中的一致性和合法性,而符號表正是進行這種檢查的依據;
  • 作爲目標代碼生成階段地址分配的依據
    每個變量在目標代碼生成時都需要確定其對應的存儲地址,編譯程序在完成了對變量的地址分配後,將其存於符號表中,可以通過符號表獲取每個變量對應的存儲地址。

8. 錯誤檢測

源程序中常常存在各種各樣的錯誤:即使對一個熟練的程序員來說,也很難做到一次上機就能得到預期的結果。所以,對於源程序錯誤處理的程度,是作爲衡量一個編譯程序良莠的主要標準之一。一個好的編澤程序應將源程序中的錯誤儘可能多地診察出來,如果有可能的話,對錯誤進行適當的校正。這樣就可以使程序員及時發現和改正錯誤,從而減少上機編譯的次數,以節約機時,節省費用;

錯誤檢測處理與符號表管理工作一樣,貫穿整個編譯過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章