【國外精選課程】編譯原理入門之編譯階段概述

知秋z發表於2019-09-01

編譯原理入門及編譯階段概述

特別說明

這是一個由simviso團隊進行的關於編譯原理入門內容分享的翻譯文件,內容並非直譯,其中有一些是譯者自身的思考。

視訊翻譯文字版權歸 simviso所有,未經授權,請勿轉載

第一集:b23.tv/av65512165

第二集:b23.tv/av65673080

【國外精選課程】編譯原理入門之編譯階段概述

參與人員名單:

【國外精選課程】編譯原理入門之編譯階段概述

1. 為什麼要學習編譯器

【國外精選課程】編譯原理入門之編譯階段概述

編譯器涉及了電腦科學領域的很多方面。包括高階和低階的程式設計正規化,上下文無關的文法定義,棧(Stack)、連結串列、雜湊表(hash table)、圖和樹這些動態資料結構的應用,以及計算機記憶體的訪問和管理方式。對於計算機專業的學生而言,可能會去開發屬於他們自己的高階程式語言以及配套的編譯器。好訊息是瞭解這些是一條很好的成長捷徑。通過這個文件展示了我們即將開始的細節,如果你想的話,裡面涉及的很多工具可以幫助你走的更遠。

這是關於編譯原理入門的第一部分。如你所見,編譯器涉及了電腦科學領域的很多方面。的確,這個主題所涉及的範圍實在太廣。以至於大家可能會產生比視訊所給出的(內容)更多的疑問(譯者注:即基於給定內容產生更多想法)。儘管如此,這些視訊將會讓你深入瞭解許多常見編譯器的一些概念以及功能。通過這個系列的第一部分來對各個編譯階段進行概述。

2. 編譯階段概述

【國外精選課程】編譯原理入門之編譯階段概述

編譯指的是將程式設計師用某種高階語言編寫的原始碼轉換成目的碼,即計算機能夠認識的可執行機器程式碼。編譯是由一個叫編譯器的程式完成的。最初,沒有一種方式可以用來編譯原始碼。也就是說,新的程式語言和它的編譯器通常是一起開發的。一個編譯器的內部工作方式很大程度取決於被編譯原始碼的語言。同時因為程式需要被編譯執行在特定型別的處理器上,所以,具體如何實現編譯器還取決於目標機器的體系結構。

【國外精選課程】編譯原理入門之編譯階段概述

所以該怎樣開發一個好的編譯器?編譯器設計之初就是為了必須讓高階語言所寫的程式正確執行。而且必須檢測到所有的靜態錯誤,也就是說它應該識別所有的不符合程式語言規則的錯誤。不要指望編譯器來捕獲動態錯誤,這些錯誤只能在執行時檢測到,如果沒有被捕獲到可能會導致程式崩潰。也不要指望編譯器去發現程式碼邏輯上的錯誤。也就是說這些錯誤不會使程式執行時崩潰,但會導致程式輸出結果有誤。

一個編譯器應該做出明確的有意義的診斷。如果程式在編譯時錯誤就被發現,那麼輸出的錯誤資訊就應該是明確的,並且精準地指出原始碼錯誤的位置。一個好的編譯器不會一遇到錯誤就停止處理。在一次嘗試對原始碼進行編譯的過程中,編譯器應儘可能的發現並報告更多的錯誤。一個好的編譯器會生成最佳的機器碼。這裡,最佳意味著完美。雖然任何編譯器都不可能生成完美的機器碼,但是一個好的編譯器會盡最大努力優化編譯出來的機器碼。為了可以讓機器執行的效率更高,它會尋找語句和構造方法的替代方案。編譯速度必須要快。這樣,程式設計師在敏捷開發過程中多次編譯和測試他們的原始碼的時候,完全不必因為一次次改變而一次次等待編譯。編譯器應當易於使用。許多編譯器可以從命令列啟動,並提供大量選項來控制與目的碼一起生成的除錯資訊量。還有一些其他編譯器在整合開發環境下加入了一個內建的簡單選單選項。當嘗試從IDE中執行一些新程式碼時,編譯器甚至可能會自動啟動。在各個元件之間建立一個耦合度儘可能小的模組化編譯器需要很多的知識儲備。這種方式允許編譯器的各個部分可以被多種程式語言和多種目標機器架構平臺進行重用。最後,就如同好的軟體一樣,一個好的編譯器必須要有一個詳細的文件,而且易於維護。

