編譯原理的概述
編譯指的是將程式員用某種高級語言的源代碼轉換成目標代碼,即計算機能夠人認識的可執行機器代碼

編譯是由一個叫編譯器的程式完成的
因為程式需要被編譯運行在特定型別的處理器上,所以,具體如何實作編譯器還取決于目標機器的體系結構

What makes a good compiler?
編譯器設計之初就是為了必須讓高級語言所寫的程式正確運行
works correctly
必須檢測到所有的靜態錯誤,也就是說他應該識別所有的不符合變成語言規則的錯誤,不要指望編譯器來捕獲動態錯誤,這些錯誤只能在運行時檢測到,如果沒有被捕獲到可能后導致程式崩潰,也不要指望編譯器去發現代碼邏輯上的錯誤,也就是說這些錯誤不會使程式運行時崩潰,但會導致程式輸出結果有誤
Detects akk statuc errors
Produces meaningful diagnostics
一個編譯器應該做出明確的有意義的診斷,如果程式在編譯時錯誤就被發現,那么輸出的錯誤資訊就應該是明確的,并且精準地之初源代碼錯誤的位置
Generates optimal machine code
一個好的編譯器會生成最佳的機器碼
Compiles quickly
編譯必須要快
Easy to use
編譯要簡單運用
modular
各個組件之間建立一個耦合度盡可能小的模塊編譯器需要很多的知識儲備
這種方式允許編譯器的各個部分可以被多種編譯語言和多種目標機器架構平臺進行重用
Documented and easy to maintain
如同好的軟體一樣,一個好的編譯器必須要有一個詳細的檔案,而且易于維護
Stages of Compilation
詞法分析
我們寫了一個簡單的英文句子,然后把它分割成一個個的單詞和標點符號
語法分析
用來檢查這個句子是什么意思
機器碼生成
這一程序就是將一句話翻譯成另一種語言
編譯器生成了能夠被處理器所理解的0和1的機器碼,但它同時也對該機器碼進行了速度和空間上的優化
因此,代碼生成以及優化通常被作為一個階段來認知

編譯器的一個階段不是跟著一個階段的
例如,詞法分析和語法分析是同時進行的
在高級編譯語言編譯的時候,要進行詞法和語法分析,但我們的目標機器所處架構平臺是獨立的,因此,詞法和語法分析被稱為編譯器的前端操作

另一方面,代碼生成與優化僅在根據目標機器的指令集生成機器代碼時使用
所以這個階段在編譯程序中被稱之為后端操作
前端操作
程式原始碼將作為一個文本流來輸入到詞法分析器中,詞法分析器將源程式的各個單詞轉換成詞法單元流并輸出,并在請求時,將詞法單元流一個個送入到語法分析器中

語法分析器會構建出用于代表源程式的抽象語法樹
抽象語法樹
抽象語法樹是一種動態資料結構,用來表示源程式的層級結構

當語法書構建完畢,編譯器會使用它檢查源代碼是否遵從了編程語言的語法規則
編譯時,詞法分析器同時會創建一個符號表,符號表在編譯程序的所有階段都會被頻繁的訪問和修改,符號表包含了程式員在源代碼中使用的名稱的資訊,例如變數和函式名

對于某些編譯器,抽象語法樹是源代碼到機器碼的唯一中間表現形式,抽象語法樹是語法分析器的輸出,也是編譯器前端的最終輸出,接下來抽象語法樹將被直接轉換為機器碼
然而,有些編譯器在前端做了更多的作業
在構造抽象語法樹之前,編譯器可能會先構建一棵簡易的樹,我們稱它為決議樹(語法分析樹),它是源程式的一種輕量表示

通過編譯抽象語法樹獲得的資訊與符號表的資訊進行組合,生成源代碼的另一種中間表示形式

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/243993.html
標籤:其他
上一篇:gogogo-bee框架
下一篇:總結今天的面試經歷
