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