1. 程式人生 > >編譯原理第一章學習總結

編譯原理第一章學習總結

《編譯原理》讀書筆記及練習題解析

1.1節練習題

1.1.1 編譯器和直譯器之間的區別是什麼?

答:編譯器是把源語言程式(高階語言程式)翻譯成目標語言程式(機器語言程式),然後由虛擬機器(目標語言程式的執行環境)執行編譯的結果程式;由於這個過程很直接,所以編譯器的速度快於直譯器;但是相對直譯器來講,編譯器的錯誤診斷效果較弱。直譯器是把源語言程式(高階語言程式)先翻譯成一種中間語言程式(Java的位元組碼程式),然後對中間語言程式進行解釋執行;由於整個過程分為兩個部分來執行,所以速度慢於編譯器;但是相對於編譯器來講,直譯器的錯誤診斷效果更高。

1.1.2編譯器相對於直譯器的優點是什麼?直譯器相對於編譯器的優點是什麼?

答:前者:在使用者把輸入對映成輸出的過程中,由一個編譯器產生的機器語言目標程式通常比一個直譯器快的多;後者:在上述同一過程中,直譯器的錯誤診斷效果通常比編譯器更好,因為它逐個語句地執行源程式。

1.1.3在一個語言處理系統中,編譯器產生組合語言而不是機器語言的好處是什麼?

答:因為組合語言比較容易輸出和除錯,接著,這個組合語言程式由稱為彙編器的程式進行處理,並生成可重定位的機器程式碼。

1.1.4 把一種高階語言翻譯成另一種高階語言的編譯器稱為源到源的翻譯器。編譯器使用c語言作為目標語言有什麼好處?

答:就好比為什麼編譯器要產生組合語言而是不是機器語言一樣,C語言更簡單更常用更加容易理解,同樣方便除錯和輸出。

1.1.5 描述一下彙編器所要完成的任務。

答:彙編器就類似與編譯器,只是它的源語言不是高階語言而是組合語言。同樣,它需要一個前處理器進行預處理,如聚合檔案,展開巨集等。寫成的機器語言也要類似與聯結器和載入器的程式,完成類似的工作。

1.1.6 詳解直譯器執行慢的原因?(自選)

答:一般來說,解釋執行的效率低於編譯執行的效率,究竟相差多少,與所用的中間語言有關。對於一種極端的解釋執行(沒有編譯階段,只有解釋階段)效率低的原因是:對於編譯執行來說,對源程式的詞法分析、語法分析和語義分析只要執行一次。對於解釋執行來說,每次執行到源程式的某個語句時,都要對其進行一次詞法分析、語法分析和語義分析,確定了這個語句的含義後,才能執行該含義指定的計算。顯然,反覆分析迴圈體降低了解釋執行的效率。因此,解釋執行需要尋找一種合適於解釋的中間語言,以降低反覆分析需要的時間。

1.2節學習總結

1.2.1 一個編譯器的結構:分析部分和綜合部分;其中分析部分包括內容:詞法分析、語法分析和語義分析,綜合部分包括內容:中間程式碼生成、程式碼生成和程式碼優化;分析部分經常被稱作編譯器的前端,而綜合部分稱為後端;

1.2.2 如果我們更加詳細地研究編譯過程,會發現它順序執行了一組步驟、每個步驟把源程式的一種表示方式換成另一種表示方式。而在整個過程中有一個存放整個源程式的資訊符號表可由編譯器的各個步驟使用。

1.2.3 一個編譯器的各個步驟:如下圖所示

1.2.4 詞法分析

編譯器的第一個步驟稱為詞法分析或掃描。詞法分析器讀入組成源程式的字元流,並且將他們組織成為有意義的詞素的序列。對於每個詞素,詞法分析器產生如下形式的詞法單元作為輸出:<token-name  attribute-value> :在這個詞法單元中,第一個分量是一個由語法分析步驟使用的抽象符號,而第二個分量指向符號表中關於這個詞法單元的條目。符號表條目的資訊會被語義分析和程式碼生成步驟使用。

例:如下語句的詞法分析階段:

Position=initial + rate  * 60

解析:position是一個詞素,被對映成詞法單元<id,1>其中id是表示識別符號的抽象符號,而1指向符號表中position對應的條目。

+也是一個詞素,被對映成詞法單元<+>

切記:分隔詞素的空格會被詞法分析器忽略掉。       

1.2.5 語法分析

第二個步驟稱為語法分析或解析。語法分析器使用由詞法分析器生成的各個詞法單元的第一個分量來建立樹形的中間表示。一個常見的中間表示方法是語法樹,樹中的每個內部結點表示一個運算,而該結點的子結點表示該運算分量。

1.2.6 語義分析

語義分析器使用語法樹和符號表中的資訊來檢查源程式是否和語言定義的語義一致。它同時也收集型別資訊,並把這些資訊存放在語法樹或符號表中,以便在隨後的中間程式碼生成過程中使用。語義分析的一個重要部分是型別檢查。

1.2.7 中間程式碼生成

在把一個源程式翻譯成目的碼的過程中,一個編譯器可能構造出一個或多箇中間表示。這些中間表示可以有多種形式。該中間表示應該具有兩個重要的性質:它應該易於生成,且能夠被輕鬆地翻譯為目標機器上的語言。