編譯的各個階段
編譯器的工作可以分成若干階段,每個階段把源程式從一種表示變換成另一種表示。
詞法分析
詞法分析閱讀構成源程式的字元流,按程式語言的詞法規則把它們組成詞法記號( token )流。
語法分析
語法分析( syntax analysis )簡稱分析( parsing ),它檢查詞法分析輸出的記號流是否符合程式語言的語法規則,並依據這些規則所體現出的語言構造( construct,如函式、語句、表示式等 )的層次性,用各記號的第一元建成一種樹形的中間表示,這個中間表示用抽象語法的方式描繪了該記號流的語法情況。一種典型的中間表示是語法樹,其中內部結點表示運算,它們的子結點代表該運算的運算物件。
語義分析
語義分析階段使用語法樹和符號表中的資訊,依據語言定義來檢查源程式各部分之間的語義一致性,以保證程式各部分能有意義地結合在一起。它還收集型別資訊,把它們儲存在符號表或語法樹中。
語義分析的一個重要部分是型別檢查,編譯器檢查每個算符的運算物件,看它們的型別是否適當。例如,當實數作為陣列的下標時,許多語言的定義都要求編譯器報告錯誤。語言定義也可能允許運算物件的型別作隱式轉換,例如當二元算術算符作用於一個整數和一個實數時,編譯器會把其中的整數轉換為實數。
中間程式碼生成
經過語法分析和語義分析後,許多編譯器為源程式產生更低階的顯式中間表示,可以把這種中間表示想像成一種抽象機的程式。這種中間表示必須具有兩個性質:它易於產生並且易於翻譯成目標程式。
程式碼優化
獨立於機器的程式碼優化階段試圖改進中間程式碼,以便產生較好的目的碼。通常,“較好”是指執行較快,但也可能期望其他目標,如目的碼較短或目的碼執行時能耗較低。
程式碼生成
程式碼生成是指取源程式的一種中間表示作為輸入並把它對映到一種目標語言。如果目標語言是機器程式碼,則需要為源程式所用的變數選擇暫存器或記憶體單元,然後把中間指令序列翻譯為完成同樣任務的機器指令序列。
相關文章
- 軟體開發各個階段用到的各種圖
- VueJS 的編譯階段到掛載節點VueJS編譯
- mybatis各階段的詳解MyBatis
- gcc編譯階段列印巨集定義的內容GC編譯
- 公司各個階段 CTO 需要做什麼?
- 【國外精選課程】編譯原理入門之編譯階段概述編譯原理
- 編寫一個 Makefile 檔案,對階段專案一的程式碼進行自動化編譯編譯
- 初學Java的5個階段,你在哪個階段?Java
- MyBatis執行流程的各階段介紹MyBatis
- 最有效、最全的Vue 2.0 學習路線,各個階段適用Vue
- Vue原始碼模板編譯階段----HTML解析器腦圖Vue原始碼編譯HTML
- Spring Bean各階段生命週期的介紹SpringBean
- javascript引擎執行的過程的理解--語法分析和預編譯階段JavaScript語法分析編譯
- Mysql資料庫亂碼出現的各個階段以及對應方法MySql資料庫
- web前端的幾個階段Web前端
- 深入解析Node.js Event Loop各階段Node.jsOOP
- 大神的分享:Java程式設計師的學習生涯中各個階段的建議Java程式設計師
- 跳槽季的查漏補缺,談談對Java程式設計師學習當中各個階段的建議(第四階段)Java程式設計師
- 跳槽季的查漏補缺,談談對Java程式設計師學習當中各個階段的建議(第五階段)Java程式設計師
- 跳槽季的查漏補缺,談談對Java程式設計師學習當中各個階段的建議(第六階段)Java程式設計師
- 類載入的七個階段
- 統一過程(UP)定義了初啟階段、精化階段、構建階段、移交階段和產生階段,每個階段以達到某個里程碑時結束,其中()的里程碑是生命週期架構。 A.初啟階段 B.精化階段 C.構建階段 D.移交階段架構
- 前端各階段資源,學得完算我輸前端
- Golang在各平臺下如何交叉編譯Golang編譯
- 軟體效能測試的幾個階段
- C語言學習的幾個階段C語言
- 資料中臺演進的四個階段
- 客服系統的三個發展階段
- Python學習的十個階段,學完神功大成,對應一下看看你自己在哪個階段Python
- SSL連線分為兩個階段:握手和資料傳輸階段
- [譯] 我在程式設計初級階段常犯的錯誤程式設計
- Crunchbase:2021年Q2各階段投資交易彙總
- Crunchbase:2019 Q2 各階段風險投資資料
- Android進階:十四、熟悉Android打包編譯的流程Android編譯
- DevOps: 每個階段最常用的工具有哪些?dev
- 現階段Kubernetes架構的8個問題架構
- 組織級敏捷轉型的四個階段敏捷
- linux學習的基本分為三個階段Linux