8.05.2023

編譯器步驟

1、語彙分析 (Lexical Analysis)
  • 分析程式中每一個字眼 (Word)的意義是什麼
  • 那些是註解 (Comment),註解在編譯過程會被編譯器忽略掉
  • 那些是關鍵字 (Keyword,如:int, for, while等)
  • 那些是常數 (Constant),如:1, 12, "Embedded"等等
  • 那些是運算子 (Operator),如;+、-、*、/等等
2、語法分析 (Syntax Analysis)
  • 主要是將程式符號,轉換成階層式的語法樹 (Syntax Tree)符號表式。在這個語法樹中,在正常情況下,階層最高的節點 (Node)為 Assign 的符號,其餘的節點為其他的運算符號,而葉子 (Leaf)就都是變數的標記 (Token)
3、語意分析 (Semantic Analysis)
  • 是藉由語法樹 (Syntax Tree)來分析程式的邏輯與語法是否符合規定。這個階段就是用來分析程式的「文法」是否正確,已經從文字符號的階段進入了程式語意的判別。
4、中間碼的產生 (Intermediate Code Generate)
  • 就是從語法樹 (Syntax Tree)中,以一個節點 (Node)為基本單位,從最底層的節點依序往上,拆解成一個個最基本的運算式,而每一個節點也會賦予一個暫時性的符號。
5、程式碼的最佳化 (Code Optimize)
  • 基本上就是化簡一些不必要的暫時性節點符號。
  • 當然,另外還有一些特別的最佳化演算法也會在這個階段使用,例如針對迴圈邏輯的最佳化有三種知名的演算法:Code Motion、Induction Variable、Strength Reduction;因為迴圈邏輯在語法上是最沒有執行效率的語法之一,因此需要特別的最佳化。或者,有時候編譯器會調整程式的前後順序,為了在下一個階段程式碼的產生過程中,暫存器的使用數目降低。
6、程式碼的產生 (Code Generate)
  • 編譯器的最後一個步驟就是將程式碼產生出來。若以C語言為例,這裡就是將最佳化後的中間碼,搭配微處理器的暫存器,逐一轉換成組合語言。

沒有留言:

張貼留言