1. 程式人生 > >編譯原理 模塊二

編譯原理 模塊二

什麽 是把 機器碼 語法樹 一個 文件 變換 語義分析 現在

編譯的前端與後端

概念上我們有時候把編譯程序分成編譯前端和編譯後端。

編譯前端

前端主要由源語言有關但與目標機無關的那些部分組成,通常包括詞法分析、語法分析、語義分析與中間代碼的產生,有的代碼優化工作也可以包括在前端。

編譯後端

後端包括編譯程序中與目標機有關的那些部分,如與目標機有關的代碼優化和目標代碼生成等。
通常後端不依賴源語言而僅僅依賴於中間語言。

編譯程序的構造工具是什麽?

以前人們構造編譯程序大多數采用的是機器語言或匯編語言,現在只有為了充分發揮各種不同硬件系統的效率,為了滿足各種不同的具體要求,才會采用這種工具來構造編譯程序(或編譯程序的“核心”部分)。現在越來越多采用高級語言來構造編譯程序。

自編譯方式

先對語言的核心部分構造一個小小的編譯程序(可用低級語言實現),再以它為工具構造能編譯更多語言成分的較大編譯程序,如此不斷擴展,最後形成整個編譯程序(滾雪球),這種通過一系列自展途徑而形成的編譯程序的過程叫做自編譯過程。

構造工具

現在人們已經建立了多種編制部分編譯程序或者整個編譯程序的有效工具。構造編譯程序的工具稱為編譯程序-編譯程序、編譯程序產生器或翻譯程序書寫系統。

編譯原理的概述:(總結)

編譯程序就是把高級語言源程序生成為匯編代碼的過程,生成的匯編代碼再由匯編器連接器等生成目標機器上的可執行代碼。

一般編寫高級語言編譯程序采用自舉形式,如,C語言編譯器首先由其他語言如匯編語言編寫,再有生成的目標EXE程序對編寫的C語言程序進行自我編譯,調試後即為第一個C語言編譯程序的編寫過程,即自舉。

而如今,我們已經有了C語言編譯程序,可以直接用C語言編譯自己用C語言編寫的編譯程序,再用生成的可執行文件編譯自己即可。

總體,

詞法分析->語法分析->語義分析->(中間代碼生成)->目標代碼生成

其中,為了生成的代碼的可移植性,采用了中間代碼形式,由於目標機器的指令集不同,生成的機器碼也不同,但我們可以用中間代碼作為機器代碼生成的程序集,所以中間代碼不是必需的,但是為了方便起見,一般編譯程序都會采用中間代碼,如三地址碼,四元式,語法樹等。

語法分析:

在語法分析過程中,主要是對文法的熟悉掌握,一般采用LL(1)分析法或者遞歸下降子程序方法,但遞歸下降子程序需要對文法進行變換,不能有左遞歸且同一非終結符的產生式select集合不能相交,在語法分析過程中也可以檢查出錯誤,如C語言中的分號缺失,語句形式錯誤等,重點是填寫符號表。

語義分析:

包含了語法分析中不能檢查出的錯誤,比如數組賦值形式錯誤等,還包含了語法翻譯制導技術,在特定的時機產生中間代碼。由於本人能力有限,只寫過四元式的中間代碼,主要思想與逆波蘭式的思想相似,特定時機,特定入棧。

編譯原理 模塊二