這幾天忙着學英語,同時在學習編譯原理,對這門課很感興趣,已經制作了詞法分析器,同時還在補充這個分析器的功能,也准備着手開始寫語法分析器,看到最后能不能連在一起,我想如果能夠將整套編譯器的流程跑下來真的很棒呢,看比爾蓋茨那年齡都寫出BASIC了,真是覺得與大牛差距太大,一定要追趕~~
將前一段時間學的編譯原理重新回顧一下。也與大家分享一下學習資料。
翻譯器:能夠將一種語言轉換成另一種語言的軟件,而且后者與前者在邏輯上是等價的。
編譯與解釋的區別:
1.編譯器:工作效率高,即時間快、空間省;交互性與動態特性差、可移植性差。大多數PL采用此種方法翻譯
2.解釋器:工作效率低,即時間慢、空間費;交互性與動態特性好、可移植性好。早期的Basic和現在的Java等。
編譯的主要步驟和部分:
詞法分析 任務:輸入源程序,對構成源程序的字符串進行掃描和分解,識別出一個個的單詞。
單詞:是高級語言中有實在意義的最小語法單位,它由字符構成。
詞法分析依照詞法規則,識別出正確的單詞,轉換成統一規格,備用。
描述詞法規則的有效工具是正規式和有限自動機。
語法分析
任務:根據語言的語法規則,把單詞流組成各類語法單位,如:短語、句子、過程、程序
語法規則:語言的規則,又稱為文法;規定單詞如何構成短語、語句、過程和程序。
語法規則通常用上下文無關文法描述。
語法分析有兩種方法:
推導(Derive)和規約(Reduce)
語法分析過程也可以用一棵倒着的樹來表示,這棵樹叫做分析樹
語義分析
任務:檢查程序的語義正確性,以保證程序各部分能有意義的結合在一起,為以后的代碼生成階段收集類型信息
語義分析階段的重要工作:類型檢查
中間代碼生成
任務:根據語義規則產生一種介於源語言與目標代碼之間的一種中間代碼。
中間代碼是不依賴於機器但是又便於生成依賴於機器的目標代碼的一種結構簡單、含義明確的記號系統
中間代碼形式
逆波蘭式、 四元式、三元式
代碼優化
任務:對前面產生的中間代碼進行加工變換,以期在最后階段能產生更為高效的目標代碼。
原則:等價變換
主要方面:公共子表達式的提取、合並已知量、刪除無用語句、循環優化等。
目標代碼生成
任務:把經過優化的中間代碼轉化成特定 機器上的低級語言代碼
目標代碼的形式
絕對指令代碼:可立即執行的目標代碼。
匯編指令代碼:匯編語言程序,需要通過匯編程序匯編后才能運行。
可重定位指令代碼:先將各目標模塊連接起來,確定變量、常數在主存中的位置,裝入主存后才能成為可以運行的絕對指令代碼。
這張圖當時老師打錯了,我看的時候主要集中在代碼生成器的作用,也沒有太仔細,根據 unique~ 網友的指正,后來看后面的匯編語言才發現錯了,應該為
temp1:=id3*60.0
id1:=id2+temp1
在此表示感謝~!不過我們的老師可能是不小心打錯的,她是這方面的資深研究員,大家可以不用懷疑其他理論部分,。
符號表管理
表格作用:用來記錄源程序的各種信息以及編譯過程中的各種狀況。
與編譯前四階段有關的表格有:
符號表、常數表、標號表、分程序入口表、中間代碼表等。
符號表:用來登記源程序中的常量名、變量名、數組名、過程名等,記錄它們的性質、定義和引用情況。
錯誤診斷和報告
任務:如果源程序有錯誤,編譯程序應設法發現錯誤,並報告給用戶。
完成:由專門的出錯處理程序來完成
錯誤類型:
語法錯誤:在詞法分析和語法分析階段檢測出來。
語義錯誤:一般在語義分析階段檢測。
階段的分組
編譯前端:主要指與源語言有關,與目標語言無關的部分,通常包括詞法分析、語法分析、語義分析和中間代碼生成,與機器無關部分的代碼優化
編譯后端:指與目標機器有關的部分。如與機器有關的優化、目標代碼生成
遍:對源程序或源程序的中間結果從頭到尾掃描一次,並作有關的加工處理,生成新的中間結果或目標程序。
要在某機器上為某種語言構造一個編譯程序,必須掌握下面三個方面的內容:源語言 目標語言 編譯方法
單詞的描述機制——正規式
單詞的識別機制——有限自動機
詞法分析器
實現詞法分析的程序
詞法分析的任務:從左至右掃描源程序的字符串,按照詞法規則識別出源程序中具有獨立含義的最小語法單位——單詞。
和用戶接口的其他任務:
---濾掉注釋和(由空格、制表符等引起的)空白
---某些預加工處理
2.1.1 串和語言
首先表述一些基本 術語和概念
---符號:一個抽象實體,是語言中最基本的不可再分的單位。例如字母是符號,數字也是符號。
---字母表:符號的非空有限集合,因此字母表也稱為字符類或符號集。例:å = {0, 1}
---串:符號的有窮序列,例:00 11 10 是字母表S ={0, 1}上的符號串
---符號串的長度: 如果某符號串x中有m個符號, 則稱其長度為m,表示為|x|=m,如 001110的長度是6。
正規式:又稱正規表達式,是描述單詞構造方法的一種形式化工具,每個正規式r表示一個語言L(r),正規式表示的語言叫正規集。
二者關系:正規式定義正規集,正規集構造正規式。
正規式的等價
不同算術表達式可以表示同一個數,如3+5、5+3、2+6等均表示8。不同正規式也可以表示同一個正規集,即正規式與正規集之間是多對一的關系。
正規式等價的判定:
利用正規式的等價性可以化簡復雜的正規式。正規式的等價性判定可以采用兩種方法:
---根據定義,證明不同的正規式表示同一集合
---根據下述正規式的代數性質進行運算
狀態轉換圖
狀態轉換圖是設計詞法分析程序的一種好的途徑。
結點代表狀態,用圓圈○表示。
狀態之間用箭弧→連結,箭弧上的標記(字符)代表在射出結點(即箭弧始結點)狀態下可能出現的輸入字符或字符類。
一張轉換圖只包含有限個狀態(即有限個結點),其中一個為初態,至少一個為終態(雙圈表示)。
有 限 自 動 機(FA)
是一種識別裝置,准確識別正規集
具有離散輸入輸出系統的數學模型。這種系統具有有限數目的內部狀態,系統的當前狀態概括了過去的輸入處理的信息。系統只需要根據當前所處的狀態和面臨的輸入字符就可以決定系統后繼的行為。
有窮自動機分為兩類:
確定的有窮自動(Deterministic Finite Automata)--DFA
不確定的有窮自動機(Nondeterministic Finite Automata)--NFA
DFA的確定性表現在:
對任何狀態s ∈S,在讀入了輸入符號a ∈ Σ 之后,能夠唯一地確定下一個狀態
從狀態轉換圖來看,若字母表Σ含有n個輸入字符,那末任何一個狀態結點最多有n條弧射出,而且每條弧以一個不同的輸入字符標記。
DFA M對字符串的識別:對於Σ中的任何字符串α,若存在一條從初態結點到終態結點的通路,且這條通路上所有弧的標記符號連接成的串等於α。
若M的初態結點又是終態結點,則空字ε可為M所識別。
DFA M所能識別語言:能被DFA M所接受的字符串的集合,記為L(M).
對於任何兩個有窮自動機M和M′,如果
L(M)=L(M′),則稱M與M′是等價的.
由於有事,不能夠繼續寫,這是一,待續。后面將着重講應用以及做的一些題目,二義性、簡化、相互轉化以及程序設計實踐需要考慮的問題和代碼書寫。