首先明確一下參考書, 咱們使用的是《編譯原理》(第三版)陳意雲 張昱 著 高教出版社.前端
從第一個 C 語言試驗 "hello world" 咱們就已經明白瞭如何寫代碼和運行代碼. 咱們打開編譯器, 多是亙古不變的 VC 6.0, 亦或是簡潔友好的 dev C++. 無論怎樣, 咱們都明白這樣的流程, 寫代碼->調試運行. 而咱們又知道, 無論你的計算機是什麼架構, 都不能直接執行 C 的代碼. 在面向硬件的機器碼和高級語言之間起到紐帶做用的即是編譯器. 後端
咱們學習編譯原理的目的就是要明白編譯器是怎樣將一個高級語言轉變成 0/1 串的機器語言的. 整個流程以下圖所示: 架構
須要注意的是, 這個流程僅用來講明大體的工做內容與順序,並不嚴謹. 其中前面三項每每被稱爲編譯器的前端, 優化被稱做中段, 而生成目標代碼叫作編譯器的後端. 學習
簡單的解釋一下這個流程圖. 首先是詞法分析, 詞法分析的工做在於區分代碼中的單詞與符號. 好比在 C 語言中, 標識符能夠由空格斷開區分. 如: "int var = 3;", 詞法分析的任務即是識別出各個單詞. 咱們但願當詞法分析器讀入這一串字符串後能夠告訴咱們這個串中有幾個"單詞", "int", "var", "=" 以及 "3". 且他們分別是"類型名", "變量名", "操做符" 以及"數字". 每每這些信息以記號的形式存在, 即 "<TYPE, INT> <ID, "var"> <OP, EQ> <NUM, "3">". 優化
拿到這些信息, 下一步即是語法分析. 語法分析檢查拿到的記號流是否知足語法要求. 通常語法分析後,咱們會獲得語法樹. 如"var_a = var_b * (var_c + var_d)", 根據語法分析咱們獲得這樣的樹:spa
而後即是語義分析, 這一步裏編譯器就會考慮類型匹配, 轉換等問題.調試
優化過程當中, 編譯器會適當地對代碼進行一些調整. 好比數據對齊, 減小依賴甚至是並行化. 最後一步生成目標代碼, 就是編譯器用前面準備好的信息生成最後的目標代碼(機器碼). 後兩部分可能不是咱們重點考慮的內容. 編譯器的基本原理主要仍是集中在前三個部分。字符串
建立於 2017.9.12
Osinovsy編譯器