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

特別說明

這是一個由simviso團隊進行的關於編譯原理入門內容分享的翻譯文檔,內容並不是直譯,其中有一些是譯者自身的思考。
因爲專業視頻翻譯難度也比較大,咱們內部本着翻譯質量,也有一系列的規範,也因這些規範,消耗的時間更多,同時咱們本身時間也是有限的,做爲公益組織,當下也沒什麼收益,都是小夥伴天天晚上熬夜在作事情,請勿催更,望理解
視頻翻譯文字版權歸 simviso全部,未經受權,請勿轉載:
第一集:https://b23.tv/av65512165
第二集:https://b23.tv/av65673080
圖片描述
參與人員名單
圖片描述前端

1. 爲何要學習編譯器

圖片描述
編譯器涉及了計算機科學領域的不少方面。包括高級和低級的編程範式,上下文無關的文法定義,棧(Stack)、鏈表、哈希表(hash table)、圖和樹這些動態數據結構的應用,以及計算機內存的訪問和管理方式。對於計算機專業的學生而言,可能會去開發屬於他們本身的高級編程語言以及配套的編譯器。好消息是瞭解這些是一條很好的成長捷徑。經過這個文檔展現了咱們即將開始的細節,若是你想的話,裏面涉及的不少工具能夠幫助你走的更遠。程序員

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

2. 編譯階段概述

圖片描述
編譯指的是將程序員用某種高級語言編寫的源代碼轉換成目標代碼,即計算機可以認識的可執行機器代碼。編譯是由一個叫編譯器的程序完成的。最初,沒有一種方式能夠用來編譯源代碼。也就是說,新的編程語言和它的編譯器一般是一塊兒開發的。一個編譯器的內部工做方式很大程度取決於被編譯源代碼的語言。同時由於程序須要被編譯運行在特定類型的處理器上,因此,具體如何實現編譯器還取決於目標機器的體系結構。
圖片描述
因此該怎樣開發一個好的編譯器?編譯器設計之初就是爲了必須讓高級語言所寫的程序正確運行。並且必須檢測到全部的靜態錯誤,也就是說它應該識別全部的不符合編程語言規則的錯誤。不要期望編譯器來捕獲動態錯誤,這些錯誤只能在運行時檢測到,若是沒有被捕獲到可能會致使程序崩潰。也不要期望編譯器去發現代碼邏輯上的錯誤。也就是說這些錯誤不會使程序運行時崩潰,但會致使程序輸出結果有誤。後端

一個編譯器應該作出明確的有意義的診斷。若是程序在編譯時錯誤就被發現,那麼輸出的錯誤信息就應該是明確的,而且精準地指出源代碼錯誤的位置。一個好的編譯器不會一遇到錯誤就中止處理。在一次嘗試對源代碼進行編譯的過程當中,編譯器應儘量的發現並報告更多的錯誤。一個好的編譯器會生成最佳的機器碼。這裏,最佳意味着完美。雖然任何編譯器都不可能生成完美的機器碼,可是一個好的編譯器會盡最大努力優化編譯出來的機器碼。爲了可讓機器執行的效率更高,它會尋找語句和構造方法的替代方案。編譯速度必需要快。這樣,程序員在敏捷開發過程當中屢次編譯和測試他們的源代碼的時候,徹底沒必要由於一次次改變而一次次等待編譯。編譯器應當易於使用。許多編譯器能夠從命令行啓動,並提供大量選項來控制與目標代碼一塊兒生成的調試信息量。還有一些其餘編譯器在集成開發環境下加入了一個內置的簡單菜單選項。當嘗試從IDE中運行一些新代碼時,編譯器甚至可能會自動啓動。在各個組件之間創建一個耦合度儘量小的模塊化編譯器須要不少的知識儲備。這種方式容許編譯器的各個部分能夠被多種編程語言和多種目標機器架構平臺進行重用。最後,就如同好的軟件同樣,一個好的編譯器必需要有一個詳細的文檔,並且易於維護。
圖片描述
當咱們對一個程序進行編譯的時候,會經歷以下三個過程。詞法分析就比如是,咱們寫了一個簡單的英文句子,而後將它分割成一個個的單詞和標點符號。語法分析器就是用來檢查這個句子是什麼意思。機器碼生成的這個過程就是將一句話翻譯成另外一種語言。編譯器生成了能被處理器所理解的0和1的機器碼,但它同時也對該機器碼進行了速度和空間上的優化。所以,代碼生成以及優化一般被做爲一個階段來認知。從理論上而言,編譯器的一個階段會跟着下一個階段,但你很快就知道實際並不是如此。
圖片描述
例如,詞法分析和語法分析是一塊兒進行的。在高級編程語言編譯的時候,要進行詞法和語法分析。但咱們的目標機器所處架構平臺是獨立的,所以,詞法和語法分析被稱爲編譯器的前端操做。另外一方面,代碼生成與優化僅在根據目標機器的指令集生成機器代碼時使用。這個階段在編譯過程當中被稱之爲後端操做。
圖片描述
詞法分析是由編譯器中的詞法分析器來執行的。這一般也被稱爲Lexer(詞法分析器)或者說scanner(掃描器)。語法分析則是由語法分析器來執行,一般也叫parser(語法分析器)。這裏,程序源碼將做爲一個文本流來輸入到詞法分析器中。詞法分析器將源程序的各個單詞轉換成詞法單元流並輸出。並在請求時,將詞法單元流一個一個送入到語法分析器中。語法分析器會構建出用於表明源程序的抽象語法樹。抽象語法樹是一種動態數據結構,用來表示源程序的層級結構。當語法樹構建完畢,編譯器會使用它檢查源代碼是否聽從了編程語言的語法規則。(編譯時)詞法分析器同時會建立一個符號表,符號表在編譯過程的全部階段都會被頻繁的訪問和修改。符號表包含了程序員在源代碼中使用的名稱的信息,例如變量和函數名。對於某些編譯器,抽象語法樹是源代碼到機器碼的惟一中間表現形式。抽象語法樹是語法分析器的輸出,也是編譯器前端的最終輸出。
圖片描述
接下來抽象語法樹將被直接轉換爲機器碼。然而,有些編譯器在前端作了更多的工做。在構造抽象語法樹以前,編譯器可能會先構建一棵簡易的樹。咱們稱它爲解析樹(語法分析樹),它是源程序的一種輕量表示。經過遍歷抽象語法樹得到的信息與符號表的信息進行組合。生成源代碼的另外一種中間表示形式。解析這顆樹的一系列步驟,看起來像彙編代碼。三位址碼是中間代碼的一種表現形式。一些編譯器在構建抽象語法樹後會建立更低級的代碼。其餘的一些編譯器在構建抽象語法樹時會省略中間的代碼。實際上,一些編譯器會經過構建語法樹來完成它所容許的語法檢測和語義檢測。但最終只會留下中間代碼,低級的中間代碼一樣能夠被優化。在獨立的目標機器架構上進行優化。低級的中間代碼更易生成機器碼(藉助目標機器所支持的指令集來生成機器碼)。對於部分編譯器來講,這是編譯過程的最後階段。但有些編譯器還會嘗試在這上面進行改進,在接下來的視頻中會對這些編譯階段所作的事情進行深刻講解。數據結構

相關文章
相關標籤/搜索