編譯原理(1)總結
本科是網路工程,由於沒有學<<編譯原理>>這門課,打算兩個月把國科大的編譯原理梳理完,把其中我認為的精髓概括一下,三天一篇,作為筆記。
一、什麼是編譯程式
為了了解什麼是編譯程式,首先了解下翻譯程式是什麼:
把某一種語言程式(稱為源語言程式)等價地轉換為另一種語言程式(目標語言程式)的程式。
而編譯程式就是一種翻譯程式。它把某一種高級語言程式等價轉換為另一種低級語言程式(如彙編語言或機器語言)的程式。
編譯程式還有以下分類:
- 診斷編譯程式(Diagnostic Complier,幫助程式設計師排錯)
- 優化編譯程式(Optimizing Complier,提高目標程式碼執行效率)
- 交叉編譯程式(Cross Complier)
兩個概念:
- 宿主機(運行編譯程式的機器)
- 目標機(運行目標源程式的機器)
一般來說,宿主機和目標機是同一類型機器,如果不同,則叫做交叉編譯程式,如在Windwos交叉編譯可在Linux上運行的程式。
- 可變目標編譯程式(Retargetable Complier)
還有一種翻譯程式——解釋程式(Interpreter),即把源語言的源程式作為輸入,但不產生目標程式,而是邊解釋邊執行源程式。
二、為什麼要學習編譯原理
- 理解計算系統
- 設計計算系統
- 訓練計算思維
- 抽象
- 自動化
- 問題分解
- 遞歸
- 權衡
- 保護、冗餘、容錯、糾錯和恢復
- 利用啟發式推理來尋求解答
- 在不確定情況下的規劃、學習和調度
- ……
三、編譯過程
編譯程式是怎樣把高級語言(如C++)翻譯成低級語言的(如機器指令)的?
The complier can translate a program from source language to target language.
以把英文翻譯為中文為例。
- 識別出句子中的單詞——詞法分析
- 分析句子的結構——語法分析
- 根據句子的含義進行初步翻譯——中間程式碼產生
- 對譯文進行修飾——優化
- 寫出最後的譯文——目標程式碼產生
1. 詞法分析
任務:對源程式字元串進行掃描和分解,識別出單詞符號。
原則:構詞規則
工具:有限自動機
2. 語法分析
任務:在詞法分析的基礎上,根據語法規則把單詞符號分解成各類語法單位(語法範疇)
原則:語法規則
工具:上下文無關文法
3. 中間程式碼產生
任務:對各類語法單位按語言的 語義進行初步翻譯。
原則:語義規則
工具:屬性文法
中間程式碼:三元式、四元式、樹…
4. 優化
任務:對前階段產生的中間程式碼進行加工變換,以期在最後階段產生更高效的目標程式碼。
原則:等價變換規則
4. 目標程式碼產生
任務:把中間程式碼變換成特定機器上的目標程式碼。
原則:依賴於硬體系統結構和機器中指令的具體含義
目標程式碼三種形式
- 彙編指定程式碼:需要進行彙編
- 絕對指定程式碼:可直接運行
- 可重定位指令程式碼:需要鏈接
四、編譯程式的結構
五、編譯程式的開發
1. 使用機器語言
優點:可針對具體機器,充分發揮電腦的系統功能(使用某些特殊指令)、生成的程式效率高。
缺點:可讀性極差、可維護性極低、開發效率極低、可移植性極低。
2.使用彙編語言
優點:機器指令語義化,有一定可讀性。可針對具體機器,充分發揮電腦的系統功能(使用某些特殊指令)、生成的程式效率高。
缺點:需要相應彙編器,可讀性差、可維護性低、開發效率低、可移植性低。
3.使用高級語言
如果已存在某種高級語言(如C++,已存在C++的編譯器和彙編器)。現假設新語言為S,目標語言為T,實現語言為I,那麼,可以利用現有的I語言為編程工具,編寫從S語言到T語言的編譯器,這樣,一種新的語言S就產生了。因此,高級語言的產生過程最開始一定是由機器語言迭代產生的。
優點:程式易讀、易理解、易維護、編碼效率高。
缺點:不能精準控制目標程式碼的生成,目標程式碼執行效率可能不高,可通過插入目標程式碼方式解決。(如在C/C++中通過內聯彙編實現,C#通過EMIT寫IL程式碼實現)