編譯原理 第一章 引論

2021-08-26 21:10:47 字數 3379 閱讀 9561

一,語言處理器

1)乙個整合的軟體開發環境,其中包括很多種類的語言處理器,比如編譯器、直譯器、彙編器、聯結器、載入器、偵錯程式以及程式概要提取工具。

2)編譯器:把源程式的每一條語句都編譯成機器語言,並儲存成二進位制檔案,這樣執行時計算機可以直接以機器語言來執行此程式,速度很快; 包括編譯器,反編譯器,交叉編譯器

3)直譯器:能夠執行用其他計算機語言編寫的程式的系統軟體,它是一種翻譯程式。它的執行方式是一邊翻譯一邊執行,因此其執行效率一般偏低,但是直譯器的實現較為簡單,而且編寫源程式的高階語言可以使用更加靈活和富於表現力的語法

編譯器產生的機器語言目標程式,比直譯器快很多。直譯器的錯誤診斷通常比編譯器更好。

4)彙編器:是將組合語言翻譯為機器語言的程式。一般而言,彙編生成的是目標**,需要經鏈結器(linker)生成可執行**才可以執行

5)聯結器:鏈結函式和全域性變數,所以,我們可以使用編譯器生成的中間目標檔案(o檔案或是obj文 件)來鏈結我們的應用程式。鏈結器並不管函式所在的原始檔,只管函式的中間目標檔案(object file),在大多數時候,由於原始檔太多,編譯生成的中間目標檔案太多,而在鏈結時需要明顯地指出中間目標檔名,這對於編譯很不方便,所以,我們要給 中間目標檔案打個包,在windows下這種包叫「庫檔案」(library file),也就是 .lib 檔案,在unix下,是archive file,也就是 .a 檔案

6)載入器:把所有可執行目標檔案放到記憶體中執行

7)偵錯程式:工作原理是基於**處理器的異常機制,並由作業系統的異常分發\事件分發的子系統(或模組)負責將其封裝處理後,以比較友好的方式與偵錯程式進行實時互動

二,乙個編譯器的結構

1)編譯器能把源程式對映為在語義上等價的目標程式。此對映過程由兩部分組成:分析部分和綜合部分

2)分析部分(編譯器前端):把源程式分解成多個組成要素,並在這些要素之上加上語法結構,然後它使用這個結構來建立該源程式的乙個中間表示。如果檢查出源程式語法或語義有誤,則提供有用資訊告知使用者。分析部分還手機有關源程式的資訊,並把資訊放到乙個稱為符號表的資料結構中。

3)綜合部分(編譯器後端):根據中間部分和符號表中的資訊來構造使用者期待的目標程式。

4)詞法分析:詞法分析階段是編譯過程的第乙個階段,是編譯的基礎。這個階段的任務是從左到右乙個字元乙個字元地讀入源程式,即對構成源程式的字元流進行掃瞄然後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程式實現這個任務。詞法分析程式可以使用lex等工具自動生成。

5)語法分析:語法分析是編譯過程的乙個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如「程式」,「語句」,「表示式」等等.語法分析程式判斷源程式在結構上是否正確。源程式的結構由上下文無關文法描述。

6)語義分析:語義分析是編譯過程的乙個邏輯階段. 語義分析的任務是對結構上正確的源程式進行上下文有關性質的審查。例如重要的是進行型別審查,陣列下標必須是整數,

例如乙個c程式片斷:

int arr[2],b;

b = arr * 10;

源程式的結構是正確的.

語義分析將審查型別並報告錯誤:不能在表示式中使用乙個陣列變數,賦值語句的右端和左端的型別不匹配。

7)中間**生成:在進行了語法分析和語義分析階段的工作之後,有的編譯程式將源程式變成一種內部表示形式,這種內部表示形式叫做中間語言或中間表示或中間**。所謂「中間**」是一種結構簡單、含義明確的記號系統,這種記號系統複雜性介於源程式語言和機器語言之間,容易將它翻譯成目標**。另外,還可以在中間**一級進行與機器無關的優化。產生中間**的過程叫中間**生成。

8)**優化:程式**進行等價(指不改變程式的執行結果)變換。程式**可以是中間**(如四元式**),也可以是目標**。等價的含義是使得變換後的**執行結果與變換前**執行結果相同。優化的含義是最終生成的目標**短(執行時間更短、占用空間更小),時空效率優化。原則上,優化可以再編譯的各個階段進行,但最主要的一類是對中間**進行優化,這類優化不依賴於具體的計算機。

