編譯器架構設計
Compiler Design – Architecture
根據編譯方式,編譯器大致可以分爲兩個階段。
Analysis Phase
作爲編譯器的前端,編譯器的分析階段讀取源程序,將其劃分爲核心部分,然後檢查詞法、語法和語法錯誤分析階段生成源程序和符號表的中間表示,應將其作爲輸入饋送到合成階段。
Synthesis Phase
作爲編譯器的後端,綜合階段通過中間源代碼表示和符號表生成目標程序。
編譯器可以有許多階段和過程。
Pass:Pass是指編譯器在整個程序中的遍歷。
Phase:編譯器的一個階段是一個可區分的階段,它接受前一階段的輸入,處理併產生可作爲下一階段輸入的輸出。Pas可以有多個相位。
編譯過程是一系列不同的階段。每個階段從其前一階段獲取輸入,有自己的源程序表示,並將其輸出饋送到編譯器的下一階段。讓我們瞭解編譯器的各個階段。
詞語分析Lexical Analysis
掃描器的第一階段是作爲文本掃描器工作的。這個階段將源代碼作爲字符流進行掃描,並將其轉換爲有意義的詞素。詞彙分析器以標記的形式表示這些詞彙:
<token-name, attribute-value>
Syntax Analysis句法分析
下一個階段稱爲語法分析或解析。它將詞法分析生成的標記作爲輸入,並生成一個解析樹(或語法樹)。在此階段,根據源代碼語法檢查標記排列,即解析器檢查標記生成的表達式在語法上是否正確。
Semantic Analysis
語義分析檢查構造的解析樹是否遵循語言規則。例如,值的賦值是在兼容的數據類型之間進行的,並將字符串添加到整數中。此外,語義分析器跟蹤標識符、它們的類型和表達式;標識符是否在使用前聲明等。語義分析器生成帶註釋的語法樹作爲輸出。
Intermediate Code Generation
中間代碼生成
在語義分析之後,編譯器爲目標機器生成源代碼的中間代碼。它代表一個抽象機器的程序。它介於高級語言和機器語言之間。此中間代碼的生成方式應使其更易於轉換爲目標機器代碼。
代碼優化Code Optimization
下一階段將對中間代碼進行代碼優化。優化可以假設爲刪除不必要的代碼行,並安排語句序列,以便在不浪費資源(CPU、內存)的情況下加快程序執行。
代碼生成 Code Generation
在此階段,代碼生成器獲取中間代碼的優化表示,並將其映射到目標機器語言。代碼生成器將中間代碼轉換爲(通常)可重新定位的機器代碼序列。機器代碼的指令序列像中間代碼那樣執行任務。
符號表Symbol Table
它是一個貫穿編譯器所有階段的數據結構。所有標識符的名稱及其類型都存儲在這裏。符號表使編譯器更容易快速搜索和檢索標識符記錄。符號表也用於範圍管理。
詞法分析是編譯器的第一個階段。它從以句子形式編寫的語言預處理器中獲取經過修改的源代碼。詞法分析器通過刪除源代碼中的任何空格或註釋,將這些語法分解爲一系列標記。
如果詞法分析器發現標記無效,它將生成一個錯誤。詞法分析器與語法分析器密切合作。它從源代碼中讀取字符流,檢查合法令牌,並在需要時將數據傳遞給語法分析器。
Tokens令牌
詞素被稱爲符號中的字符序列(字母數字)。對於每個要標識爲有效令牌的詞素,都有一些預定義的規則。這些規則是由語法規則通過模式定義的。模式解釋什麼可以是標記,這些模式是通過正則表達式定義的。
在編程語言中,關鍵字、常量、標識符、字符串、數字、運算符和標點符號可以看作是標記。
例如,在C語言中,變量聲明行
int value = 100;
包含標記:
int (keyword), value (identifier), = (operator), 100 (constant) and ; (symbol).
Specifications of Tokens
讓我們瞭解一下語言理論是如何承擔下列條件的:
字母表Alphabets
任何有限的符號集合{0,1}是一組二進制字母,{0,1,2,3,4,5,6,7,8,9,a,B,C,D,E,F}是一十六進制字母,{a-z,a-z}是一組英語字母。
字符串
任何有Strings
限的字母序列都稱爲字符串。字符串長度是字母表出現的總數,例如,字符串tutorialspoint的長度爲14,用| tutorialspoint |=14表示。沒有字母表的字符串,即長度爲零的字符串稱爲空字符串,用ε(epsilon)表示。
特殊符號Special Symbols
典型的高級語言包含以下內容符號:-
語言language
一種語言被認爲是一組有限的字符串覆蓋在一組有限的字母表上。計算機語言被認爲是有限集,可以對其進行數學上的集合運算。有限語言可以用正則表達式來描述。
Longest Match Rule最長匹配規則
當詞法分析器讀取源代碼時,它逐字掃描代碼;當遇到空白、運算符符號或特殊符號時,它決定一個單詞完成。
例如:
int intvalue;
當掃描兩個詞素到“int”時,詞法分析器無法確定它是關鍵字int還是標識符int值的首字母。
最長匹配規則規定,掃描的詞素應根據所有可用令牌中最長匹配來確定。
詞法分析器還遵循規則優先級,其中語言的保留字(例如關鍵字)比用戶輸入的優先級高。也就是說,如果詞法分析器找到與任何現有保留字匹配的詞素,它應該生成一個錯誤。
詞法分析器只需要掃描和識別屬於當前語言的有限的有效字符串/令牌/詞素集。它搜索由語言規則定義的模式。
正則表達式能夠通過定義符號的有限字符串的模式來表示有限語言。由正則表達式定義的語法稱爲正則語法。由正則語法定義的語言稱爲正則語言。
正則表達式是指定模式的重要符號。每個模式都匹配一組字符串,因此正則表達式用作一組字符串的名稱。編程語言標記可以用常規語言來描述。正則表達式的規範是遞歸定義的一個例子。常規語言易於理解並具有高效的實現。
正則表達式遵循許多代數定律,這些定律可用於將正則表達式處理爲等價形式。
Operations
The various operations on languages are:
·
Union of two languages L and M is written as
L U M = {s| s is in L or s is in M}
·
Concatenation of two languages L and M is written as
LM = {st |s is in L and t is in M}
·
The Kleene Closure of a language
L is written as
L* = Zero or more occurrence of language L.
Notations
If r and s are regular expressions denoting the languages L® and L(s), then
·
Union : ®|(s) is a regular expression denoting L® U L(s)
·
Concatenation : ®(s) is a regular expression denoting L®L(s)
·
Kleene closure : ®* is a regular expression denoting (L®)*
·
® is a regular expression denoting L®
Precedence and Associativity優先性和關聯性
concatenation (.), and | (pipe sign) are left associative
*
has the highest precedence
Concatenation
(.) has the second highest precedence.
|
(pipe sign) has the lowest precedence of all.
在正則表達式中表示語言的有效標記
If x is a regular expression, then:
· x* means zero or more occurrence
of x.
i.e., it can generate { e, x, xx, xxx, xxxx, … }
· x+ means one or more occurrence of x.
i.e., it can generate { x, xx, xxx, xxxx … } or x.x*
· x? means at most one occurrence of x
i.e., it can generate either {x} or {e}.
[a-z] is all lower-case alphabets of English language.
[A-Z] is all upper-case alphabets of English language.
[0-9] is all natural digits used in mathematics.
用正則表達式表示符號的出現
letter = [a – z] or [A – Z]
digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 or [0-9]
sign = [ + | - ]
使用正則表達式表示語言標記
Decimal = (sign)?(digit)+Identifier = (letter)(letter | digit)*
詞彙分析器剩下的唯一問題是如何驗證用於指定語言關鍵字模式的正則表達式的有效性。一個公認的解決方案是使用有限自動機進行驗證。