編譯原理(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代碼實現)

浙公網安備 33010602011771號