編譯原理四元式系統特色
『壹』 編譯原理中的拉鏈和回填到底什麼意思
回填技術是指控制語句中布爾表達式翻譯成四元式序列時,有的轉移地址不能在產生這些四元式的同時得知,需要在適當的時候回填這個地址。 拉鏈技術是指為了記錄需要回填地址的四元式,把需要回填E•ture的四元式拉成一條鏈,稱為「真鏈」;把需...
『貳』 編譯原理 四元式
四元式是一種比較普遍採用的中間代碼形式。
代碼段的四元式表達式:
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:(程序繼續執行)
(2)編譯原理四元式系統特色擴展閱讀:
四元式是一種更接近目標代碼的中間代碼形式。由於這種形式的中間代碼便於優化處理,因此,在目前許多編譯程序中得到了廣泛的應用。
四元式實際上是一種「三地址語句」的等價表示。它的一般形式為:
(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)
『叄』 編譯原理寫出語句 if(a<b)then x:=y z;else x:=y-z ;的四元式表示
(100) if a<b goto (102)
(101) goto (105)
(102) t:=y+z //若不是+,需要進行相應修改
(103) x:=t
(104) goto (107)
(105) t:=y-z
(106) x:=t
(107)…
註: 原題if(a<b)then x:=y z,y和z之間的運算符沒給出,四元式中寫成了+,若是其他運算符進行相應修改即可
『肆』 什麼是目標代碼
目標代碼是指源代碼經過編譯程序產生的能被CPU直接識別的二進制代碼。
目標代碼的形式
目標代碼生成是以中間代碼作為輸入,將其轉換成特定機器的機器語言或匯編語言作為輸出。在此以四元式序列作為它的加工對象,輸出目標代碼的形式有三種:具有絕對地址的機器語言程序,具有相對地址的機器碼程序和匯編指令程序。
具有絕對地址的機器語言程序在存儲空間中有固定的存儲位置,一旦產生此種形式的目標代碼之後,便可立即執行,因此這種形式最為迅速有效,但它並不靈活,不適合大型程序。
具有相對地址的機器語言程序由若干個目標模塊組成,各個模塊中都包含目標程序中的一部分代碼,可將它們裝人到存儲空間的任何位置,然後由連接裝配程序將它們連接在一起之後執行。顯然,連接裝配程序增加了開銷,但這種形式有較大的靈活性,所以為許多編譯程序所採用。
目標代碼生成程序可以產生匯編語言形式的目標代碼,這種形式在實現上要比前兩種形式容易。當然,這種形式的目標代碼還需經匯編後才能成為可執行代碼。
目標代碼的生成
目標代碼生成是編譯程序的最後一個工作階段,其任務是把經優化處理之後的中間代碼變換成特定機器上的機器語言程序或匯編語言程序,實現最終的翻譯工作。由於目標語言依賴於硬體系統,因而如何充分利用現有的寄存器以節省訪問內存的時間,合理地選擇執行速度快的指令,生成盡可能短且有效的目標代碼是這個階段考慮的主要問題。
如果代碼生成程序以四元式形式的中間代碼序列作為輸入,在其生成目標代碼時,可假定每個四元式中的運算符及運算對象的數據類型均已知道,所需的全部類型轉換操作均已在中間代碼中得到體現。此外,如果出現在程序中的全部符號名運行時所需的存儲空間均已得到分配,它們所在的數據區編號及相對地址已分別填人符號表各相應登記項欄中。所以在四元式中,僅出現符號名在符號表中登記項的序號。
參考文獻
龍馬工作室編著.第8章 CSS+Div常見用法 Dreamweaver CS5從新手到高手.人民郵電出版社,2011.02.
張晶主編.第11章 目標代碼生成 編譯原理.哈爾濱工程大學出版社,2011.08.
王麗芳,張靜,李富萍等編著.第三章 程序設計語言和方法 計算機科學導論.清華大學出版社,2012.01.
『伍』 編譯原理四元式
四元式的一般形式為(op, arg1, arg2, result),其中:op為一個二元(也可以是零元或一元)運算符。arg1和arg2為兩個運算對象,可以是變數、常數或者系統定義的臨時變數名。result為運算結果。
第一步:T1=a*b,
第二步:T2=c*d,
第三步:T3=T2/e,
第四步:T4=T1-T3,
第五步:f=T4.
『陸』 編譯原理問題,求解答
好,我來幫你理解一下,先看基本知識:
四元式是一種比較普遍採用的中間代碼形式。四元式的四個組成成分是:算符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<b
這是一個表達式,它的結果要麼是0,要麼是1,因為沒有指定這個表達式存放在哪,所以需要一個臨時變數來存放它的,在你的問題中,就是T。很顯然T有2個值:0或者1
因此,有
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:(程序繼續執行)