一、 導論


第一章 導論

一、什么是編譯程序

​ 介紹程序設計語言編譯程序構造基本原理基本實現技術

翻譯程序(Translator)

​ 把某一種語言程序(稱為源語言程序)等價地轉換成另─種語言程序(稱為目標語言程序)的程序。

image-20210912214206120


編譯程序(Compiler)

​ 把某一種高級語言程序等價地轉換成另一種低級語言程序(如匯編語言或機器語言程序)的程序。

image-20210912214349393

​ 診斷編譯程序(Diagnostic Compiler)

​ 優化編譯程序(Optimizing Compiler)

​ 交叉編譯程序(Cross Compiler)

​ 可變目標編譯程序(Retargetable Compiler)


解釋程序(Interpreter)

​ 把源語言寫的源程序作為輸入,但不產生目標程序,而是邊解釋邊執行源程序

image-20210912214843970


image-20210912215031423

image-20210912215144413



二、為什么要學習編譯原理

學習目的

​ 從計算機科學與技術中學什么?

​ ◆理解計算系統

​ ◆設計計算系統

​ ◆訓練計算思維(Computational Thinking)


計算思維

image-20210912220308860

​ 計算思維是什么[J.Wing,2006]

計算思維是運用計算機科學的基礎概念去求解問題、設計系統和理解人類的行為,它包括了一系列廣泛的計算機科學的思維方法。

​ 計算思維和閱讀、寫作和算術一樣,是21世紀每個人的基本技能,而不僅僅屬於計算機科學家。

​ 計算思維在生物、物理、化學、經濟學、統計學等其他學科中的影響已經顯現。

包括一系列廣泛的計算機科學的思維方法抽象

​ ◆自動化

​ ◆問題分解

​ ◆遞歸

​ ◆權衡

​ ◆保護、冗余、容錯、糾錯和恢復

​ ◆利用啟發式推理來尋求解答

​ ◆在不確定情況下的規划、學習和調度等

關於編譯理論與技術

編譯理論與技術

​ 計算機科學與技術中理論和實踐相結合的最好典范

​ 體現了很多典型的計算思維方法

ACM圖靈獎

​ 授予在計算機技術領域作出突出貢獻的科學家

​ 程序設計語言、編譯相關的獲獎者是最多的


抽象(Abstraction)

​ 忽略一個主題中與當前問題(或目標)無關的那些方面,以便更充分地注意與當前問題(或目標)有關的方面

​ 從眾多的事物中抽取出共同的、本質性的特征,舍棄其非本質的特征

​ 是—種從個體把握一般、從現象把握本質的認知過程和思維方法

image-20210913190613313

圖靈機

​ —條無限長的紙帶一個讀寫頭

​ 一個狀態寄存器

​ 一套控制讀寫頭工作的規則

邱奇-圖靈論題(The Church-Turing thesis)

​ 所有計算或算法都可以由一台圖靈機來執行

​ 可計算=圖靈可計算


編譯原理中的"抽象"

​ 有限自動機

​ 形式文法等


自動化(Automation)

​ 將抽象思維的結果在計算機上實現,是一個將計算思維成果物化的過程,也是將理論成果應用於技術的實踐

​ 自動化的思維方法不僅體現在編譯程序本身的工作機制上,更體現在了編譯程序的生成工具的研究和設計上

編譯原理中的"自動化:

​ 有限自動機

​ 預測分析程序

​ 算符優先分析

​ LR分析等


分解(Decomposition)

​ 將大規模的復雜問題分解成若干個較小規模的、更簡單的問題加以解決

​ 對問題本身進行明確描述,並對問題解法作出全局性決策

​ 把問題分解成相對獨立的子問題

​ 再以同樣的方式對每個子問題進—步分解,直到獲得對問題的明確的解答

image-20210913191526652

編譯原理中的"問題分解":

​ 編譯程序引入中間語言

​ 編譯分成多個階段

​ 分析過程分成多遍


遞歸(Recursion)

​ 問題的解決依賴於類似問題的解決,只不過后者的復雜程度或規模較原來的問題更小

​ —旦將問題的復雜程度和規模化簡到足夠小時,問題的解法其實非常簡單

編譯原理中的"遞歸":

​ 遞歸下降分析

​ 基於樹遍歷的屬性計算

​ 語法制導翻譯等


權衡(折衷,Tradeoff )

​ 理論可實現vs.實際可實現

