電腦編譯器的基本過程
編譯器是將進階語言的來源程式翻譯成與之等價的目標程式(組合語言或機器語言)
1:詞法分析
詞法分析的任務就是把來源程式構成的字串轉換成單詞序號序列.如:標識符,常數,關鍵字,運算子,分界符等.
詞法分析用到有限自動機的方法去處理.
有限狀態自動機所接受的語言就是正規語言.使用正規表示是表達.
2:文法分析
文法分析的任務就是在詞法分析的基礎上,根據語言的規則將單詞符號的序列轉換成各類文法單位,如"運算式","語句","程式"等.文法規則就是各類文法單位構成的規則,通過分析確定輸入串是否構成一個文法上正確的程式.如果來源程式沒有錯誤,就構造其文法樹,否則指出語法錯誤,給出診斷資訊.
文法分析用到下推自動機處理.
下推自動機除了有限狀態自動機以外,還包括一個長度不受限制的棧.下推自動機把有限狀態自動機擴充為可以存取一個棧.
下推自動機定義:
下推自動機 M 是如下的一個七元組 ( Q, Σ, Γ, δ, q0, Z0,F ) ,其中:
*Q 是一個有窮狀態集合;
* Σ 是一個字母表,稱為輸入字母表。
* Γ 是一個字母表,稱為棧字母表。
*q0 屬於 Q ,是初始狀態。
* Z0 屬於 Γ ,是一個特殊的棧符號,稱為棧起始符號。
*F 包含於 Q ,是終結狀態集合。
* δ : Q×(Σ∪{ε})×Γ -> Q×Γ* 是 M 的動作函數。
3:語義分析階段
主要檢查程式是否包含語義錯誤,並收集類型資訊供後面代碼產生階段使用.主要進行類型分析檢查.比如整除只能對整數資料進行.
4:中間代碼產生
雖然編譯器可以直接把一個來源程式翻譯成目標程式,但是很多編譯系統的設計中採取獨立與機器的代碼過度.便於編譯系統的建立和移植,最佳化.常見代碼有:文法樹,尾碼式,三地址代碼.
尾碼式就是運算式的尾碼運算式.也叫逆波蘭式.
三地址式就四元式.
5:代碼最佳化
中間代碼在時間和空間上往往有很大的浪費.當需要產生高效的目標代碼時,就需要最佳化.最佳化往往在中間代碼最佳化,對程式的控制流程和資料流進行最佳化.
6:目標代碼產生
將中間代碼變成機器指令代碼,或彙編指令代碼.
7:符號表管理
符號表的作用是記錄目標程式中的符號必要資訊,以輔助語義的正確性檢查和代碼產生,在編譯過程需要對符號表進行快速的尋找,插入,刪除,修改操作.可以在詞法分析階段開始,可以放放到文法分析和語義分析階段.
一直延續到目標代碼產生
8:出錯處理
錯誤分類:
靜態錯誤:是編譯階段發現的程式錯誤,分為語法錯誤,和靜態語義錯誤.如單詞拼字錯誤,標點符號錯誤,運算式缺少操作符等.
動態錯誤:又指動態語義錯誤,邏輯錯誤.發生在運行階段,例如數組下標越界等.
編譯器發現錯誤後,採取適當策略修複它們,時的分析錯誤繼續下去,以便找出更多錯誤.