Transcript chap5
第5章 編譯器 © 2007 台灣培生教育出版(Pearson Education Taiwan) 內容 5.1節將討論「單階段作業的編譯器」的基本 功能 5.2節討論機器相關的擴充功能 5.3節討論機器不相關的擴充功能 5.4節討論一些不同的編譯器設計方法 5.5節提出五個範例 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.1 編譯器的基本功能 通常使用文法(grammar),來描述一個高階 語言的規則。 文法會明確地指出該程式語言中,合法敘述 (statement)的形式(form)和語法 (syntax)。 編譯的程序包括三個步驟 語彙掃描(scanning) 語法分析(parsing) 產生機器碼(code generation) © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.1 編譯器的基本功能 符記是程式語言中最基本的組成單元。 「語彙分析」(lexical analysis) 掃瞄程式碼中的敘述,找出其中的符記並加以分類的 動作 「掃描器」(scanner) 語法分析(parsing或syntactic analysis) 當編譯器完成語彙分析之後,會將程式中的每一筆敘 述,歸類為文法中的某一種語言結構 語法分析器(parser) 產生目的碼:機器碼 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.1 PASCAL程式範例 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.1.1 文法 一個程式語言的文法是指一種正式的格式,用 來描述該語言中程式和個別敘述的語法 (syntax)或形式(form) 文法並不描述個別敘述的語意(semantic)或 意義(meaning)。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 兩個敘述的語法相同,但語意卻不同 I := J + K X := Y + I 變數X和Y都是實數 變數I、J、和K是整數 © 2007 台灣培生教育出版(Pearson Education Taiwan) BNF(BACKUS-NAUR FORM) 編寫文法所使用的標記方式 <read> ::= READ ( <id-list> ) 空白字元沒有任何意義。 介於小於符號(<)和大於符號(>)之間的字串, 稱之為「非終端符號」(nonterminal symbol) 符號「::=」用來表示「::=」左邊的識別名稱,在 文法中,被定義成「::=」右邊的樣子。 未介於小於符號和大於符號之間的字串或字元, 稱之為「終端符號」(terminal symbol) © 2007 台灣培生教育出版(Pearson Education Taiwan) 簡化的PASCAL文法 © 2007 台灣培生教育出版(Pearson Education Taiwan) 分析樹(PARSE TREE)/語法樹(SYNTAX TREE) 依據文法來分析原始程式中的敘述,並以樹狀 結構來展示此分析的結果。 READ ( VALUE ) © 2007 台灣培生教育出版(Pearson Education Taiwan) 指定敘述(ASSIGNMENT STATEMENT)< assign> ::= id := <exp> <exp> ::= <term> | <exp> + <term> | <exp> - <term> © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.4 展示圖5.1中程式碼的語法分析樹 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.4 展示圖5.1中程式碼的語法分析樹 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.1.2 語彙分析 掃瞄原始碼並辨識出敘述中所有符記的動作 決定了在程式原始碼中那些部份是符記;例如, 關鍵字(keyword)、運算子(operator)、識 別字(identifier)、整數(integer)、浮點數 (floating-point number)、字元字串 (character string)等。 語彙掃描器會輸出一連串的符記。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 識別字 <ident> ::= <letter> | <ident> <letter> | <ident> <digit> <letter> ::= A | B | C | D | ... | Z <digit> ::= 0 | 1 | 2 | 3 | ... | 9 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.5 展示圖5.2中文法的符記代碼表 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.6 針對圖5.1 之程式碼進行語彙掃描所產 生的結果 © 2007 台灣培生教育出版(Pearson Education Taiwan) 有限自動機 有限自動機是由一組有限集合的狀態,和一組 狀態之間的轉換集合所組成。 有一個狀態是起始狀態(starting state),另 外會有一個或多個狀態是最終狀態(final states)。 每一個圓形是代表一個狀態(states),圓形 中間有狀態的編號,而圓形與圓形之間的箭頭, 則代表狀態之間的轉換(transitions)。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 有限自動機 使用有限自動機,可以辨別大部分程式語言的符記。 可以從有限自動機(finite automaton)的起始狀態開 始,依照所掃描的每一個字元,從一個狀態轉換至下 一個狀態。 如果比對下一個字元之後並沒有符合的轉換,或是已 經沒有字元可以掃描時,有限自動機就會停止。 如果有限自動機是停止在非最終狀態(non-final state) 時,表示有限自動機無法辨識(或是拒絕)該字串; 而當有限自動機是停止在最終狀態(final state)時, 則表示有限自動機可以辨識(或接受)該字串。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.7 有限自動機 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.8 可辨識一般程式語言符記的有限自動機 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.9 可辨識圖5.5中所有符記的有限自動機 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.10 用 (A) 演算法和 (B) 有限自動機的表列 式來辨識符記 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.1.3 語法分析 語法分析就是依據程式語言所使用的文法,分 析程式原始碼並建構語法分析樹。 由上而下的方法是根據文法規則,從樹根 (root)開始,建構完整的語法分析樹,而樹 的終端節點(terminal node)就是程式碼中的 敘述 由下而上的方法則是從樹的終端節點開始,把 節點合併成更上層的節點,一層又一層地向上 建構,直到語法分析樹的根為止 © 2007 台灣培生教育出版(Pearson Education Taiwan) 運算子優先順序分析法 由下而上的分析方法,又稱為運算子優先順序 法 加法「+」的優先順序比乘法「*」低,可以 用下列寫法表示之 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.11 依據圖5.2 的文法所建立之運算子優先順 序的矩陣 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.12 依據運算子優先順序來分析READ 敘述 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.13 用運算子優先順序分析法來分析一個指 定敘述 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.13 用運算子優先順序分析法來分析一個指 定敘述 © 2007 台灣培生教育出版(Pearson Education Taiwan) 「移動-化減」分析法(SHIFT-REDUCE PARSING) 使用堆疊來存放尚未翻譯的符記,其主要的兩 個動作就是移動(shift)和化減(reduce)。 「移動」是把目前的符記置入堆疊的最上層 「化減」是依照文法規則,將堆疊最上層的符 記翻譯成符號。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.14 「移動-化減分析法」的範例 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.14 「移動-化減分析法」的範例 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.14 「移動-化減分析法」的範例 © 2007 台灣培生教育出版(Pearson Education Taiwan) 「遞迴-下降」分析法 由上而下(top-down)的語法分析方法,又稱之為 「遞迴-下降」分析法(recursive descent parsing) 將包含許多的程序,而每一個程序分別負責不同的 「非終端符號」(nonterminal symbol),當語法分析 器呼叫某個程序時,該程序將從輸入的資料中找出一 個,以目前的符記為開頭的子字串(substring),並 將此子字串翻譯成該程序所負責的非終端符號。 當遭遇到此種多定義的非終端符號時,必須先檢視 下一個輸入的符記,才能夠決定應採用哪一個定義。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.15 適用於「遞迴-下降」分析法的PASCAL 修正文法 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.16 使用「遞迴-下降」分析法來分析READ 敘述 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.16 使用「遞迴-下降」分析法來分析READ 敘述 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.17 用「遞迴-下降」分析法分析一個指定 敘述 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.17 用「遞迴-下降」分析法分析一個指定 敘述 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.17 用「遞迴-下降」分析法分析一個指定 敘述 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.17 用「遞迴-下降」分析法分析一個指定 敘述 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.1.4 目的碼的產生 在目的碼產生技術中,包含了一組對應到文法 規則的常式(routine。也被稱為「語意常式」 (semantic routine)。 這些常式會直接產生目的碼,但是較複雜的編 譯器則可能會先產生中介碼(intermediate form),然後分析這些中介碼,並試著產生效 率較好的目的碼。 利用兩種資料結構來儲存資料,分別是串列 (list)和堆疊(stack)。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 資料結構 「LISTCOUNT」變數是用於記錄目前有幾個項 目存在串列中。 符記修飾子(token specifiers),在此以S (符記)來代表 「LOCCER」變數,來記錄所編譯之程式中下 一個可用的位址 將「節點修飾子」(node specifier) S(<term>1) 設定成 rA,表示此運算的結果會 存放於暫存器A中。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.18 一個READ敘述的目的碼產生 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.19 一個指定敘述的目的碼產生 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.19 一個指定敘述的目的碼產生 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.19 一個指定敘述的目的碼產生 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.19 一個指定敘述的目的碼產生 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.19 一個指定敘述的目的碼產生 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.19 一個指定敘述的目的碼產生 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.19 一個指定敘述的目的碼產生 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.20 針對圖5.2中文法的目的碼產生常式 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.20 針對圖5.2中文法的目的碼產生常式 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.20 針對圖5.2中文法的目的碼產生常式 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.20 針對圖5.2中文法的目的碼產生常式 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.21 針對圖5.1中程式碼所產生的目的碼 (用組合語言來表示) © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.21 針對圖5.1中程式碼所產生的目的碼 (用組合語言來表示) © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.2 相依於機器的編譯器特性 5.2.1 節介紹一種可以將程式碼轉換成中間形 式的常用方法 5.2.2節將會使用此種中間形式,來討論與機 器相依的目的碼最佳化技術 5.3節利用類似的中間形式,來討論一些與機 器不相依的目的碼最佳化技術。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.2.1 程式的中間形式 operation, op1, op2, result 「operation」是代表目的碼要進行的動作,而 「op1」和「op2」是參與動作的運算元,「result」 則是用於存放此項動作的結果。 SUM := SUM + VALUE 以四項形式來呈現此敘述,結果如下: + , SUM, VALUE, i1 :=, i1 , , SUM © 2007 台灣培生教育出版(Pearson Education Taiwan) 四項形式的中介碼 具有許多的優點 可以重新排列這些中介碼的順序,以刪除多餘的 載入(load)和儲存(store)運算,如此便可以 減少對記憶體的存取,以提高執行的效率 盡量使用暫存器或暫時變數(temporary variables),來存放中間結果(intermediate result) ij,這對執行效率的提升具有相當的幫助 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.22 展示圖5.1中程式原始碼的中介碼 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.2.2 相依於機器之目的碼的最佳化 在大多數處理器中,都會有通用暫存器 (general-purpose registers),可以用來存放 常數、變數的值、以及中間結果 (intermediate results)等 如何有效率地使用和分配數量有限的暫存器 可以將程式分割成一些基本區塊(basic blocks),一個基本區塊中會有一連串的中介 碼。 程式流程圖(flow graph) © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.23 將圖5.22的中介碼劃分成基本區塊和 流程圖 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.24 重新排列中介碼以進行目的碼的最佳 化 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.24 重新排列中介碼以進行目的碼的最佳 化 © 2007 台灣培生教育出版(Pearson Education Taiwan) 其他「相依於機器之目的碼最佳化」的方法 利用機器的特性或是特殊指令 較有效率的迴圈控制指令或定址模式 具有高階指令(high-level machine instructions) 的機器 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.3 不相依於機器的編譯器特性 5.3.1節將介紹如何處理陣列(array)的結構 化變數(structured variables)。 5.3.2節討論不相依於機器之目的碼的最佳化 技術。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.3.1 結構化變數 編譯具備陣列(array)、記錄(record)、字 串(string)、和集合(set)等結構化變數的 程式 配置儲存空間,以及如何產生目的碼,以引用 這些空間。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 陣列 ARRAY[l..u] OF INTEGER 配置「u - l + 1」個字組的記憶體位置 ARRAY [l1..u1, l2..u2] OF INTEGER 分配給該陣列的字組數量:(u1-l1+1)*(u2-l2+1) 「列位順序」(row-major order) 「行位順序」(column-major order) © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.25 B:ARRAY[0..3, 1..6] 以 (A) 「列位順 序」及 (B) 「行位順序」的方式來儲存 © 2007 台灣培生教育出版(Pearson Education Taiwan) 陣列元素的位址 A : ARRAY[l...u] OF INTEGER 相對於陣列基底位址的位址如下: w * (s-l) A[s] B : ARRAY [l1..u1, l2..u2] OF INTEGER s2] 的相對位址如下: w * [(s1-l1) * (u2-l2+1) + (s2-l2)] B[s1, © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.26 陣列引用的中介碼 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.3.2 不相依於機器之目的碼的最佳化 「共同子運算式的刪除」是一項重要的目的碼 最佳化技術。 某個子計算式在程式中出現了許多次,也就是在 程式中的不同部位,重複著相同的運算。 所產生的目的碼應該只會計算一次,第二次以後 的目的碼會直接使用已知的計算結果。 「迴圈常量的移除」 「迴圈常量」:其值並不會隨著迴圈的輪迴而改變 在進入迴圈之前,先行計算出該常量的值 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.27 刪除「共同子運算式」和「迴圈常量」 以達成目的碼的最佳化 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.27 刪除「共同子運算式」和「迴圈常量」 以達成目的碼的最佳化 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.27 刪除「共同子運算式」和「迴圈常量」 以達成目的碼的最佳化 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.27 刪除「共同子運算式」和「迴圈常量」 以達成目的碼的最佳化 © 2007 台灣培生教育出版(Pearson Education Taiwan) 其它最佳化的方法 使用比較有效率的運算,來置換比較沒有效率 的運算。 「減低運算的強度」方法 「折疊」(folding)方法 「展開迴圈」(loop unrolling)方法 「合併迴圈」(loop jamming)方法 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.28 以「減低運算的強度」進行目的碼的 最佳化 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.3.3 記憶體空間的配置 靜態配置(static allocation) 暫時變數,包括用於存放回歸位址(return address)的暫時變數,都是位在程式中的固定位 址。 遞迴(recursive)和動態記憶體配置 (dynamic allocation) © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.29 在遞迴呼叫時使用靜態記憶體配置 © 2007 台灣培生教育出版(Pearson Education Taiwan) 動態記憶體配置(DYNAMIC STORAGE ALLOCATION)技術 當以遞迴方式呼叫SUB副程式時,必須要能夠 保留SUB副程式中所有變數的值。這些變數包 括參數(parameters)、暫時變數 (temporaries)、回歸位址(return addresses)、暫存器儲存區(register save areas)等。 用一個堆疊(stack)來存放所有的活動記錄, 而現行的記錄是位在堆疊的最頂端。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.30 在遞迴呼叫時使用自動記憶體配置 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.30 在遞迴呼叫時使用自動記憶體配置 © 2007 台灣培生教育出版(Pearson Education Taiwan) 自動(AUTOMATIC)記憶體配置 當程序被呼叫時,才會配置所有變數的記憶體 空間。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 程式設計師可以指定配置記憶體空間 FORTRAN 90 ALLOCATE (MATRIX(ROWS, COLUMNS)) DEALLOCATE (MATRIX) PASCAL NEW(P) DISPOSE(P) C MALLOC(SIZE) FREE(P) © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.3.4 區塊結構語言 在某些語言中,一個程式將會劃分成許多的單 元,稱之為區塊(blocks)。 一個區塊是程式的一部份,它可以宣告自己的 識別字。 例如,在Pascal語言中的程序(procedures) 和函式(functions)即是一個區塊。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.31 原始程式中的巢狀區塊 © 2007 台灣培生教育出版(Pearson Education Taiwan) 區塊結構 大部分的區塊結構語言,都是採用自動記憶體 配置技術,為變數配置其記憶體空間。 常見方法之一,是利用一種稱之為「顯示」 (display)的資料結構 「顯示」結構中存放的是最近活動記錄的指標, 其指向目前區塊以及所有外層區塊的活動記錄。 當某區塊中的程式所引用到的變數,是由外層 區塊所宣告時,產生的目的碼就會利用「顯示」 結構,來找出包含這個變數的活動記錄。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.32 圖5.31中程序所使用的「顯示」結構 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.32 圖5.31中程序所使用的「顯示」結構 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.4 編譯器設計的選項 5.4.1 節將會簡短地討論,當選擇單次或多次 的編譯架構時,所需要考量的因素以及二種架 構的個別優點。 5.4.2節將介紹解譯器(interpreter) 5.4.3節會介紹虛擬碼系統(P-code systems) 5.4.4節將要介紹「撰寫編譯器的系統」 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.4.1 劃分成多階段 5.2節和5.3節討論一些目的碼最佳化的技術,大 部分技術都不能實現於單階段的編譯架構。 某些言語可以接受識別的宣告是位在其使用之後。 此時,單階段的編譯器必能夠解決跳躍指令中 「向前引用」(forward reference)的問題,其 採用的技術與單階段的組譯器相似。 如果編譯速度是最大的考量時,單階段編譯方式 可能是較佳的選擇。 如果程式在每次編譯後,會執行許多次或是處理 大量的資料,那麼目的碼的執行速度,將會遠比 編譯的速度更為重要。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.4.2 解譯器 編譯器會把程式原始碼翻譯成機器碼,解譯器 則是直接執行原始程式。 解譯器也會對程式原始碼進行語彙分析和語法 分析,並且將原始程式翻譯成內部形式 (internal form),然後執行之。 可以把解譯器視為一群副程式的集合,而這些 副程式會依據內部形式的內容來執行,以達到 原始程式所要進行的動作。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.4.2 解譯器 雖然解譯的過程相當簡單而且快速,但是最後 的執行速度卻緩慢許多。 非常容易地在執行期間進行除錯(debug)的 動作。 某些語言的特性,可能會將其導向於解譯的方 式:變數的型態是可以在程式的執行過程中, 予以修改;動態範圍(dynamic scoping) © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.4.3 虛擬碼編譯器 進行原始程式分析,並且產生中間型式 (intermediate form),然後依此以解譯的方 式執行。 虛擬碼編譯器產生的中間形式,是虛擬機器 (pseudo-machine或P-machine)的機器語言。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.33 虛擬碼編譯器的產生和執行 © 2007 台灣培生教育出版(Pearson Education Taiwan) 可攜性(PORTABILITY) 只要系統內具有虛擬機器(虛擬碼解譯器), 則虛擬機器就可以直接執行虛擬機器的目的碼, 而程式不需要重新編譯。 虛擬機器的目的程式,通常會比同功能的機器 碼更小,因此特別適合於小記憶容量的機器。 以解譯方式執行虛擬碼程式的速度,遠不及功 能相同的真正機器碼程式。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.4.4 編譯器的編譯器 「編譯器的編譯器」(compiler-compilers)是 可以用於協助編譯器的建立工作,此類工具亦 稱之為編譯器產生器(compiler generator)或 翻譯器撰寫系統(translator-writing system)。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.34 採用「編譯器的編譯器」之自動化編 譯器建 © 2007 台灣培生教育出版(Pearson Education Taiwan) 編譯器的編譯器 「編譯器的編譯器」所提供的彈性重度並不相 同,能夠節省的工作也並不一致 相較於完全重新製作的編譯器,「編譯器的編 譯器」所製作出來的編譯器,可能會需要較多 的記憶體,而且編譯速度也會比較慢。 YACC © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.5 編譯器範例 5.5.1節將介紹SunOS的C語言編譯器 5.5.2節會介紹GNAT(GNU NYU Ada Translator) 5.5.3節介紹Cray公司的MPP FORTRAN編譯器 5.5.4節介紹由昇陽電腦(Sun Microsystems) 所發展的Java編譯器。 5.5.5節介紹YACC的「編譯器的編譯器」 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.5.1 SUNOS的C語言編譯器 翻譯的程序是從C的前置處理器開始,執行檔 案引入(include)和巨集處理(macro processing)等功能(請參考4.4.3節);接著, 前置處理器的輸出會傳至編譯器,開始真正的 編譯工作。其中,使用者可以指定目的碼最佳 化的等級。最後,編譯器會產生組合語言的程 式,並交由組譯器來產生機械碼。 可以設定4種目的碼的最佳化等級 可以產生除錯工具 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.5.2 GUN NYU ADA翻譯器 GNU軟體系統中的一個Ada編譯器,可以支援 Ada95和Ada83二種語言。 GNAT的語法分析,是採用人工撰寫之遞迴而漸降 (hand-coded recursive descent)的分析器。 語意分析(semantic analysis)和擴展 (expansion)是相互串連在一起。 GNAT到GNU的階段會追蹤抽象語法樹,並呼叫產 生器來建立一些對應的GCC樹片段。當產生每一 個片段時,GCC後端將會產生對應目的碼 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.35 GNAT的整體架構 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.5.3 CRAY MPP FORTRAN編譯器 分派工作給予處理元 DIMENSION A(256) CDIR$ SHARED A(:BLOCK) © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.5.3 CRAY MPP FORTRAN編譯器 MPP FORTRAN編譯器提供了一些工具,可用 於同步(synchronize)一些平行運作的程式。 另一種同步的方式是,讓處理元之間互通信號 (signal)。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.5.4 JAVA編譯器和執行環境 Java編譯器的運作方式,是依循5.4.3節中所 述的虛擬碼(P-code) Java編譯器所產生的目的碼,稱之為位元組碼 (bytecode),是一種與實際硬體架構無關, 並且執行於Java虛擬機器(Java Virtual Machine)上的高階目的碼。 有許多時候可能會需要較高的執行效率。在此 種狀況下,可以在執行之時將Java的bytecode 翻譯成所處平台的機械碼。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 5.5.5 編譯器的編譯器 — YACC 一個產生語法分析器的程式 YACC必須要搭配一個語彙掃描器,方能運作 順利。當語法分析器需要一個新的語彙符記時, 就必須呼叫語彙掃描器。 LEX是一種語彙掃描器的產生程式,可以產生 YACC所需的語彙掃描器。 © 2007 台灣培生教育出版(Pearson Education Taiwan) 圖5.37 LEX和YACC輸入規格的範例 © 2007 台灣培生教育出版(Pearson Education Taiwan) YACC 根據圖5.37(a) 中的輸入規格,下列敘述 let x = y * z 經過掃描後,產生的語彙符記如下: LET ID ASSIGN ID MUL ID YACC產生的語法解析器,所使用的語法解析 技術是一種「由下而上」分析法,稱之為 LALR(1) 。LALR(1) 是一種受到些微限制的 「移動-化減」分析法。 © 2007 台灣培生教育出版(Pearson Education Taiwan)