9)**生成:**生成器,以源程式的中間**表示作為輸入,並把它對映到目標語言。如果目標語言為機器語言,則必須為程式使用的每個變數指明暫存器或記憶體位置,然後中間指令翻譯成能完成相同任務的機器指令序列。**生成的至關重要的方面是合理分配暫存器

10)符號表管理:

在編譯過程中,編譯程式用來記錄源程式中各種名字的特性資訊, 所以也稱為名字特性表。

名 字: 程式名、過程名、函式名、使用者定義型別名、變數名、常量名、列舉值名、標號名等。

特性資訊: 上述名字的種類、型別、維數、引數個數、數值及目標位址(儲存單元位址)等。

填表:當分析到程式中的說明或定義語句時,應將說明或定義的名字,以及與之有關的資訊填入符號表中。

例:procedure p( )

查表:(1) 填表前查表,檢查在程式的同一作用域內名字是否重複定義;

(2) 檢查名字的種類是否與說明一致;

(3) 對於強型別語言,要檢查表示式中各變數的型別是否一致;

(4) 生成目標指令時,要取得所需要的位址。

三,編譯技術的應用

1)編譯時間也是執行開銷的一部分,乙個常用的技術就是只編譯和優化那些經常執行的程式片段。

2)針對計算機體系結構的優化:並行(指令並行,多個運算並行,在處理器層次:同一應用的不同執行緒並行)

記憶體層次結構(記憶體由幾層不同速度和大小的儲存器組成,離處理器最近的層速度最快但是容量小)

3)新計算機體系結構的設計

risc(reduced instruction-set computer)精簡指令系統

cisc(complex instruction-set computer)複雜指令系統:使匯程式設計序更容易

arm(advanced risc machines)是微處理器行業的一家知名企業,設計了大量高效能、廉價、耗能低的risc處理器、相關技術及軟體。技術具有效能高、成本低和能耗省的特點。適用於多種領域,比如嵌入控制、消費/教育類多**、dsp和移動式應用等

x86 intel首先開發製造的一種

微處理器體系結構

的泛稱

四,程式語言基礎

1)環境:名字和記憶體位置(變數)的對映

狀態:記憶體位置到它們的值得對映 c中成把左值對映為右值

2)識別符號:乙個字串,指向乙個實體(資料物件、過程、類、型別)。所有識別符號都是名字,但並不是所有名字都是識別符號比如 x.y 表示x結構中y欄位

變數:指向儲存中的某個特定的位置

3)宣告:int a 定義:a=2;

4)動態作用域:乙個作用域依賴於乙個或多個只有在程式執行時刻才能知道的因素,他就是動態的

5)引數傳遞機制:1>值呼叫 傳遞指標或陣列會改變原來 值

2>引用呼叫 實在引數的位址 作為形參。被呼叫的**中沿著指標找到呼叫者指明的記憶體位置,改變形參就像改變實在引數

3>名呼叫 棄用

第一章 引論

起源與背景 參考書如下 起源 上世紀初丹麥數學家erlang,在用隨機過程理論研究 網的過程中,建立起的一套理論系統。所以,排隊論是一門古老而又年青的理論。發展 二戰之後,排隊理論與稍後發展起來的數學規劃 決策論等共同構成了運籌學。在計算機系統結構和計算機網路領域中的應用起始於上世紀七十年代。排隊問...

編譯原理第一章

編譯原理討論把高階語言中應用最廣的通用程式語言翻譯成組合語言程式所涉及的基本原理 技術和方法。這些原理 技術和方法也同樣適用於其他各類翻譯器的構造 從2進製的機器指令開始,計算機語言逐步發展。機器可以看的懂,但人看不懂。為了解決這種情況,發了更多高階語言來方便人類操作。計算機語言分類 高階語言 實現...

第一章 引論總結

個人目前觀點,這本書的意義在於,實現乙個功能是必要的,實現乙個高效能的功能也是非常重要的,在大量輸入下,如果解決不了效能問題,那麼 正確 的程式也會變成錯誤的 幾個指數公式 注意 在電腦科學中,除非有特別的說明,否則所有的對數都是以2為底的。對數的定義 x ax a xa b 當且僅當log x b...