【國外精選課程】編譯原理入門之編譯階段概述

當我們對一個程式進行編譯的時候,會經歷如下三個過程。詞法分析就好比是,我們寫了一個簡單的英文句子,然後將它分割成一個個的單詞和標點符號。語法分析器就是用來檢查這個句子是什麼意思。機器碼生成的這個過程就是將一句話翻譯成另一種語言。編譯器生成了能被處理器所理解的0和1的機器碼,但它同時也對該機器碼進行了速度和空間上的優化。因此,程式碼生成以及優化通常被作為一個階段來認知。從理論上而言,編譯器的一個階段會跟著下一個階段,但你很快就知道實際並非如此。

【國外精選課程】編譯原理入門之編譯階段概述

例如,詞法分析和語法分析是一起進行的。在高階程式語言編譯的時候,要進行詞法和語法分析。但我們的目標機器所處架構平臺是獨立的,因此,詞法和語法分析被稱為編譯器的前端操作。另一方面,程式碼生成與優化僅在根據目標機器的指令集生成機器程式碼時使用。這個階段在編譯過程中被稱之為後端操作。

【國外精選課程】編譯原理入門之編譯階段概述

詞法分析是由編譯器中的詞法分析器來執行的。這通常也被稱為Lexer(詞法分析器)或者說scanner(掃描器)。語法分析則是由語法分析器來執行,通常也叫parser(語法分析器)。這裡,程式原始碼將作為一個文字流來輸入到詞法分析器中。詞法分析器將源程式的各個單詞轉換成詞法單元流並輸出。並在請求時,將詞法單元流一個一個送入到語法分析器中。語法分析器會構建出用於代表源程式的抽象語法樹。抽象語法樹是一種動態資料結構,用來表示源程式的層級結構。當語法樹構建完畢,編譯器會使用它檢查原始碼是否遵從了程式語言的語法規則。(編譯時)詞法分析器同時會建立一個符號表,符號表在編譯過程的所有階段都會被頻繁的訪問和修改。符號表包含了程式設計師在原始碼中使用的名稱的資訊,例如變數和函式名。對於某些編譯器,抽象語法樹是原始碼到機器碼的唯一中間表現形式。抽象語法樹是語法分析器的輸出,也是編譯器前端的最終輸出。

【國外精選課程】編譯原理入門之編譯階段概述

接下來抽象語法樹將被直接轉換為機器碼。然而,有些編譯器在前端做了更多的工作。在構造抽象語法樹之前,編譯器可能會先構建一棵簡易的樹。我們稱它為解析樹(語法分析樹),它是源程式的一種輕量表示。通過遍歷抽象語法樹獲得的資訊與符號表的資訊進行組合。生成原始碼的另一種中間表示形式。解析這顆樹的一系列步驟,看起來像彙編程式碼。三位址碼是中間程式碼的一種表現形式。一些編譯器在構建抽象語法樹後會建立更低階的程式碼。其他的一些編譯器在構建抽象語法樹時會省略中間的程式碼。實際上,一些編譯器會通過構建語法樹來完成它所允許的語法檢測和語義檢測。但最終只會留下中間程式碼,低階的中間程式碼同樣可以被優化。在獨立的目標機器架構上進行優化。低階的中間程式碼更易生成機器碼(藉助目標機器所支援的指令集來生成機器碼)。對於部分編譯器來說,這是編譯過程的最後階段。但有些編譯器還會嘗試在這上面進行改進,在接下來的視訊中會對這些編譯階段所做的事情進行深入講解。

歡迎加群和我們交流

【國外精選課程】編譯原理入門之編譯階段概述

如果感興趣可以關注我們的微信公眾號

【國外精選課程】編譯原理入門之編譯階段概述

相關文章