編譯綜合屬性
⑴ VHDL 編譯,闡述和 綜合 之間的關系
編譯、精細化、綜合是數字系統設計中的概念,而VHDL只是數字系統設計中的一種硬體描述語言。
所謂編譯(Compile)是借用軟體系統中的概念,在數字系統設計中,是指包含多個環節的一個完整過程。這些環節主要有:分析(Analysis)、精細化(Elabortion)、綜合(Synthesis)、適配(Fitter)、匯編(Assembler)等。分析——檢查語法;精細化——建立資料庫、為綜合進行初始化;綜合——將高層次描述轉化為低層次描述並優化代碼、適配——布局和布線、匯編——產生配置數據。
⑵ 編譯原理全部的名詞解釋
書上有別那麼懶!。。。。
編譯過程的六個階段:詞法分析,語法分析,語義分析,中間代碼生成,代碼優化,目標代碼生成
解釋程序:把某種語言的源程序轉換成等價的另一種語言程序——目標語言程序,然後再執行目標程序。解釋方式是接受某高級語言的一個語句輸入,進行解釋並控制計算機執行,馬上得到這句的執行結果,然後再接受下一句。
編譯程序:就是指這樣一種程序,通過它能夠將用高級語言編寫的源程序轉換成與之在邏輯上等價的低級語言形式的目標程序(機器語言程序或匯編語言程序)。
解釋程序和編譯程序的根本區別:是否生成目標代碼
句子的二義性(這里的二義性是指語法結構上的。):文法G[S]的一個句子如果能找到兩種不同的最左推導(或最右推導),或者存在兩棵不同的語法樹,則稱這個句子是二義性的。
文法的二義性:一個文法如果包含二義性的句子,則這個文法是二義文法,否則是無二義文法。
LL(1)的含義:(LL(1)文法是無二義的; LL(1)文法不含左遞歸)
第1個L:從左到右掃描輸入串 第2個L:生成的是最左推導
1 :向右看1個輸入符號便可決定選擇哪個產生式
某些非LL(1)文法到LL(1)文法的等價變換: 1. 提取公因子 2. 消除左遞歸
文法符號的屬性:單詞的含義,即與文法符號相關的一些信息。如,類型、值、存儲地址等。
一個屬性文法(attribute grammar)是一個三元組A=(G, V, F)
G:上下文無關文法。
V:屬性的有窮集。每個屬性與文法的一個終結符或非終結符相連。屬性與變數一樣,可以進行計算和傳遞。
F:關於屬性的斷言或謂詞(一組屬性的計算規則)的有窮集。斷言或語義規則與一個產生式相聯,只引用該產生式左端或右端的終結符或非終結符相聯的屬性。
綜合屬性:若產生式左部的單非終結符A的屬性值由右部各非終結符的屬性值決定,則A的屬性稱為綜合屬
繼承屬性:若產生式右部符號B的屬性值是根據左部非終結符的屬性值或者右部其它符號的屬性值決定的,則B的屬性為繼承屬性。
(1)非終結符既可有綜合屬性也可有繼承屬性,但文法開始符號沒有繼承屬性。
(2) 終結符只有綜合屬性,沒有繼承屬性,它們由詞法程序提供。
在計算時: 綜合屬性沿屬性語法樹向上傳遞;繼承屬性沿屬性語法樹向下傳遞。
語法制導翻譯:是指在語法分析過程中,完成附加在所使用的產生式上的語義規則描述的動作。
語法制導翻譯實現:對單詞符號串進行語法分析,構造語法分析樹,然後根據需要構造屬性依賴圖,遍歷語法樹並在語法樹的各結點處按語義規則進行計算。
中間代碼(中間語言)
1、是復雜性介於源程序語言和機器語言的一種表示形式。
2、一般,快速編譯程序直接生成目標代碼。
3、為了使編譯程序結構在邏輯上更為簡單明確,常採用中間代碼,這樣可以將與機器相關的某些實現細節置於代碼生成階段仔細處理,並且可以在中間代碼一級進行優化工作,使得代碼優化比較容易實現。
何謂中間代碼:源程序的一種內部表示,不依賴目標機的結構,易於代碼的機械生成。
為何要轉換成中間代碼:(1)邏輯結構清楚;利於不同目標機上實現同一種語言。
(2)便於移植,便於修改,便於進行與機器無關的優化。
中間代碼的幾種形式:逆波蘭記號 ,三元式和樹形表示 ,四元式
符號表的一般形式:一張符號表的的組成包括兩項,即名字欄和信息欄。
信息欄包含許多子欄和標志位,用來記錄相應名字和種種不同屬性,名字欄也稱主欄。主欄的內容稱為關鍵字(key word)。
符號表的功能:(1)收集符號屬性 (2) 上下文語義的合法性檢查的依據: 檢查標識符屬性在上下文中的一致性和合法性。(3)作為目標代碼生成階段地址分配的依據
符號的主要屬性及作用:
1. 符號名 2. 符號的類型 (整型、實型、字元串型等))3. 符號的存儲類別(公共、私有)
4. 符號的作用域及可視性 (全局、局部) 5. 符號變數的存儲分配信息 (靜態存儲區、動態存儲區)
存儲分配方案策略:靜態存儲分配;動態存儲分配:棧式、 堆式。
靜態存儲分配
1、基本策略
在編譯時就安排好目標程序運行時的全部數據空間,並能確定每個數據項的單元地址。
2、適用的分配對象:子程序的目標代碼段;全局數據目標(全局變數)
3、靜態存儲分配的要求:不允許遞歸調用,不含有可變數組。
FORTRAN程序是段結構,不允許遞歸,數據名大小、性質固定。 是典型的靜態分配
動態存儲分配
1、如果一個程序設計語言允許遞歸過程、可變數組或允許用戶自由申請和釋放空間,那麼,就需要採用動態存儲管理技術。
2、兩種動態存儲分配方式:棧式,堆式
棧式動態存儲分配
分配策略:將整個程序的數據空間設計為一個棧。
【例】在具有遞歸結構的語言程序中,每當調用一個過程時,它所需的數據空間就分配在棧頂,每當過程工作結束時就釋放這部分空間。
過程所需的數據空間包括兩部分
一部分是生存期在本過程這次活動中的數據對象。如局部變數、參數單元、臨時變數等;
另一部分則是用以管理過程活動的記錄信息(連接數據)。
活動記錄(AR)
一個過程的一次執行所需要的信息使用一個連續的存儲區來管理,這個區 (塊)叫做一個活動記錄。
構成
1、臨時工作單元;2、局部變數;3、機器狀態信息;4、存取鏈;
5、控制鏈;6、實參;7、返回地址
什麼是代碼優化
所謂優化,就是對代碼進行等價變換,使得變換後的代碼運行結果與變換前代碼運行結果相同,而運行速度加快或佔用存儲空間減少。
優化原則:等價原則:經過優化後不應改變程序運行的結果。
有效原則:使優化後所產生的目標代碼運行時間較短,佔用的存儲空間較小。
合算原則:以盡可能低的代價取得較好的優化效果。
常見的優化技術
(1) 刪除多餘運算(刪除公共子表達式) (2) 代碼外提 +刪除歸納變數+ (3)強度削弱; (4)變換循環控制條件 (5)合並已知量與復寫傳播 (6)刪除無用賦值
基本塊定義
程序中只有一個入口和一個出口的一段順序執行的語句序列,稱為程序的一個基本塊。
給我分數啊。。。
⑶ 計算機編譯原理什麼是NFA
ε只能出現在NFA中,當然不是為了方便直觀,而是連通NFA和DFA的橋梁。編譯原理講授的不是如何繪制NFA或者DFA,二是告訴讀者怎樣能夠自動實現NFA或DFA的構造。在實際應用中ε可以幫助計算機轉換NFA為DFA,而在屬性文法和語法制導階段,它也是溝通綜合屬性與繼承屬性、執行語義動作不可或缺的一部分。另外ε的使用可以大大簡化文法產生式的構造難度。我記得最初使用ε是為了使得文法體系(字母表)更加完善,但是在實際應用中卻變得應用廣泛(此觀點不一定正確)。最後想說的是,在編譯中,ε也帶來了不小的麻煩,否則也就不會有諸如「去空產生式」這樣的演算法了:)
⑷ 編譯程序包括哪幾個主要組成部分
編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。
編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。
(4)編譯綜合屬性擴展閱讀:
對於c編譯程序來說,其語言的特點如下:
1、c語言是一種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護,而且表現能力和處理能力極強。
2、c語言具有豐富的運算符和數據類型,便於實現各類復雜的數據結構。它還可以直接訪問內存的物理地址,進行位(bit)一級的操作。
3、由於c語言實現了對硬體的編程操作,因此集高級語言和低級語言的功能於一體。它既可用於系統軟體的開發,也適合於應用軟體的開發。
4、此外,c語言還具有效率高、可移植性強等特點。因此它廣泛地移植到了各類各型計算機上,從而形成了多種版本。
⑸ 綜合屬性和繼承屬性有何區別
綜合屬性和繼承屬性區別是繼承屬性是從上而下傳遞信息,綜合屬性自下而上傳遞信息。終結符號只有綜合屬性,非終結符號既有綜合屬性也可有繼承屬性。
屬性與變數一樣,可以進行計算和傳遞。可以類比我們平時寫代碼時候一些成員變數。屬性又分為綜合屬性和繼承屬性。
綜合屬性注意:
1、對屬性的處理有計算、傳遞信息等,屬性處理的過程也就是語義處理過程。
2、當然,處理時必須遵循一定的規則。為此,為每個文法規則式都定義一組屬性的計算規則,稱為語義規則。
⑹ 表達式翻譯用到的是綜合屬性還是繼承屬性
都要用到啊。綜合屬性和繼承屬性是按計算方向區分的,不是用一個就能搞定的。你說的翻譯,肯定兩個都用到;如果只是求值,可以只用綜合屬性(要除去最後一步把求出的值存儲)。
⑺ 編譯程序有哪些主要構成成分它們各自的主要功能是什麼
編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。
編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。
例如,可以把詞法分析作為第一遍;語法分析和語義分析作為第二遍;代碼優化和存儲分配作為第三遍;代碼生成作為第四遍。
反之,為了適應較小的存儲空間或提高目標程序質量,也可以把一個邏輯步驟的工作分為幾遍去執行。例如,代碼優化可劃分為代碼優化准備工作和實際代碼優化兩遍進行。
(7)編譯綜合屬性擴展閱讀
從左至右逐個字元地對源程序進行掃描,產生一個個的單詞符號,把作為字元串的源程序改造成為單詞符號串的中間程序。執行詞法分析的程序稱為詞法分析程序或掃描器。
源程序中的單詞符號經掃描器分析,一般產生二元式:單詞種別;單詞自身的值。單詞種別通常用整數編碼,如果一個種別只含一個單詞符號,那麼對這個單詞符號,種別編碼就完全代表它自身的值了。若一個種別含有許多個單詞符號,那麼,對於它的每個單詞符號,除了給出種別編碼以外,還應給出自身的值。
詞法分析器一般來說有兩種方法構造:手工構造和自動生成。手工構造可使用狀態圖進行工作,自動生成使用確定的有限自動機來實現。
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。編譯程序的語法規則可用上下文無關文法來刻畫。
⑻ 編譯的詞法分析中,ε有何用,僅僅是為了畫NFA圖方便嗎為什麼DFA圖中沒有ε
ε只能出現在NFA中,當然不是為了方便直觀,而是連通NFA和DFA的橋梁。編譯原理講授的不是如何繪制NFA或者DFA,二是告訴讀者怎樣能夠自動實現NFA或DFA的構造。在實際應用中ε可以幫助計算機轉換NFA為DFA,而在屬性文法和語法制導階段,它也是溝通綜合屬性與繼承屬性、執行語義動作不可或缺的一部分。另外ε的使用可以大大簡化文法產生式的構造難度。我記得最初使用ε是為了使得文法體系(字母表)更加完善,但是在實際應用中卻變得應用廣泛(此觀點不一定正確)。
最後想說的是,在編譯中,ε也帶來了不小的麻煩,否則也就不會有諸如「去空產生式」這樣的演算法了:)
⑼ 很多編譯程序採用的基於屬性文法的語義處理過程稱為什麼
首先,我們給出語義屬性的定義。
定義 5.1一文法符號X∈VN∪VT的語義性質稱為該文法符號的語義屬性(Semantic Attributes),簡稱為屬性。我們用A(X)表示X的所有屬性的集合。每個屬性表示X的一個特定性質,並可任意指定其取值范圍。下面,我們將用X.a表示A(X)中的屬性a。
由定義5.1可知,文法符號的屬性就是它的語義性質。屬性可表徵諸如數、符號串、類型、存儲空間和其它需表徵的實體。就終結符號而言,它至少有一種屬性,即詞文。當然,它還可能具有其它屬性,例如,對3.2.1中所定義的無符號數,單詞「123」就是它的詞文;而其數值和類型(整型)是它的另外兩個屬性。一般來說,終結符號的屬性是其內在性質;當然也有些屬性將從其它符號的屬性中獲取。例如,變數標識符的類型屬性,將從類型定義語句中獲取,也就是說,它是通過語法樹從其它符號的屬性中獲取的。對非終結符號而言,其屬性之值均須從其它符號的屬性經計算而得,或者說,是由其它符號的屬性定義的。
可見,各個文法符號的屬性之間,可能存在某種依賴關系,這種依賴關系可用屬性規則(語義規則)來定義。
定義 5.2設p:X0→X1X2…Xn∈P是文法G的一個產生式,則與p相關聯的屬性規則集合
定義 5.3對每個產生式p:X0→X1X2…Xn∈P,設屬性定義性出現的集合為
AF(p)={Xi.a|Xi.a=f(Xk1.ak1,Xk2.ak2,…,Xkm.akm)∈R(p),而0≤kj≤n}
若Xi是產生式左部的非終結符號(即i=0),則稱屬性Xi.a是綜合屬性(Synthesized Attributes);若Xi出現在產生式的右部(即1≤i≤n),則稱Xi.a是繼承屬性(Inherited Attributes)。
如果在一棵語法樹中將每個結點均視為由若干個域組成的記錄(或結構),則可將其中的一些域用來存放相應文法符號諸屬性之值,並可用屬性來為這些域命名。通常我們將每個結點都標注相應屬性值的語法樹稱為加註語法樹(Annotated Syntax Tree)或染色樹(Decorted Syntax Tree)。於是,由定義5.3可知:在加註語法樹中,一個文法符號X在相應結點的綜合屬性之值,由其子結點的屬性和(或)X的其它屬性,通過相關屬性規則經計算而得,故綜合屬性的求值在語法樹中是按自下而上的方式進行的;X的繼承屬性之值則由X的父結點和(或)其它兄弟結點來定義,故繼承屬性的求值將按自上而下的方式進行。
在引入屬性的概念之後,我們就可以定義屬性文法了。
定義 5.4屬性文法AG是一個形如
AG=(G,A,R,B)
的四元組,其中:G=(VN,VT,P,S)是已簡化的前後文無關文法;A=∪X∈VA(X)是屬性的有限集合;R=∪p∈PR(p)是屬性定義規則的有限集;而B=∪p∈PB(p)是條件的有限集合,B(p)用於描述使規則R(p)有效的條件(請注意,並非每條規則R(p)都必須有條件B(p)。若B(p)預設,則意味著無條件使用該規則);且同時滿足:
(1) 對G中任意兩個不同的文法符號X和Y而言,屬性集合A(X)和A(Y)不相交,即
A(X)∩A(Y)=(X≠Y)
(2) 在G的任意一個語法樹中,對文法符號X的每一次出現,可用於計算X的每個屬性Xa(Xa∈A(X))之值的規則至多有一條。
由定義5.4可知,屬性文法實際上就是對前後文無關文法的一種拓廣。另外,定義還表明,每個產生式中的任一文法符號的屬性計算規則只能是惟一的,且任一文法符號的綜合屬性集與繼承屬性集不相交,即
AS(X)∩AI(X)=
其中:
AS(X)={X.a|p:X→α∈P,X.a∈AF(p)}
AI(X)={X.a|q:Y→μXυ∈P,X.a∈AF(q)}
下面,我們以一個簡單賦值語句的文法為例,來說明屬性文法的應用。為便於理解,我們用一英語單詞(或片語)而不再像前幾章那樣用字母表示文法符號。並且約定,用大寫字母開頭的符號為非終結符號,而用小寫字母開頭的符號為終結符號。
⑽ c程序寫好要編譯和綜合是啥意思
書寫出來的是源程序,也就是.c和.h文件。 肉眼可讀。
最終運行的是可執行文件,也就是二進制文件。 windows上是.exe文件。
從源文件到可執行文件要經過編譯和鏈接,你說的綜合應該就是鏈接。
編譯是每個.c文件編譯成對應的目標文件(.o, .obj, .tco這類的,不同工具擴展名有所不同)
鏈接是把這些目標文件整合成可執行文件。