編譯原理元
『壹』 編譯原理學了有什麼用
對大多數人來說,學過編譯原理,應該可以知道對於很多代碼的優化,編譯器其實可以做好,不需要自己寫代碼的時候杞人憂天。在通用、局部的優化上,甚至編譯器往往做得比程序員好。
大概率會意識到編譯原理背後的故事,也許會沉迷在某個方向,也許還會樂於看一些奇妙的parser構建方式。
大概還可能會去學習類型系統,發現形式化的故事似乎在很多方面都有對應的版本,而後,他們也許會嘗試走向研究,去挑戰目前都沒有好好解決的代碼優化問題,也許會走向應用,用起LLVM,在上面加個target,支持一些新硬體,做個新語言的前端等。
編譯原理是計算機專業的一門重要專業課,旨在介紹編譯程序構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。 編譯原理是計算機專業設置的一門重要的專業課程。
編譯原理課程是計算機相關專業學生的必修課程和高等學校培養計算機專業人才的基礎及核心課程,同時也是計算機專業課程中最難及最挑戰學習能力的課程之一。編譯原理課程內容主要是原理性質,高度抽象。
編譯可以分為五個基本步驟:詞法分析、語法分析、語義分析及中間代碼的生成、優化、目標代碼的生成。這是每個編譯器都必須的基本步驟和流程, 從源頭輸入高級語言源程序輸出目標語言代碼。
1、詞法分析
詞法分析器是通過詞法分析程序對構成源程序的字元串從左到右的掃描, 逐個字元地讀, 識別出每個單詞符號, 識別出的符號一般以二元式形式輸出, 即包含符號種類的編碼和該符號的值。
詞法分析器一般以函數的形式存在, 供語法分析器調用。當然也可以一個獨立的詞法分析器程序存在。完成詞法分析任務的程序稱為詞法分析程序或詞法分析器或掃描器。
2、語法分析
語法分析是編譯過程的第二個階段。這階段的任務是在詞法分析的基礎上將識別出的單詞符號序列組合成各類語法短語, 如「語句」, 「表達式」等.語法分析程序的主要步驟是判斷源程序語句是否符合定義的語法規則, 在語法結構上是否正確。
而一個語法規則又稱為文法, 喬姆斯基將文法根據施加不同的限制分為0型、1型、2型、3型文法, 0型文法又稱短語文法, 1型稱為上下文有關文法, 2型稱為上下文無關文法, 3型文法稱為正規文法, 限制條件依次遞增。
3、語義分析
詞法分析注重的是每個單詞是否合法, 以及這個單詞屬於語言中的哪些部分。語法分析的上下文無關文法注重的是輸入語句是否可以依據文法匹配產生式。
那麼, 語義分析就是要了解各個語法單位之間的關系是否合法。實際應用中就是對結構上正確的源程序進行上下文有關性質的審查, 進行類型審查等。
4、中間代碼生成與優化
在進行了語法分析和語義分析階段的工作之後, 有的編譯程序將源程序變成一種內部表示形式, 這種內部表示形式叫做中間語言或中間表示或中間代碼。
所謂「中間代碼」是一種結構簡單、含義明確的記號系統, 這種記號系統復雜性介於源程序語言和機器語言之間, 容易將它翻譯成目標代碼。另外, 還可以在中間代碼一級進行與機器無關的優化。
5、目標代碼的生成
根據優化後的中間代碼, 可生成有效的目標代碼。而通常編譯器將其翻譯為匯編代碼, 此時還需要將匯編代碼經匯編器匯編為目標機器的機器語言。
6、出錯處理
編譯的各個階段都有可能發現源碼中的錯誤, 尤其是語法分析階段可能會發現大量的錯誤, 因此編譯器需要做出錯處理, 報告錯誤類型及錯誤位置等信息。
『貳』 編譯原理三元式a:=0怎麼樣表示呢
一.(15分)有表達式如下:A+B*(C-D)**N (**為冪乘) (1)給出該表達式的逆波蘭式表示(後綴式); (2)給出上述表達式的四元式和三元式序列. 一起考研社區真情奉獻 二.(15分)有C程序如下: main() { printf("%d,%d,%d\n",10); } (1)試著寫出上述printf語句輸出的結果; (2)從運行環境和printf的實現分析為什麼會有這樣的輸出結果. www.17ky.cn獨家資料 三.(5分)構造一個DFA(確定的有限自動機),使之接受含偶數個"1"的0,1串集. www.17ky.cn會員奉獻 四.(5分)有文法G,其產生式如下: S->S(S), S->ε /*空產生式*/ 試寫出一個語法制導定義,它輸出配對的括弧個數. www.17ky.cn獨家提供 五.(10分)已知某語言L={a^(m)b^(n)|n>m>=0}.試寫出產生該語言的兩個文法G1和 G2,其中G1是LR(1)文法,G2是非LR(1)和非二義性文法. 更多考研真題,請光臨www.17ky.cn 六.填空(每空一分,共20分) 1.現代操作系統的兩個最基本的特徵是___和___. 2.進程式控制制塊的初始化工作包括___,___和___. 3.在操作系統中引入線程概念的主要目的是___. 4.unix系統v中,系統向用戶提供的用於創建新進程的系統調用是___;用於建立無名 管道的系統調用是___;用於創建有名管道的系統調用是___. 5.unix系統v中,引起進程調度的原因有___,___,___和___等. 6.在分區分配演算法中,首次適應演算法傾向於優先利用內存中___部分的空閑分區,從 而保留了___部分的大空閑區. 7.進行設備分配時所需的數據表格主要有___,___,___和___等. 8.利用符號鏈實現文件共享時,對文件主刪除了共享文件後造成的指針懸空問題,解 決的方法是___. 更多考研真題,請光臨www.17ky.cn 七.(8分)在消息傳遞通信方式下, A.發送進程和接收進程在通信過程中可以採用那三種同步方式? B.試以下面給出的發送進程和接收進程(將接收到的數據存入S)為例,說明當接收進 程執行到標號為L2的語句時,採用這三種同步方式,X的值可能各是多少? 一起考研社區真情奉獻 發送進程P: 接收進程Q: M=10; L1: send M to Q; L1: receive S from P; L2: M=20; L2: X:=S+1; goto L1; 更多考研真題,請光臨www.17ky.cn 八.(8分)一系統具有150個存儲單元,在T0時刻按下表所示分配給3個進程: 進程Maximum demand Current allocation P1 70 25 P2 60 40 P3 60 45 對下列請求應用銀行家演算法分析判定是否是安全的: A.第4個進程P4到達,最大需求60個存儲單元,當前請求分配25個單元. B.第4個進程P4到達,最大需求50個存儲單元,當前請求分配35個單元. 如果是安全的請給出一個可能的進程安全執行序列.如果是不安全的,請說明原因. 更多考研真題,請光臨www.17ky.cn 九、(14分)設正在處理器上執行的一個進程的頁表如下.頁表的虛頁號和物理塊號 是十進制數,起始頁號(塊號)均為0.所有的地址均是存儲器位元組地址,頁的大小為 1024位元組. A.詳述在設有快表的請求分頁存儲管理系統中,一個虛地址轉換成物理內存地址的過程. B.下列虛地址對應與什麼物理地址: (1)5499; (2) 2221; 虛頁號 狀態位 訪問位 修改位 物理塊號 0 1 1 0 4 1 1 1 1 7 2 0 0 0 --- 3 1 0 0 2 4 0 0 0 --- 5 1 0 1 0 www.17ky.cn獨家提供 注釋:訪問位---當某頁被訪問時,其訪問位被置為1. www.17ky.cn考研人的成功俱樂部 編譯原理與操作系統 參考答案 一. (1)後綴式:ABCD-*+ECD-N**/+ (2) 四元式 三元式 (1)( - , C , D , t1) (1)( - , C , D ) (2)( * , B , t1, t2) (2)( * , B ,(1)) (3)( +, A , t2, t3) (3)( +, A ,(2)) (4)( - , C , D, t4) (4)( - , C , D ) (5)(**, t4, N , t5) (5)(**, (4), N) (6)( / , E , t5, t6) (6)( / ,E ,(5)) (7)( +, t3, t6, t7) (7)( +,(3),(6))
『叄』 漢語程序設計語言的編譯原理
漢編系統是一個互動式的程序設計環境,最初是為程序員在小型和微型計算機上開發應用程序而設計的。主要應用於科學計算和工業控制,比如儀器、機器人、過程式控制制、圖形和圖像處理、人工智慧和商業應用。漢編語言的主要優點是軟體開發快速、互動式、計算機硬體的高效使用等。
漢編語言與傳統語言最大的不同是它的可擴展性。漢編語言的編程過程就是定義新的詞,詞實際上就是語言的新命令。詞可以用一系列以前定義的詞來定義,這個過程與教育孩子的過程相似:我們總是用孩子們以前理解的概念來教給孩子們新的概念,而這些詞被稱為「高級定義」。同樣,新的詞也可以用匯編代碼定義。
可擴展性的結果是我們在開發一個應用的同時,也間接地開發了一個特殊的、針對這一類應用的「面向應用的模塊,它可以用於或者經過修改之後被用於相似的應用。
漢編語言的可擴展性並不僅僅是為語言自身增加新的命令,所以不要把定義詞與傳統高級語言定義函數、過程等同。漢編系統還能對定義詞(建詞)進行擴展,創建一個可以定義其它詞的詞,這種詞被稱為「定義詞」。在創建這樣一個定義詞的時候,程序員能夠指定它所創建的詞在編譯時間、運行時間或者這兩種狀態下的特殊行為。這個能力允許我們定義特殊的數據類型,並對其行為和結構實施完全的控制。又由於這種詞的運行時行為可以用高級語言或者匯編語言來定義,所以由定義詞創建的詞將具有與其它漢編詞一樣的性能。系統也允許我們增加一個新的「編譯指示符」以實現特殊類型的循環或者其它的控制結構。比如,漢語言定義一個程序變數的詞:給,其代碼大概如下:
編給(32位數-<變數名>-)編譯時
(---32位數)運行時
建詞可用地址4位元組空出寫
動作讀
。
定義變數時
5給變數一
則5被自動寫入變數一的實體域中
運行「變數一」時
變數一
則變數一實體域中的數字5被自動讀取,放到數摞上 漢編詞可以使用以前定義的詞或者匯編代碼來定義,它們與其它語言的子程序相似,也與其它語言的命令等效。漢編系統允許我們在鍵盤上打入一條指令的詞名,這個詞將被立即執行。然而,如果我們把功能的詞名放到定義中,將編譯成對於這個詞的引用。
高級詞是由其它詞的集合來定義的,我們可以把這個過程想像成是其它語言的宏。新的詞被加入到它們可以使用的存儲器中,其定義被加入到詞典中。在一個漢編詞的命名規則中,只有很少的幾個字元不能作為詞名使用。
當遇到一個詞的時候,漢編系統就通過詞典搜索希望找到這個詞的定義,如果找到這個詞定義的功能,或者被立即執行,或者作為引用而被編譯到新的定義中。然而,如果在詞典中沒有找到這個詞,系統就試著把它轉換成一個數。如果轉換成功,就把它放在數摞上。如果不能轉換成數字,就顯示這個未定義的詞名並列印出一個錯誤的信息來報告這個詞是系統所不知道的。
漢編詞的執行流程大概可以用一個詞來模擬如下:
編查詞測試
{詞名串--}
255個位元組空給詞名串
詞名串255填0
詞名串字串傳送
詞名串(查詞)
0=
就
計位元組
串>數
就
♀
否則
字串未定義詞名串字串+傳送
詞名串計位元組
回車印字串
全復位
然後
否則
執行
然後
。★
字串看數摞查詞測試數摞已空!★
字串123456查詞測試★.
看數摞[1]123456★.
顯123456★
字串看方法查詞測試
看方法未定義
漢編系統編譯流程如右圖(流程圖來源:漢編新浪博客)所示。
漢編語言堅持「結構化程序設計」原理:
·詞必須在引用之前被定義;
·邏輯流限制只有順序、條件和循環,有專門的詞用於實現常用的程序控制結構;
·程序員使用許多小的、獨立的模塊(詞)來實現最大的可測試性和可靠性;
這種方法有兩個明顯的優點
·新的詞總是用以前定義和測試過的詞來構造,所以調試更容易。模塊可以單獨執行以測試它的功能;
·固有的模塊性使漢編語言成為一個「設計性語言」,允許自頂向下的設計同時保持自底向上的測試。一個詞可以在不同的程序中使用,但是它的功能只需要定義一次;
這些都保證了漢編軟體能夠快速和有效地被開發,同時,如果管理得當,也可以作為自身文檔的基礎。
漢編語言的5個主要元素決定了它的特點:
·一個詞典;
·兩個數摞,一個是參數摞,另一個是用於嵌套的返回摞;
·鍵盤(輸入流)解釋器;
·一個編譯器;
·虛擬存儲; 詞典是漢編定義詞的數據和代碼存儲空間,也為編譯建立了詞的索引。詞典中的詞包括漢編程序代碼詞、常數定義詞、變數定義詞、不定量定義詞,面向對象部分還有模板、對象、對象事件、消息。
漢編代碼存儲在詞典中。詞典占據了系統存儲器的很大部分,它由一個串線鏈接的可變長度的項目組成,每個項目定義了一個詞。每個定義的內容根據詞的類型(數據項、常數、操作序列等)而有所不同,詞典是可擴展的。
詞是由「定義詞」加入詞典的,最常用的定義詞是「編。」當「編」執行的時候,馬上就把後面的詞名掃描,建立一個詞典項,然後進入「編譯」模式。有許多不同的編譯方法,最常用的是「串線編碼」,這種方法把定義編譯成一系列以前定義詞的地址引用。詞的定義由「。」(句號)結束。下面就是一個詞的定義:
編平方(--)♂*顯。
當一個詞名項被編譯到詞典中的時候(稱為定義的首部),它包含一個指向詞典中前一個首部的指針。新詞的詞名加入詞典(這里就是平方),接著一個指向詞名為「(編)」子程序調用的指針編譯到詞典中作為定義的第一部分,這個指針指向一段在解釋定義體時需要執行的代碼。當然,這里所說的不是唯一的編譯技術,但它的應用最為普遍,這種技術稱為間接串線編碼,因為定義中的第一個項目是一段代碼的引用,這段代碼知道如何解釋定義的其它部分。
定義的其它部分稱為這個定義的體。在編譯模式下,系統將依次尋找每個詞的首部。每個首部地址依次放到定義體中,這樣就產生了一個地址列表。最後在到達「。」時,詞名為「。」的子程序地址被編譯進詞典。「。」子程序用來將控制返回到調用詞,就像一個子程序返回一樣。
『肆』 編譯原理 四元式
四元式是一種比較普遍採用的中間代碼形式。
代碼段的四元式表達式:
101 T:=0 (表達式為假的出口)
103 T:=1 (表達式為真的出口)
因為用戶的表達式只有一個A<B,因此A<B的真假出口就是表達式的真假出口,所以
100: if a<b goto 103 (a<b為真,跳到真出口103)
101: T:=0(否則,進入假出口)
102: goto 104 (要跳過真出口,否則T的值不就又進入真出口了,為真)
103: T:=1
104:(程序繼續執行)
(4)編譯原理元擴展閱讀:
四元式是一種更接近目標代碼的中間代碼形式。由於這種形式的中間代碼便於優化處理,因此,在目前許多編譯程序中得到了廣泛的應用。
四元式實際上是一種「三地址語句」的等價表示。它的一般形式為:
(op,arg1,arg2,result)
其中, op為一個二元 (也可是一元或零元)運算符;arg1,arg2分別為它的兩個運算 (或操作)對象,它們可以是變數、常數或系統定義的臨時變數名;運算的結果將放入result中。四元式還可寫為類似於PASCAL語言賦值語句的形式:
result ∶= arg1 op arg2
需要指出的是,每個四元式只能有一個運算符,所以,一個復雜的表達式須由多個四元式構成的序列來表示。例如,表達式A+B*C可寫為序列
T1∶=B*C
T2∶=A+T1
其中,T1,T2是編譯系統所產生的臨時變數名。當op為一元、零元運算符 (如無條件轉移)時,arg2甚至arg1應預設,即result∶=op arg1或 op result ;對應的一般形式為:
(op,arg1,,result)
或
(op,,,result)
『伍』 編譯原理中 文法 文法G定義為四元組(Vn ,Vt,P,S)這4個是什麼意思 另外 終結符和非終結符是什麼意思
文法G是一個四元式(Vt,Vn,S,P)
其中Vt是一個非空有限集,它的每個元素稱為終結符號
Vn是一個非空有限集,它的每個元素稱為非終結符號(Vt和Vn的交集為空)
S是一個非終結符號,稱為開始符號
P是一個產生式集合(有限),每個產生式的形式是P-->a
開始S必須在某個產生式的左部出現一次
終結符指組成語言的基本符號(如基本字、標識符、常數、算符、界符)
非終結符號(也稱語法變數)表示一定符號串的集合。
你看到小寫字母一般是終結符,大寫字母肯定是非終結符
不明白可以聯系。
『陸』 編譯原理四元式
四元式的一般形式為(op, arg1, arg2, result),其中:op為一個二元(也可以是零元或一元)運算符。arg1和arg2為兩個運算對象,可以是變數、常數或者系統定義的臨時變數名。result為運算結果。
第一步:T1=a*b,
第二步:T2=c*d,
第三步:T3=T2/e,
第四步:T4=T1-T3,
第五步:f=T4.
『柒』 編譯原理文法
編譯原理文法的概念為:每一種自然語言或者是編程語言都需要文法來描述,文法相當於語言學的語義分析,即分析每一句話所表示的含義,編譯器需要利用文法來完成其語法分析和語義分析。
字母表是元素的非空有窮集合,字母表中的元素稱之為符號,因此,字母表也稱之為符號集。例如C語言中的字母表由字母、數字、關鍵字等組成。
符號串,就是由符號集中的元素組成的序列。例如,給定符號集a、b、c,那麼abc、abb、ac就是由該符號集組成的符號串。一個文法中,含有一個,或多個產生式,產生式,描述了將終結符集合和非終結符集合組合成串的方法。
『捌』 編譯原理 四元式問題,a
好,我來幫你理解一下,先看基本知識:
四元式是一種比較普遍採用的中間代碼啟余形式.四元式的四個組成成分是:算符op,第一和第二運算對象ARG1和ARG@及運算結果RESULT.運算對象和運算結果有時指用戶自己姿兄定義的變數,有時指編譯程序引進的臨時變數.例如a∶=b*c+b*d的四元式表示如下:
(1)(*,b,c,t1)
(2)(*,b,d,t2)
(3)(+,t1,t2,t3)
(4)(∶=,t3,-,a)
四元式和三元式的主要不同在於,四元式對中間結果的引用必須通過給定的名字,而三元式是通過產生中間結果的三元式編號.也就是說,四元式之間的聯系是通過臨時變數實現的.
有時,為了更直觀,也把四元式的形式寫成簡單賦值形式或更易理解的形式.比如把上述四元式序列寫成:
(1)t1∶=b*c
(2)t2∶=b*d
(3)t3∶=t1+t2
(4)a∶=t3
把(jump,-,-,L)寫成goto L
把(jrop,B,C,L)寫成if B rop C goto L
好,下面分析一下a,6,
jjttll 舉報
״̬ô
Ƚ跡旁襲ϼ,