​ 理論研究重在探尋問題求解的方法,對於理論成果的研究運用又需要在能力和運用中作出權衡

編譯原理中的"權衡":

​ 用上下文無關文法來描述和處理高級程序設計語言

​ 優化措施的選擇等


學習編譯原理的意義

學習編譯程序構造原理,技術

​ ◆提高對計算機系統總體認識

​ ◆感悟計算思維

​ ◆更好地理解“計算”

更好地理解高級語言

運用編譯原理和方法構造實用工具

​ ◆用“計算”的眼光看世界

​ ◆用計算解決實際問題



三、編譯過程

​ 編譯程序是怎樣把高級語言(如C++)翻譯成低級語言(如機器指令)的?

​ The compiler can translate a program from source language to target language.

​ 編譯程序能夠把一個程序從源語言翻譯成目標語言。

把英文翻譯為中文 編譯程序工作的五個階段

​ ◆識別出句子中的一個個單詞 詞法分析

​ ◆分析句子的語法結構 語法分析

​ ◆根據句子的含義進行初步翻譯 中間代碼產生

​ ◆對譯文進行修飾 優化

​ ◆寫出最后的譯文 目標代碼產生


詞法分析

​ 任務:輸入源程序,對構成源程序的字符串進行掃描和分解,識別出單詞符號

​ 依循的原則:構詞規則

​ 描述工具:有限自動機

image-20210913195418981


語法分析

​ 任務:在詞法分析的基礎上,根據語法規則把單詞符號串分解成各類語法單位(語法范疇)

​ 依循的原則:語法規則

​ 描述工具:上下文無關文法

image-20210913195712475


中間代碼產生

​ 任務:對各類語法單位按語言的語義進行初步翻譯

​ 依循的原則:語義規則

​ 描述工具:屬性文法

​ 中間代碼︰三元式,四元式,樹,...

image-20210913200043615


優化

​ 任務:對前階段產生的中間代碼進行加工變換,以期在最后階段產生更高效的目標代碼

​ 依循的原則:程序的等價變換規則

image-20210913200503249

(400次加法,200次乘法)

image-20210913200340046

(301次加法)


目標代碼生成

​ 任務:把中間代碼變換成特定機器上的目標代碼

​ 依賴於硬件系統結構和機器指令的含義

​ 目標代碼三種形式:

​ ◆匯編指令代碼:需要進行匯編

​ ◆絕對指令代碼:可直接運行

​ ◆可重新定位指令代碼:需要鏈接

image-20210913201023142



四、編譯程序的結構

一、編譯程序總框

image-20210913202421340


出錯處理

出錯處理程序

​ 發現源程序中的錯誤,把有關錯誤信息報告給用戶

語法錯誤

​ 源程序中不符合語法(或詞法)規則的錯誤

​ 非法字符、括號不匹配、缺少;、...

語義錯誤

​ 源程序中不符合語義規則的錯誤

​ 說明錯誤、作用域錯誤、類型不一致、...


二、遍(pass)

​ 所謂"遍",就是對源程序或源程序的中間表示從頭到尾掃描一次

​ 階段與遍是不同的概念

​ ◆—遍可以由若干段組成

​ ◆一個階段也可以分若干遍來完成


三、編譯前端與后端

image-20210913202908651

編譯前端

​ 與源語言有關,如詞法分析,語法分析,語義分析與中間代碼產生,與機器無關的優化

編譯后端

​ 與目標機有關,與目標機有關的優化,目標代碼產生

帶來的好處

​ 程序邏輯結構清晰

​ 優化更充分,有利於移植

計算思維

​ 分解、權衡

image-20210913203209943



五、編譯程序的生成

以機器語言和匯編語言為工具

​ 優點:可以針對具體的機器,充分發揮計算機的系統功能;生成的程序效率高

​ 缺點:程序雅讀、難寫、易出錯、難維護、生產效率低


高級語言書寫

image-20210913210738616

​ 利用已有的某種語言的編譯程序實現另一語言的編譯程序

Screenshot_1


移植方法

​ 把一種機器上的編譯程序移植到另一種機器上

Screenshot_2


自編譯方式

image-20210913211505188

編譯程序自動產生

​ 編譯程序-編譯程序,編譯程序產生器,編譯程序書寫系統

​ LEX:詞法分析程序產生器

​ YACC:語法分析程序產生器

image-20210913211647075


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM