編譯器是什麼
編譯器就是一種翻譯程序,一般是將高級語言編寫的源代碼轉化成彙編或者機器碼。說白了就是把我們用python,java等各種語言寫的程序,翻譯成計算機能看懂的二進制指令數據,以便運行.
編譯流程
source –> 詞法分析 == 各種記號Token stream
–> 語法分析 == 語法樹
–> 語義分析 == 優化後的語法樹
–> 中間代碼生成 == 中間代碼
–> 中間代碼優化 == 優化後的中間代碼
–> 目標代碼生成 == 目標代碼
–> 目標代碼優化 == target program
流程詳解
詞法分析
將源代碼的標識符、運算符等分割成一個個記號
語法分析
解析得到的一個個記號,根據語法規則生成一種抽象語法樹
語義分析
編譯器開始對語法樹進行一次或多次的遍歷,檢查程序的語義規則:變量聲明、類型匹配..等
IR生成(中間代碼,intermediate Representation)
一般生成的算法是一個遞歸的算法,遞歸的遍歷語法樹,將語法樹上的一些節點替換成中間代碼塊,再根據特定的規則和順序將這些中間代碼塊拼裝起來。 爲什麼不直接生成目標代碼?增加編譯器的開發擴展性;便於對代碼優化,中間代碼的優化要比直接在目標代碼優化難度低得多。
IR優化
各種優化: 去除冗餘代碼 優化循環、算術表達式等
目標代碼生成
編譯器根據中間代碼和目標機器架構生成目標代碼。
目標代碼優化
利用目標機器的提供的特性對目標代碼做進一步的優化,如利用 CPU 的流水線,利用 CPU 的多核等,生成最終的目標代碼