第一章 導論
一、什么是編譯程序
介紹程序設計語言編譯程序構造的基本原理和基本實現技術。
翻譯程序(Translator)
把某一種語言程序(稱為源語言程序)等價地轉換成另─種語言程序(稱為目標語言程序)的程序。
編譯程序(Compiler)
把某一種高級語言程序等價地轉換成另一種低級語言程序(如匯編語言或機器語言程序)的程序。
診斷編譯程序(Diagnostic Compiler)
優化編譯程序(Optimizing Compiler)
交叉編譯程序(Cross Compiler)
可變目標編譯程序(Retargetable Compiler)
解釋程序(Interpreter)
把源語言寫的源程序作為輸入,但不產生目標程序,而是邊解釋邊執行源程序
二、為什么要學習編譯原理
學習目的
從計算機科學與技術中學什么?
◆理解計算系統
◆設計計算系統
◆訓練計算思維(Computational Thinking)
計算思維
計算思維是什么[J.Wing,2006]
計算思維是運用計算機科學的基礎概念去求解問題、設計系統和理解人類的行為,它包括了一系列廣泛的計算機科學的思維方法。
計算思維和閱讀、寫作和算術一樣,是21世紀每個人的基本技能,而不僅僅屬於計算機科學家。
計算思維在生物、物理、化學、經濟學、統計學等其他學科中的影響已經顯現。
包括一系列廣泛的計算機科學的思維方法抽象
◆自動化
◆問題分解
◆遞歸
◆權衡
◆保護、冗余、容錯、糾錯和恢復
◆利用啟發式推理來尋求解答
◆在不確定情況下的規划、學習和調度等
關於編譯理論與技術
編譯理論與技術
計算機科學與技術中理論和實踐相結合的最好典范
體現了很多典型的計算思維方法
ACM圖靈獎
授予在計算機技術領域作出突出貢獻的科學家
程序設計語言、編譯相關的獲獎者是最多的
抽象(Abstraction)
忽略一個主題中與當前問題(或目標)無關的那些方面,以便更充分地注意與當前問題(或目標)有關的方面
從眾多的事物中抽取出共同的、本質性的特征,舍棄其非本質的特征
是—種從個體把握一般、從現象把握本質的認知過程和思維方法
圖靈機
—條無限長的紙帶一個讀寫頭
一個狀態寄存器
一套控制讀寫頭工作的規則
邱奇-圖靈論題(The Church-Turing thesis)
所有計算或算法都可以由一台圖靈機來執行
可計算=圖靈可計算
編譯原理中的"抽象"
有限自動機
形式文法等
自動化(Automation)
將抽象思維的結果在計算機上實現,是一個將計算思維成果物化的過程,也是將理論成果應用於技術的實踐
自動化的思維方法不僅體現在編譯程序本身的工作機制上,更體現在了編譯程序的生成工具的研究和設計上
編譯原理中的"自動化:
有限自動機
預測分析程序
算符優先分析
LR分析等
分解(Decomposition)
將大規模的復雜問題分解成若干個較小規模的、更簡單的問題加以解決
對問題本身進行明確描述,並對問題解法作出全局性決策
把問題分解成相對獨立的子問題
再以同樣的方式對每個子問題進—步分解,直到獲得對問題的明確的解答
編譯原理中的"問題分解":
編譯程序引入中間語言
編譯分成多個階段
分析過程分成多遍
遞歸(Recursion)
問題的解決依賴於類似問題的解決,只不過后者的復雜程度或規模較原來的問題更小
—旦將問題的復雜程度和規模化簡到足夠小時,問題的解法其實非常簡單
編譯原理中的"遞歸":
遞歸下降分析
基於樹遍歷的屬性計算
語法制導翻譯等
權衡(折衷,Tradeoff )
理論可實現vs.實際可實現
理論研究重在探尋問題求解的方法,對於理論成果的研究運用又需要在能力和運用中作出權衡
編譯原理中的"權衡":
用上下文無關文法來描述和處理高級程序設計語言
優化措施的選擇等
學習編譯原理的意義
學習編譯程序構造原理,技術
◆提高對計算機系統總體認識
◆感悟計算思維
◆更好地理解“計算”
更好地理解高級語言
運用編譯原理和方法構造實用工具
◆用“計算”的眼光看世界
◆用計算解決實際問題
三、編譯過程
編譯程序是怎樣把高級語言(如C++)翻譯成低級語言(如機器指令)的?
The compiler can translate a program from source language to target language.
編譯程序能夠把一個程序從源語言翻譯成目標語言。
把英文翻譯為中文 編譯程序工作的五個階段
◆識別出句子中的一個個單詞 詞法分析
◆分析句子的語法結構 語法分析
◆根據句子的含義進行初步翻譯 中間代碼產生
◆對譯文進行修飾 優化
◆寫出最后的譯文 目標代碼產生
詞法分析
任務:輸入源程序,對構成源程序的字符串進行掃描和分解,識別出單詞符號
依循的原則:構詞規則
描述工具:有限自動機
語法分析
任務:在詞法分析的基礎上,根據語法規則把單詞符號串分解成各類語法單位(語法范疇)
依循的原則:語法規則
描述工具:上下文無關文法
中間代碼產生
任務:對各類語法單位按語言的語義進行初步翻譯
依循的原則:語義規則
描述工具:屬性文法
中間代碼︰三元式,四元式,樹,...
優化
任務:對前階段產生的中間代碼進行加工變換,以期在最后階段產生更高效的目標代碼
依循的原則:程序的等價變換規則
(400次加法,200次乘法)
(301次加法)
目標代碼生成
任務:把中間代碼變換成特定機器上的目標代碼
依賴於硬件系統結構和機器指令的含義
目標代碼三種形式:
◆匯編指令代碼:需要進行匯編
◆絕對指令代碼:可直接運行
◆可重新定位指令代碼:需要鏈接
四、編譯程序的結構
一、編譯程序總框
出錯處理
出錯處理程序
發現源程序中的錯誤,把有關錯誤信息報告給用戶
語法錯誤
源程序中不符合語法(或詞法)規則的錯誤
非法字符、括號不匹配、缺少;、...
語義錯誤
源程序中不符合語義規則的錯誤
說明錯誤、作用域錯誤、類型不一致、...
二、遍(pass)
所謂"遍",就是對源程序或源程序的中間表示從頭到尾掃描一次
階段與遍是不同的概念
◆—遍可以由若干段組成
◆一個階段也可以分若干遍來完成
三、編譯前端與后端
編譯前端
與源語言有關,如詞法分析,語法分析,語義分析與中間代碼產生,與機器無關的優化
編譯后端
與目標機有關,與目標機有關的優化,目標代碼產生
帶來的好處
程序邏輯結構清晰
優化更充分,有利於移植
計算思維
分解、權衡
五、編譯程序的生成
以機器語言和匯編語言為工具
優點:可以針對具體的機器,充分發揮計算機的系統功能;生成的程序效率高
缺點:程序雅讀、難寫、易出錯、難維護、生產效率低
高級語言書寫
利用已有的某種語言的編譯程序實現另一語言的編譯程序
移植方法
把一種機器上的編譯程序移植到另一種機器上
自編譯方式
編譯程序自動產生
編譯程序-編譯程序,編譯程序產生器,編譯程序書寫系統
LEX:詞法分析程序產生器
YACC:語法分析程序產生器