編譯原理:緒論

聲明:本系列文章,是根據中國大學MOOC網 哈工大的編譯原理 這門課學習而成的學習筆記。

什麼是編譯

編譯:將高級語言(源)翻譯成彙編語言或機器語言(目標)的過程
在這裏插入圖片描述

編譯器在語言處理系統中的位置

在這裏插入圖片描述
預處理器:將源程序轉換成經過預處理的源程序。
預處理過程:把存儲在不同文件中的源程序聚合在一起。把被稱爲宏的縮寫語句轉換爲原始語句
編譯器:將源程序轉換爲彙編語言程序。
彙編器:將彙編語言程序轉換成可重定位的機器代碼。
可重定位的機器代碼:彙編器生成的機器代碼在內存中存放的起始位置不是固定的,代碼中的所有地址都是相對起始位置的相對地址。而起始位置+相對地址=絕對地址,因此我們需要加載器來修改可重定位地址。
加載器:修改可重定位地址,將修改後的指令和數據放到內存中適當的位置。
鏈接器:將多個可重定位的機器代碼(包括庫文件)連接在一起,解決外部內存地址問題。

編譯過程的概述

通常,將編譯過程劃分成詞法分析、語法分析、語義分析、中間代碼生成、代碼優化和目標代碼生成六個階段。
代碼優化可以分爲,機器無關代碼優化和機器相關代碼優化。
在這裏插入圖片描述

  • 詞法分析概述

詞法分析:從左到右逐行掃描源程序的字符,識別出各個單詞,確定單詞的類型,將識別出的單詞轉換成統一的機內表示——詞法單元(token)的形式。

token:<種別碼,屬性值>
在這裏插入圖片描述
在這裏插入圖片描述

  • 語法分析概述

語法分析器從詞法分析器輸出的 token 序列中識別出各類短語,並構造語法分析樹。語法分析樹描述了句子的語法結構。

語法分析所依據的是語言的語法規則,即描述程序結構的規則。通過語法分析確定整個輸入串是否構成一個語法上正確的程序。

程序的結構通常是由遞歸規則表示的。

例如,我們可以用下面的規則來定義表達式。
1.任何標識符是表達式
2.任何常數(整常數、實常數)是表達式。
3.若表達式1 和 表達式2 都是表達式,那麼 表達式*表達式,表達式+表達式,都是表達式。

擴展來說,通過語法規則,我們可以進行語法分析,並畫出語法分析樹。
在這裏插入圖片描述
在這裏插入圖片描述

  • 語義分析概述

語義分析的主要任務

1.收集標識符的屬性信息
(1) 種屬 (Kind) :簡單變量、複合變量(數組、記錄、…)、過程、…
(2) 類型 (Type) :整型、實型、字符型、布爾型、指針型、…
(3) 存儲位置、長度
(4) 值
(5) 作用域
(6) 參數和返回值信息:參數個數、參數類型、參數傳遞方式、返回值類型、…

2.語義檢查
(1) 變量或過程未經聲明就使用
(2) 變量或過程名重複聲明
(3) 運算分量類型不匹配
(4) 操作符與操作數之間的類型不匹配
(5) 數組下標不是整數
(6) 對非數組變量使用數組訪問操作符
(7) 對非過程名使用過程調用操作符
(8) 過程調用的參數類型或數目不匹配
(9) 函數返回類型有誤

符號表:用於存放標識符的屬性信息的數據結構。
在這裏插入圖片描述

  • 中間代碼生成及編譯器後端概述

常用的中間表示形式

·三地址碼 (Three-address Code) :三地址碼由類似於彙編語言的指令序列組成,每個指令最多有三個操作數(operand)
·語法結構樹/語法樹 (Syntax Trees)

三地址指令的表示

·四元式 (Quadruples) (op, y, z, x)
·三元式 (Triples)
·間接三元式 (Indirect triples)

目標代碼生成器

·目標代碼生成器以源程序的中間 表示形式作爲輸入,並把它映射到目標語言
·目標代碼生成的一個重要任務是爲程序中使用的變量合理分配寄存器

代碼優化

爲改進代碼所進行的等價程序變換,使其運行得更快一些、佔用空間更少一些,或者二者兼顧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章