編譯原理:引言
阿新 • • 發佈:2018-12-09
編譯器的概述
- 編譯器是一個程式
- 核心功能是把原始碼翻譯成目的碼
- 原始碼:
- C/C++, Java, C#, html, …
- 目的碼:
- x86, IA64, ARM, MIPS, …
編譯器的結構
編譯器具有非常模組化的高層結構,編譯器可看成多個階段構成的“流水線”結構。
每個階段將源程式從一種表示轉換成另一種表示:
- 詞法分析器:字元流->單詞流
- 語法分析器:單詞流->語法樹
- 語義分析器:
- 收集識別符號的屬性資訊:
- 型別(Type)
- 種屬(Kind)
- 儲存位置、長度
- 值
- 作用域
- 引數和返回值資訊
- 語義檢查:
- 變數或過程未經宣告就使用
- 變數或過程名重複宣告
- 運算分量型別不匹配
- 操作符與運算元之間的型別不匹配
- 收集識別符號的屬性資訊:
- 中間程式碼生成器:抽象語法樹->中間表示(與平臺無關的抽象程式):
- 易於產生
- 易於翻譯成目標程式
- 三地址碼:temp1=c*d;temp2=b+temp1;a=temp2
- 四元式
- 程式碼優化器:試圖改進中間程式碼,以產生執行速度較快的機器程式碼:
- temp1=c*d;temp2=b+temp1;a=temp2
- change to:temp1=c*d;a=b+temp1
- 程式碼生成器:生成可重定位的機器程式碼或彙編程式碼:
- temp1=c*d;a=b+temp1
- change to:Mov R2,c;Mul R2, d;Mov R1, b;Add R2, R1;Mov a, R2
- 一個重要任務是為程式中使用的變數合理分配暫存器
- 符號管理表:
- 基本功能是記錄源程式中使用的識別符號,
- 並收集與每個識別符號相關的各種屬性資訊,
- 並將它們記載到符號表中。
- 錯誤處理器:
- 處理方式:報告錯誤,應繼續編譯
- 大部分錯誤在語法分析、語義分析階段檢測出來
- 詞法分析:字元無法構成合法單詞
- 語法分析:單詞流違反語法結構規則
- 語義分析:語法結構正確,但無實際意義
編譯技術的應用
- 高階程式設計語言的實現
- 針對計算機體系結構的優化(並行性與記憶體層次結構)
- 新計算機體系結構的設計(CISC -> RISC)
- 程式翻譯
- 軟體生產率工具(查錯)