版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> C語言編譯器的設(shè)計(jì)開發(fā) </p><p> 字節(jié)代碼格式設(shè)計(jì)與實(shí)現(xiàn) </p><p> 畢業(yè)設(shè)計(jì)(論文)中文摘要</p><p> C語言編譯器的設(shè)計(jì)開發(fā)摘要 編譯程序是現(xiàn)代計(jì)算機(jī)系統(tǒng)的基本組成部分之一,而且多數(shù)計(jì)算機(jī)系統(tǒng)都含有不止一個(gè)高級(jí)語言的編譯程序,對(duì)有些高級(jí)語言甚至配置了幾個(gè)不同性能的編譯程序
2、。從功能上看,一個(gè)編譯程序就是一個(gè)語言翻譯程序。它把一種語(稱作源語言)書寫的程序翻譯成另一種語言(稱作目標(biāo)語言)的等價(jià)的程序。比如匯編程序是一個(gè)翻譯程序,它把匯編語言程序翻譯成機(jī)器語言程序。如果源語言是像FORTRAN,PASCAL,或C那樣的高級(jí)語言,目標(biāo)語言是像匯編語言或機(jī)器語言那樣的低級(jí)機(jī)器語言,則這種翻譯程序稱作編譯程序。一個(gè)編譯程序的重要性體現(xiàn)在它使得多數(shù)計(jì)算機(jī)用戶不必考慮與機(jī)器有關(guān)的繁索細(xì)節(jié),使程序員和程序設(shè)計(jì)專家獨(dú)立于機(jī)
3、器,這對(duì)于當(dāng)今機(jī)器的數(shù)量和種類持續(xù)不斷地增長的年代尤為重要。編譯過程劃分了詞法分析、語法分析、語義分析、中間代碼生成、代碼優(yōu)化、目標(biāo)代碼生成、六個(gè)階級(jí)。另外兩個(gè)重要的工作:表格處理和出錯(cuò)處理與上述六個(gè)階級(jí)都有聯(lián)系。關(guān)鍵詞 編譯程序,源語言,目標(biāo)語言,詞法分析,語法分析,語義分析,字節(jié)代碼,中間代碼,代碼優(yōu)化,目標(biāo)代碼。</p><p> 畢業(yè)設(shè)計(jì)(論文)外文摘要</p><p><
4、;b> 目 次 </b></p><p> 1 引言(或緒論)………………………………………………………………………1</p><p> 2 編譯器的基礎(chǔ)知識(shí)…………………………………………………………………2</p><p> 2.1編譯器的發(fā)展背景……………………… ………………………………………3</p><
5、;p> 2.2編譯器研發(fā)的可行性分析…………………………………………………………3</p><p> 2.3編譯過程概述………………………… ………………………………………… 5</p><p> 3系統(tǒng)需求分析………………… ………………………………………… 8</p><p> 3.1 LEX概述……………………………………………………………………
6、……… 8</p><p> 3.2 C語言簡介……………………………………………………………9</p><p> 3.3軟件工程方法論的應(yīng)用………………………………………………………10</p><p> 3.4詞法語法分析簡介……………………………………………………………… 13</p><p> 3.5詞法需求分析簡介……………
7、………………………………………………… 13</p><p> 3.6語法需求分析簡介……………………………………………………………… 14</p><p> 3.7符號(hào)表的應(yīng)用……………………………………………………………………15</p><p> 4系統(tǒng)設(shè)計(jì)…………………………………………………………………………… 16</p><p
8、> 4.1系統(tǒng)設(shè)計(jì)總體流程圖……………………………………………………………16</p><p> 4.2語法分析體流程圖……………………………………………………………… 17</p><p> 4.3語法分析概要設(shè)計(jì)……………………………………………………………… 18</p><p> 4.4目標(biāo)代碼的分析…………………………………………………………
9、……… 21</p><p> 4.5 80x86指令系統(tǒng)…………………………………………………………………24</p><p> 4.6字節(jié)代碼設(shè)計(jì)…………………………………………………………………… 25</p><p> 4.7虛擬寄存器的設(shè)計(jì)……………………………………………………………… 26</p><p> 4.8字節(jié)代
10、碼詳細(xì)設(shè)計(jì)……………………………………………………………… 27</p><p> 5 使用說明書……………………………………………………………………… 34</p><p> 6結(jié)論 …………………………………………………………………………………35</p><p> 致謝 ………………………………………………………………………………… 36</p&
11、gt;<p> 參考文獻(xiàn)………………………………………………………………………………37</p><p><b> 1 引言(或緒論)</b></p><p> 編譯器的設(shè)計(jì)涉及到編譯程序構(gòu)造的一般原理、基本設(shè)計(jì)方法、主要實(shí)現(xiàn)技術(shù)和一些自動(dòng)構(gòu)造工具。盡管“編譯程序”是特指將高級(jí)程序設(shè)計(jì)語言翻譯成低級(jí)語言的軟件,但編譯程序構(gòu)造的基本原理和技術(shù)也廣泛應(yīng)
12、用于一般的設(shè)計(jì)和實(shí)現(xiàn),因此,是一門對(duì)實(shí)踐性要求較高的課程。</p><p> 目前,世界上存在著數(shù)千種源語言,既有Fortran和Pascal這樣的傳統(tǒng)程序設(shè)計(jì)語言,也有各計(jì)算機(jī)應(yīng)用領(lǐng)域中出現(xiàn)的專用語言。目標(biāo)語言也同樣廣泛,目標(biāo)語言可以是另一種程序設(shè)計(jì)語言或者是從微處理機(jī)到計(jì)算機(jī)的任何計(jì)算機(jī)的機(jī)器語言。不同語言需要不同的編譯器。根據(jù)編譯器的構(gòu)造方法或者它們要實(shí)現(xiàn)的功能,編譯器被分為一遍編譯器、多遍編譯器、裝入并
13、執(zhí)行編譯器、調(diào)試編譯器、優(yōu)化編譯器等多種類別。從表面上看,編譯器的種類似乎千變?nèi)f化,多種多樣,實(shí)質(zhì)上任何編譯器所要完成的基本任務(wù)都是相同的。通過理解這些任務(wù),我們可以利用同樣的基本技術(shù)為各種各樣的源語言和目標(biāo)機(jī)器構(gòu)建編譯器。</p><p> 編譯器也可能沒有生成真正的可執(zhí)行代碼,而是生成了某種形式的匯編代碼,這必須由匯編器、鏈接器和裝入器進(jìn)行進(jìn)一步處理。匯編器、鏈接器和裝入器可由操心系統(tǒng)提供或由編譯器自帶。在
14、翻譯期間,中間表示或IR代表了源程序和數(shù)據(jù)結(jié)構(gòu)。雖然抽象語法樹是源代碼完美充分的表達(dá),即使對(duì)于代碼生成也不過這樣,但是它與目標(biāo)代碼極不相像,在控制流構(gòu)造上尤為如此。在控制流構(gòu)造上,目標(biāo)代碼使用轉(zhuǎn)移語句而不是if和while語句。因此,編譯器編寫者可能希望從語法樹生成一個(gè)更接近目標(biāo)代碼的中間表示形式,或者用這樣一個(gè)中間表示代替語法樹,然后再從這個(gè)新的中間表示生成目標(biāo)代碼。</p><p> 中間代碼生成在進(jìn)行了上
15、述的語法分析和語義分析的工作之后,有的編譯程序?qū)⒃闯绦蜃兂梢环N內(nèi)部表示形式,這種內(nèi)部表示形式叫做中間語言或中間代碼。所謂“中間代碼”是一種結(jié)構(gòu)簡單、含義明確的記號(hào)系統(tǒng),這種記號(hào)系統(tǒng)可以設(shè)計(jì)為多種多樣的形式,重要的設(shè)計(jì)原則為兩點(diǎn):一是容易生成;二是容易將它翻譯成目標(biāo)代碼。很多編譯程采用了一種近似“三地址指令”的“四元式”中間代碼,這種四元式的形式為:(運(yùn)算符,運(yùn)算對(duì)象1,運(yùn)算對(duì)象2,結(jié)果)。</p><p><
16、;b> 2編譯器的基礎(chǔ)知識(shí)</b></p><p> 一個(gè)編譯程序就是一個(gè)語言翻譯程序。它把一種語(稱作源語言)書寫的程序翻譯成另一種語言(稱作目標(biāo)語言)的等價(jià)的程序。比如匯編程序是一個(gè)翻譯程序,它把匯編語言程序翻譯成機(jī)器語言程序。如果源語言是像FORTRAN,PASCAL,或C那樣的高級(jí)語言,目標(biāo)語言是像匯編語言或機(jī)器語言那樣的低級(jí)語言,則這種翻譯程序稱作編譯程序。</p>
17、<p> 2.1 編譯器的發(fā)展背景</p><p> 編譯程序是現(xiàn)代計(jì)算機(jī)系統(tǒng)的基本組成部分之一,而且多數(shù)計(jì)算機(jī)系統(tǒng)都含有不止一個(gè)高級(jí)語言的編譯程序,對(duì)有些高級(jí)語言甚至配置了幾個(gè)不同性能的編譯程序。從功能上看,一個(gè)編譯程序就是一個(gè)語言翻譯程序。它把一種語(稱作源語言)書寫的程序翻譯成另一種語言(稱作目標(biāo)語言)的等價(jià)的程序。比如匯編程序是一個(gè)翻譯程序,它把匯編語言程序翻譯成機(jī)器語言程序。如果源語言是
18、像FORTRAN,PASCAL,或C那樣的高級(jí)語言,目標(biāo)語言是像匯編語言或機(jī)器語言那樣的低級(jí)語言,則這種翻譯程序稱作編譯程序。</p><p> 一個(gè)編譯程序的重要性體現(xiàn)在它使得多數(shù)計(jì)算機(jī)用戶不必考慮與機(jī)器有關(guān)的繁索細(xì)節(jié),使程序員和程序設(shè)計(jì)專家獨(dú)立于機(jī)器,這對(duì)于當(dāng)今機(jī)器的數(shù)量和種類持續(xù)不斷地增長的年代憂為重要。除了編譯程序外,還需要一些其它的程序才能生成一個(gè)可在計(jì)算機(jī)執(zhí)行的目標(biāo)程序。</p>&l
19、t;p> 一個(gè)源程序有時(shí)可能分成幾個(gè)模塊存放在不同的文件里,將這些源程序匯集在一起的任務(wù),由一個(gè)叫做預(yù)處理程序的程序完成,有些預(yù)處理程序也負(fù)責(zé)宏展開,像C語言和預(yù)處理程序要完成文件合并、宏展開等任務(wù)。也就是說,一個(gè)編譯程序的輸入可能要一個(gè)或多個(gè)預(yù)處理程序來產(chǎn)生,另外,為得到能運(yùn)行的機(jī)器代碼,編譯程序的輸出可能仍需要進(jìn)一步地處理。</p><p> 詞法分析階級(jí)是編譯過程的第一個(gè)階級(jí)。這個(gè)階級(jí)的任務(wù)是從左
20、到右一個(gè)字符一個(gè)字符地讀入源程序,對(duì)構(gòu)成源程序的字符流進(jìn)行掃描和分解,從而識(shí)別一個(gè)個(gè)單詞(也稱為單詞符號(hào)或符號(hào))。這里所謂的單詞是指邏輯上緊密相連的一組字符,這些字符具有集體含義。比如標(biāo)識(shí)是由字母開頭,后跟字母、數(shù)字字符序列組成的一種單詞,。保留字是一種單詞,此外還有算符,界符等等。</p><p> 語法分析是編譯過程的第二個(gè)階段。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語。如“程序”,“
21、語句”,“表達(dá)式”等等。一般這種語法短語也稱為語法單位,可表示成語法樹。語法分析所依據(jù)的是語言的語法規(guī)則,即描述程序結(jié)構(gòu)的規(guī)則。通過語法分析確定整個(gè)輸入串是否構(gòu)成一個(gè)語法上正確的程序。</p><p> 典型的文法的語法分析器有三類:一類是通用的語法分析方法,如Cocke-Younger-Kasami算法和Early算法,這些方法在生成編譯器時(shí)效率太低。編譯器常用的是自頂向下和自底向上的方法。</p>
22、;<p> 采用自頂向下的遞歸子程序法,就是對(duì)應(yīng)每個(gè)非終結(jié)符語法單元,編一個(gè)獨(dú)立的處理子程序。語法分析從讀入第一個(gè)單詞開始,由非終結(jié)符即開始符出發(fā),沿語法描述圖箭頭指出的方向進(jìn)行分析。當(dāng)遇到非終結(jié)符時(shí),則調(diào)用相應(yīng)的處理子程序,從語法描述圖看也就進(jìn)入了一個(gè)語法單元,再沿當(dāng)前所進(jìn)入的語法描述圖的箭頭方向進(jìn)行分析,當(dāng)遇到終結(jié)符時(shí),則判斷當(dāng)前讀入的單詞是否與圖中的終結(jié)符相匹配,若匹配,則執(zhí)行相應(yīng)的語義程序。再讀取下一個(gè)單詞繼續(xù)分
23、析。遇到分支點(diǎn)時(shí)將當(dāng)前的單詞與分支點(diǎn)上的多個(gè)終結(jié)符逐個(gè)相比較,若都不匹配時(shí)可能是進(jìn)入下一非終結(jié)符語法單位或是出錯(cuò)。</p><p> 自頂向下的分析算法通過在最左推導(dǎo)中描述出各個(gè)步驟來分析記號(hào)串輸入。之所以稱這樣的算法為自頂向下是由于分析樹隱含的編號(hào)是一個(gè)前序編,而且其順序是由根到葉子。自頂向下的分析程序有兩類:回溯分析程序和預(yù)測(cè)分析程序。預(yù)測(cè)分析程序試圖利用一個(gè)或多個(gè)先行記號(hào)來預(yù)測(cè)出輸入串中的下一個(gè)構(gòu)造,而回
24、溯分析程序則試著分析其他可能的輸入,當(dāng)一種可能失敗時(shí)就要求輸入中備份任意數(shù)量的字符。雖然回溯分析程序比預(yù)測(cè)強(qiáng)大許多,但它們都非常慢,一般都在指數(shù)的數(shù)量級(jí)上,所以對(duì)于實(shí)際的編譯器并不適合。遞歸下降程序分析和LL(1)分析一般地都要求計(jì)算先行集合,它們分別稱作First集合和Follow集合。由于無需顯示地構(gòu)造出這些集合就可以構(gòu)造出簡單的自頂向下的分析程序,所以在基本算法的介紹之后我們?cè)儆懻撍鼈?。之后我償還要談到一個(gè)由遞歸下降分析構(gòu)造的分析
25、程序。</p><p> 由于代碼生成較復(fù)雜,所以編譯器一般將這一階段分成幾個(gè)涉及不同中間數(shù)據(jù)結(jié)構(gòu)的步驟,其中包括了某種稱作中間代碼的抽象代碼。編譯器也可能沒有生成真正的可執(zhí)行代碼,而是生成了某種形式的匯編代碼,這必須由匯編器、鏈接器和裝入器進(jìn)行進(jìn)一步處理。匯編器、鏈接器和裝入器可由操心系統(tǒng)提供或由編譯器自帶。在翻譯期間,中間表示或IR代表了源程序和數(shù)據(jù)結(jié)構(gòu)。雖然抽象語法樹是源代碼完美充分的表達(dá),即使對(duì)于代碼生
26、成也不過這樣,但是它與目標(biāo)代碼極不相像,在控制流構(gòu)造上尤為如此。在控制流構(gòu)造上,目標(biāo)代碼使用轉(zhuǎn)移語句而不是if和while語句。因此,編譯器編寫者可能希望從語法樹生成一個(gè)更接近目標(biāo)代碼的中間表示形式,或者用這樣一個(gè)中間表示代替語法樹,然后再從這個(gè)新的中間表示生成目標(biāo)代碼。這種類似目標(biāo)代碼的中間表示稱為中間代碼。</p><p> 2.2編譯器研發(fā)的可行性分析</p><p> 編寫編譯
27、器的原理和技術(shù)具有十分普遍的意義,以致于在每一個(gè)計(jì)算機(jī)科學(xué)家的研究生涯中,許多原理和技術(shù)都會(huì)反復(fù)用到。編譯器的編寫涉及到程序設(shè)計(jì)語言、計(jì)算機(jī)體系結(jié)構(gòu)、語言理論、算法和軟件工程等學(xué)科。幸運(yùn)的是,有幾種基本編譯器編寫技術(shù)已經(jīng)被用于構(gòu)建許多計(jì)算機(jī)的多種語言翻譯器。簡單的說,編譯器是一個(gè)程序,它讀入用某種語言(源語言)編寫的程序并將其翻譯成一個(gè)與之等價(jià)的以另一種語言(目標(biāo)語言)編寫的程序。作為這個(gè)翻譯過程匠一個(gè)重要組成部分,編譯器能夠向用戶報(bào)告
28、被編譯的源程序中出現(xiàn)的錯(cuò)誤。</p><p> 編譯器由兩部分組成:分析與綜合。分析部分將源程序切分成一些基本塊并形成源程序的中間表示,綜合部分把源程序的中間表示轉(zhuǎn)為所需的目標(biāo)程序。在分析期間,源程序所蘊(yùn)含的操作將被確定下來并被表示成為一個(gè)稱為語法樹的分層結(jié)構(gòu)。語法樹的每個(gè)節(jié)點(diǎn)表示一個(gè)操作,該節(jié)點(diǎn)的子節(jié)點(diǎn)表示這個(gè)操作的參數(shù)。</p><p> 許多操縱源程序的軟件工具都首先完成某種類型
29、的分析。下邊是這類工具的示例:</p><p> 結(jié)構(gòu)編輯器,結(jié)構(gòu)編輯器將一個(gè)命令序列作為輸入一構(gòu)造程序。</p><p> 智能打印機(jī),智能打印機(jī)能夠?qū)Τ绦蜻M(jìn)行分析,打印出結(jié)構(gòu)清晰的程序。</p><p> 靜態(tài)檢查器,靜態(tài)檢查器讀入一個(gè)程序,分析這個(gè)程序,并在不運(yùn)行這個(gè)程序的條件試圖發(fā)現(xiàn)程序的潛在錯(cuò)誤。</p><p> 解釋器,
30、解釋器不是通過翻譯來產(chǎn)生目標(biāo)程序,而是直接執(zhí)行源程序中蘊(yùn)含的操作。</p><p> 目前,世界上存在著數(shù)千種源語言,既有Fortran和Pascal這樣的傳統(tǒng)程序設(shè)計(jì)語言,也有各計(jì)算機(jī)應(yīng)用領(lǐng)域中出現(xiàn)的專用語言。目標(biāo)語言也同樣廣泛,目標(biāo)語言可以是另一種程序設(shè)計(jì)語言或者是從微處理機(jī)到計(jì)算機(jī)的任何計(jì)算機(jī)的機(jī)器語言。不同語言需要不同的編譯器。根據(jù)編譯器的構(gòu)造方法或者它們要實(shí)現(xiàn)的功能,編譯器被分為一遍編譯器、多遍編譯器
31、、裝入并執(zhí)行編譯器、調(diào)試編譯器、優(yōu)化編譯器等多種類別。從表面上看,編譯器的種類似乎千變?nèi)f化,多種多樣,實(shí)質(zhì)上任何編譯器所要完成的基本任務(wù)都是相同的。通過理解這些任務(wù),我們可以利用同樣的基本技術(shù)為各種各樣的源語言和目標(biāo)機(jī)器構(gòu)建編譯器。</p><p> 從20世紀(jì)50年代早期第一個(gè)編譯器出現(xiàn)到今,我們所掌握的有關(guān)編譯器的知識(shí)已經(jīng)得到了長足的發(fā)展。整個(gè)20世紀(jì)50年代,編譯器的編寫一直被認(rèn)為是一個(gè)極難的問題。目前我
32、們已經(jīng)系統(tǒng)地掌握了處理編譯期間發(fā)生的許多重要任務(wù)的技術(shù)。良好的實(shí)現(xiàn)語言、程序設(shè)計(jì)環(huán)境和軟件工具也已經(jīng)被開發(fā)出來。</p><p> 20世紀(jì)50年代末有人開始研究編譯程序的自動(dòng)生成技術(shù),提出并研制編譯程序的編譯程序。它的功能是以任一語言的詞法規(guī)則、語法規(guī)則和語義解釋出發(fā),自動(dòng)產(chǎn)生該語言的編譯程序。目前,很多自動(dòng)生成的工具已廣泛使用,如詞法分析的生成系統(tǒng)LEX,語法分析程序的生成系統(tǒng)YACC等。20世紀(jì)60年代起
33、,不斷有人使用自展技術(shù)來構(gòu)造編譯程序。自展的主要特征是用被編譯的語言來書寫該語言自身的編譯程序。自從1971年,PASCAL的編譯程序用自展技術(shù)生成后,起影響就越來越大。</p><p> 研究編譯程序是有意義在于:</p><p> 編譯程序構(gòu)造是計(jì)算機(jī)科學(xué)中的一個(gè)非常成功的分支,也是最早獲的成功的分支之一;</p><p> 它與文件轉(zhuǎn)換程序關(guān)系密集,且不
34、僅僅適用于編譯程序;</p><p> 它包含許多在實(shí)際應(yīng)用中有用的算法。</p><p> 由于近幾年并行機(jī)及多處理機(jī)的發(fā)展,對(duì)軟件的并行處理技術(shù)提出了新的要求。特別是并行編譯技術(shù)發(fā)展很快,目前處理并行編譯技術(shù)有兩種方法:</p><p> 第一種方法,運(yùn)用重構(gòu)技術(shù)把已有的串行語言編寫的程序經(jīng)過相關(guān)分析,分解成可并行的成分,分配到多CPU或多處理機(jī)上運(yùn)行,這
35、種技術(shù)國內(nèi)已有FORTRAN和C語言的并行重構(gòu)處理系統(tǒng),相當(dāng)成功。</p><p> 第二種方法,即在程序設(shè)計(jì)語言機(jī)制上允許用戶自己編寫并行程序,這當(dāng)然比編寫串行語言對(duì)編程人員提出的要求更多。即用戶自己必須知道程序各模塊之間邏輯結(jié)構(gòu)關(guān)系及調(diào)用關(guān)系乃至運(yùn)算量,以確定哪些模塊可以并行執(zhí)行。若編程者能按程序設(shè)計(jì)情況編出并行程序,無疑并行程序效率將比第一種方法要好。</p><p> 隨著并行
36、技術(shù)和并行語言的發(fā)展,處理并行語言的并行編譯技術(shù)正在深入研究之中,將串行程序轉(zhuǎn)換成并行程序的自動(dòng)并行編譯技術(shù)也正在深入研究之中。</p><p> 代碼生成較復(fù)雜,所以編譯器一般將這一階段分成幾個(gè)涉及不同中間數(shù)據(jù)結(jié)構(gòu)的步驟,其中包括了某種稱作中間代碼的抽象代碼。編譯器也可能沒有生成真正的可執(zhí)行代碼,而是生成了某種形式的匯編代碼,這必須由匯編器、鏈接器和裝入器進(jìn)行進(jìn)一步處理。匯編器、鏈接器和裝入器可由操心系統(tǒng)提供
37、或由編譯器自帶。在翻譯期間,中間表示或IR代表了源程序和數(shù)據(jù)結(jié)構(gòu)。雖然抽象語法樹是源代碼完美充分的表達(dá),即使對(duì)于代碼生成也不過這樣,但是它與目標(biāo)代碼極不相像,在控制流構(gòu)造上尤為如此。在控制流構(gòu)造上,目標(biāo)代碼使用轉(zhuǎn)移語句而不是if和while語句。因此,編譯器編寫者可能希望從語法樹生成一個(gè)更接近目標(biāo)代碼的中間表示形式,或者用這樣一個(gè)中間表示代替語法樹,然后再從這個(gè)新的中間表示生成目標(biāo)代碼。這種類似目標(biāo)代碼的中間表示稱為中間代碼。然后編譯程
38、序再調(diào)用相應(yīng)的處理程序,將中間代碼轉(zhuǎn)換為計(jì)算機(jī)能處理的機(jī)器指令,最終得到目標(biāo)代碼。</p><p><b> 2.3編譯過程概述</b></p><p> 編譯程序是現(xiàn)代計(jì)算機(jī)系統(tǒng)的基本組成部分之一,而且多數(shù)計(jì)算機(jī)系統(tǒng)都含有不止一個(gè)高級(jí)語言的編譯程序,對(duì)有些高級(jí)語言甚至配置了幾個(gè)不同性能的編譯程序。從功能上看,一個(gè)編譯程序就是一個(gè)語言翻譯程序。它把一種語(稱作源語
39、言)書寫的程序翻譯成另一種語言(稱作目標(biāo)語言)的等價(jià)的程序。比如匯編程序是一個(gè)翻譯程序,它把匯編語言程序翻譯成機(jī)器語言程序。如果源語言是像FORTRAN,PASCAL,或C那樣的高級(jí)語言,目標(biāo)語言是像匯編語言或機(jī)器語言那樣的低級(jí)玉器言,則這種翻譯程序稱作編譯程序。</p><p> 一個(gè)編譯程序的重要性體現(xiàn)在它使得多數(shù)計(jì)算機(jī)用戶不必考慮與機(jī)器有關(guān)的繁索細(xì)節(jié),使程序員和程序設(shè)計(jì)專家獨(dú)立于機(jī)器,這對(duì)于當(dāng)今機(jī)器的數(shù)量
40、和種類持續(xù)不斷地增長的年代憂為重要。除了編譯程序外,還需要一些其它的程序才能生成一個(gè)可在計(jì)算機(jī)執(zhí)行的目標(biāo)程序。</p><p> 高級(jí)語言程序的處理過程如圖:</p><p><b> 需處理的源程序</b></p><p><b> 源程序</b></p><p><b> 目標(biāo)
41、匯編程序 </b></p><p><b> 可再裝配的機(jī)器代碼</b></p><p><b> 可在裝配的目標(biāo)文件</b></p><p> 絕對(duì)機(jī)器代碼 </p><p> 一個(gè)源程序有時(shí)可能分成幾個(gè)模塊存放在不同的
42、文件里,將這些源程序匯集在一起的任務(wù),由一個(gè)叫做預(yù)處理程序的程序完成,有些預(yù)處理程序也負(fù)責(zé)宏展開,像C語言和預(yù)處理程序要完成文件合并、宏展開等任務(wù)。也就是說,一個(gè)編譯程序的輸入可能要一個(gè)或多個(gè)預(yù)處理程序來產(chǎn)生,另外,為得到能運(yùn)行的機(jī)器代碼,編譯程序的輸出可能仍需要進(jìn)一步地處理。</p><p> 編譯程序完成從源程序到目標(biāo)程序的翻譯工作,是一個(gè)復(fù)雜的整體的過程。從概念上來講,一個(gè)編譯程序和整體工作過程是劃分成階
43、級(jí)進(jìn)行的,每個(gè)階級(jí)將源程序的一種表示形式換成另一種表示形式,各個(gè)階級(jí)進(jìn)行的操場(chǎng)作在邏輯上是緊密連接在一起的,如圖1所示,給出了一個(gè)編譯過的和各個(gè)階級(jí),這是一種比較典型的劃分方法。</p><p><b> 源程序</b></p><p><b> 圖1</b></p><p> 圖1將編譯過程劃分了詞法分析、語法分析
44、、語義分析、中間代碼生成、代碼優(yōu)化、目標(biāo)代碼生成、六個(gè)階級(jí)。另外兩個(gè)重要的工作:表格處理和出錯(cuò)處理與上述六個(gè)階級(jí)都有聯(lián)系。編譯過程是源程序和各種信息被子保留在種種不同的表格里,編譯各階級(jí)的工作都涉及到構(gòu)造、查找或更新有關(guān)的表格,因此需要有表格處理的工作;如果編譯過程中發(fā)現(xiàn)源程序有錯(cuò)誤,編譯程序應(yīng)報(bào)告錯(cuò)誤的性質(zhì)和錯(cuò)誤發(fā)生的地點(diǎn),并且將錯(cuò)誤所造成的影響限制在盡可能小的范圍內(nèi),使得源程序的其余部分能繼續(xù)被編譯下去,有些編譯程序還能自動(dòng)校正錯(cuò)誤
45、,這些工作稱之為出錯(cuò)處理。</p><p> 詞法分析階級(jí)是編譯過程的第一個(gè)階級(jí)。這個(gè)階級(jí)的任務(wù)是從左到右一個(gè)字符一個(gè)字符地讀入源程序,對(duì)構(gòu)成源程序的字符流進(jìn)行掃描和分解,從而識(shí)別一個(gè)個(gè)單詞(也稱為單詞符號(hào)或符號(hào))。這里所謂的單詞是指邏輯上緊密相連的一組字符,這些字符具有集體含義。比如標(biāo)識(shí)是由字母開頭,后跟字母、數(shù)字字符序列組成的一種單詞,。保留字是一種單詞,此外還有算符,界符等等。</p>&l
46、t;p> 語法分析是編譯過程的第二個(gè)階級(jí)。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語,如“程序”,“語句”,“表達(dá)式”等等。一般這種語法短語,也稱為語法單位,可表示成語法樹。語法分析所依據(jù)的是語言的語法規(guī)則,即描述程序結(jié)構(gòu)的規(guī)則。通過語法分析確定整個(gè)輸入串是否構(gòu)成一個(gè)語法上正確的程序。詞法分析和語法分析本質(zhì)上都是對(duì)源程序的結(jié)構(gòu)進(jìn)行分析。但詞法分析的任務(wù)僅對(duì)源程序進(jìn)行線性掃描即可完成,比如識(shí)別標(biāo)識(shí)符,因?yàn)闃?biāo)識(shí)符
47、的結(jié)構(gòu)是字母打頭的字母和數(shù)字序列,這只要順序掃描輸入流,遇到既不是字母又不是數(shù)字字符時(shí),將前面所發(fā)現(xiàn)的所有字母和數(shù)字組合在一起而構(gòu)成單詞標(biāo)識(shí)符。但這種線性掃描則不能用于識(shí)別遞歸定義的語法成分,比如就不能用此辦法去匹配表達(dá)式中的括號(hào)。</p><p> 語義分析階級(jí)是審查源程序有無語義錯(cuò)誤,為代碼生成階級(jí)收集類型信息。比如語分析的一個(gè)工作是進(jìn)行類型審查,審查每個(gè)算符是否具有語言規(guī)范允許的運(yùn)算對(duì)象,當(dāng)不符合語言規(guī)范
48、時(shí),編譯程序應(yīng)報(bào)告錯(cuò)誤。如有的編譯程序要對(duì)實(shí)數(shù)用個(gè)數(shù)組下標(biāo)的情況報(bào)告錯(cuò)誤。又如某些語言規(guī)定運(yùn)算對(duì)象可被強(qiáng)制,那么當(dāng)二目運(yùn)算一整數(shù)和一實(shí)型時(shí),編譯程序應(yīng)將整型轉(zhuǎn)換成實(shí)型而不能認(rèn)為是源程序的錯(cuò)誤。</p><p> 中間代碼生成在進(jìn)行了上述的語法分析和語義分析的工作之后,有的編譯程序?qū)⒃闯绦蜃兂梢环N內(nèi)部表示形式,這種內(nèi)部表示形式叫做中間語言或中間代碼。所謂“中間代碼”是一種結(jié)構(gòu)簡單、含義明確的記號(hào)系統(tǒng),這種記號(hào)系統(tǒng)
49、可以設(shè)計(jì)為多種多樣的形式,重要的設(shè)計(jì)原則為兩點(diǎn):一是容易生成;二是容易將它翻譯成目標(biāo)代碼。很多編譯程采用了一種近似“三地址指令”的“四元式”中間代碼,這種四元式的形式為:(運(yùn)算符,運(yùn)算對(duì)象1,運(yùn)算對(duì)象2,結(jié)果)。</p><p> 代碼優(yōu)化在此階級(jí)的任務(wù)是對(duì)前階級(jí)產(chǎn)生的是間代碼進(jìn)行變換或進(jìn)行改造,目的是使生成的目標(biāo)代碼更為高效,即省時(shí)間和省空間。</p><p> 目標(biāo)代碼生成的任務(wù)是
50、把是間代碼變換成特定機(jī)器上的絕對(duì)指令代碼或可重定位的指令代碼或匯編指令代碼。這是編譯的最后階級(jí),它的工作與硬件系統(tǒng)結(jié)構(gòu)和指令含義有關(guān),這個(gè)階的工作很復(fù)雜,涉及到硬件系統(tǒng)功能部件的運(yùn)用、機(jī)器指令的選擇、各種數(shù)據(jù)類型變量的存儲(chǔ)空間分配以及寄存器和后緩寄存器的調(diào)度等。</p><p> 有時(shí),常常把編譯的過程分為前端和后端,前端由那樣一些階級(jí)組成:這些階級(jí)的工作主要依賴于源語言而與目標(biāo)機(jī)無關(guān)。通常這些階段包括詞法分析
51、、語法分析、語義分析和中間代碼生成,某些優(yōu)化工作也可在前端做,也包括與前端每個(gè)階級(jí)相關(guān)的出錯(cuò)處量工作和符號(hào)表管理工作。后端工作指那些依賴于目標(biāo)機(jī)而一般不依賴源語言,只與中間代碼有關(guān)的那些階段,即目標(biāo)代碼生成,以及相關(guān)出錯(cuò)處理和符號(hào)表操作。若按照這種姐合方式實(shí)現(xiàn)編譯程序,可以設(shè)想,某一編譯程序的前端加上相應(yīng)不同的后端則可以為不同的機(jī)器構(gòu)成一個(gè)源語言的編譯程序。也可以設(shè)想,不同語言編譯的前端生成同一種中間語言,再使用一個(gè)共同的后端,則可為同
52、一機(jī)器生成幾個(gè)語言的編譯程序。一個(gè)編譯過程可由一遍、兩遍或多遍完成。所謂“遍”,也稱作“趟”,是對(duì)源程序或其等價(jià)的中間語言程序從頭到尾掃視并完成規(guī)定任務(wù)的過程。每一遍掃視可完成上述一個(gè)階段或多個(gè)階段的工作。例如一遍可以只完成詞法分析工作;一遍完成詞法分析和語法分析工作;甚至一遍完成整個(gè)編譯工作。對(duì)于多遍的編譯程序,第一遍的輸入是用戶書寫的源程序,最后一遍是輸出是目標(biāo)語言程序,其余是上一遍的輸出為下一遍的輸入。</p>&l
53、t;p><b> 3系統(tǒng)需求分析</b></p><p><b> 3.1 LEX概述</b></p><p> LEX是一個(gè)詞法分析器(掃描器)的自動(dòng)產(chǎn)生系統(tǒng),它的示意圖如下:</p><p> LEX源程序 LEX yylex</p><p> 輸入串
54、 yylex 單詞符號(hào)串 </p><p> LEX源程序是用一種面向問題的語言寫成的。這個(gè)語言的核心是正規(guī)表達(dá)式(正規(guī)式),用它描述輸入串的詞法結(jié)構(gòu)。在這個(gè)語言中用戶還可以描述某一個(gè)詞形被識(shí)別出來時(shí)要完成的動(dòng)作,例如在高級(jí)語言的詞法分析器中,當(dāng)識(shí)別出一個(gè)關(guān)鍵字時(shí),它應(yīng)該向語法分析器返回該關(guān)鍵字的內(nèi)部編碼。LEX并不是一個(gè)完整的語言,它只是某種高級(jí)語言(稱為LEX的宿主
55、語言)的擴(kuò)充,因此,LEX沒有為描述動(dòng)作設(shè)計(jì)新的語言,而是借助其宿主語言來描述動(dòng)作。LEX自動(dòng)地把表示輸入串詞法結(jié)構(gòu)的正規(guī)式及相應(yīng)的動(dòng)作轉(zhuǎn)換成一個(gè)宿主語言的程序,即詞法分析程序,它有一個(gè)固定的名字yylex,在這里yylex是一個(gè)C語言程序。</p><p><b> 3.2 C語言簡介</b></p><p> ?。谜Z言是在 70 年代初問世的。一九七八年由美國電
56、話電報(bào)公司(AT&T)貝爾實(shí)驗(yàn)室正式發(fā)表了C語言。同時(shí)由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一書。通常簡稱為《K&R》,也有人稱之為《K&R》標(biāo)準(zhǔn)。但是,在《K&R》中并沒有定義一個(gè)完整的標(biāo)準(zhǔn)C 語言,后來由美國國家標(biāo)準(zhǔn)協(xié)會(huì)(American National Standards Institute)在此基礎(chǔ)上制定了一個(gè)C
57、語言標(biāo)準(zhǔn),于一九八三年發(fā)表。通常稱之為ANSI C。早期的C 語言主要是用于UNIX系統(tǒng)。由于C語言的強(qiáng)大功能和各方面的優(yōu)點(diǎn)逐漸為人們認(rèn)識(shí),到了八十年代,C開始進(jìn)入其它操作系統(tǒng),并很快在各類大、中、小和微型計(jì)算機(jī)上得到了廣泛的使用,成為當(dāng)代最優(yōu)秀的程序設(shè)計(jì)語言之一。</p><p> 目前最流行的C語言有以下幾種:</p><p> ·Microsoft C 或稱 MS C&
58、lt;/p><p> ·Borland Turbo C 或稱 Turbo C</p><p><b> ·AT&T C</b></p><p> 這些C語言版本不僅實(shí)現(xiàn)了ANSI C標(biāo)準(zhǔn),而且在此基礎(chǔ)上各自作了一些擴(kuò)充,使之更加方便、完美。</p><p><b> ?。谜Z言的特點(diǎn)
59、:</b></p><p> 1·C語言簡潔、緊湊,使用方便、靈活。ANSI C一共只有32個(gè)關(guān)鍵字:</p><p> 9種控制語句,程序書寫自由,主要用小寫字母表示,壓縮了一切不必要的成分。</p><p> Turbo C擴(kuò)充了11個(gè)關(guān)鍵字:</p><p> asm_cs_ds_es_ss
60、cdeclfar</p><p> hugeinterruptnearpascal</p><p> 注意:在C語言中,關(guān)鍵字都是小寫的。</p><p> 2·運(yùn)算符豐富。共有34種。C把括號(hào)、賦值、逗號(hào)等都作為運(yùn)算符處理。從而使C的運(yùn)算類型極為豐富,可以實(shí)現(xiàn)其他高級(jí)語言難以實(shí)現(xiàn)的運(yùn)算。</p><p>
61、3·數(shù)據(jù)結(jié)構(gòu)類型豐富。</p><p> 4·具有結(jié)構(gòu)化的控制語句。</p><p> 5·語法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。</p><p> 6·C語言允許直接訪問物理地址,能進(jìn)行位(bit)操作,能實(shí)現(xiàn)匯編語言的大部分功能,可以直接對(duì)硬件進(jìn)行操作。因此有人把它稱為中級(jí)語言。</p><p>
62、; 7·生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。</p><p> 8·與匯編語言相比,用C語言寫的程序可移植性好。</p><p> 但是,C語言對(duì)程序員要求也高,程序員用C寫程序會(huì)感到限制少、靈活性大,功能強(qiáng),但較其他高級(jí)語言在學(xué)習(xí)上要困難一些。</p><p><b> C語言的字符集:</b></p>
63、<p> 字符是組成語言的最基本的元素。C語言字符集由字母,數(shù)字,空格,標(biāo)點(diǎn)和特殊字符組成。在字符常量,字符串常量和注釋中還可以使用漢字或其它可表示的圖形符號(hào)。</p><p><b> 1.字母</b></p><p> 小寫字母a~z共26個(gè)</p><p> 大寫字母A~Z共26個(gè)</p><p&
64、gt;<b> 2.數(shù)字</b></p><p><b> 0~9共10個(gè)</b></p><p><b> 3.空白符</b></p><p> 空格符、制表符、換行符等統(tǒng)稱為空白符??瞻追辉谧址A亢妥址A恐衅鹱饔谩T谄渌胤匠霈F(xiàn)時(shí),只起間隔作用,編譯程序?qū)λ鼈兒雎圆挥?jì)。因此在程序中
65、使用空白符與否,對(duì)程序的編譯不發(fā)生影響,但在程序中適當(dāng)?shù)牡胤绞褂每瞻追麑⒃黾映绦虻那逦院涂勺x性。</p><p><b> 4.標(biāo)點(diǎn)和特殊字符</b></p><p><b> C語言詞匯:</b></p><p> 在C語言中使用的詞匯分為六類:標(biāo)識(shí)符,關(guān)鍵字,運(yùn)算符,分隔符,常量,注釋符等。</p>
66、<p><b> 1.標(biāo)識(shí)符</b></p><p> 在程序中使用的變量名、函數(shù)名、標(biāo)號(hào)等統(tǒng)稱為標(biāo)識(shí)符。除庫函數(shù)的函數(shù)名由系統(tǒng)定義外,其余都由用戶自定義。C 規(guī)定,標(biāo)識(shí)符只能是字母(A~Z,a~z)、數(shù)字(0~9)、下劃線(_)組成的字符串,并且其第一個(gè)字符必須是字母或下劃線。</p><p> 以下標(biāo)識(shí)符是合法的:</p><
67、;p> a, x, x3, BOOK_1, sum5</p><p> 以下標(biāo)識(shí)符是非法的:</p><p> 3s 以數(shù)字開頭</p><p> s*T 出現(xiàn)非法字符*</p><p> -3x 以減號(hào)開頭</p><p> bowy-1 出現(xiàn)非法字符-(減號(hào))<
68、/p><p> 在使用標(biāo)識(shí)符時(shí)還必須注意以下幾點(diǎn):</p><p> (1)標(biāo)準(zhǔn)C不限制標(biāo)識(shí)符的長度,但它受各種版本的C 語言編譯系統(tǒng)限制,同時(shí)也受到具體機(jī)器的限制。例如在某版本C 中規(guī)定標(biāo)識(shí)符前八位有效,當(dāng)兩個(gè)標(biāo)識(shí)符前八位相同時(shí),則被認(rèn)為是同一個(gè)標(biāo)識(shí)符。</p><p> (2)在標(biāo)識(shí)符中,大小寫是有區(qū)別的。例如BOOK和book 是兩個(gè)不同的標(biāo)識(shí)符。</
69、p><p> (3)標(biāo)識(shí)符雖然可由程序員隨意定義,但標(biāo)識(shí)符是用于標(biāo)識(shí)某個(gè)量的符號(hào)。因此,命名應(yīng)盡量有相應(yīng)的意義,以便于閱讀理解,作到“顧名思義”。</p><p><b> 2.關(guān)鍵字</b></p><p> 關(guān)鍵字是由C語言規(guī)定的具有特定意義的字符串,通常也稱為保留字。用戶定義的標(biāo)識(shí)符不應(yīng)與關(guān)鍵字相同。C語言的關(guān)鍵字分為以下幾類:<
70、/p><p><b> (1)類型說明符</b></p><p> 用于定義、說明變量、函數(shù)或其它數(shù)據(jù)結(jié)構(gòu)的類型。如前面例題中用到的int,double等</p><p><b> (2)語句定義符</b></p><p> 用于表示一個(gè)語句的功能。如例1.3中用到的if else就是條件語句的
71、語句定義符。</p><p><b> (3)預(yù)處理命令字</b></p><p> 用于表示一個(gè)預(yù)處理命令。如前面各例中用到的include。</p><p><b> 3.運(yùn)算符</b></p><p> C語言中含有相當(dāng)豐富的運(yùn)算符。運(yùn)算符與變量,函數(shù)一起組成表達(dá)式,表示各種運(yùn)算功能。
72、運(yùn)算符由一個(gè)或多個(gè)字符組成。</p><p><b> 4.分隔符</b></p><p> 在C語言中采用的分隔符有逗號(hào)和空格兩種。逗號(hào)主要用在類型說明和函數(shù)參數(shù)表中,分隔各個(gè)變量??崭穸嘤糜谡Z句各單詞之間,作間隔符。在關(guān)鍵字,標(biāo)識(shí)符之間必須要有一個(gè)以上的空格符作間隔,否則將會(huì)出現(xiàn)語法錯(cuò)誤,例如把int a;寫成 inta;C編譯器會(huì)把inta</p>
73、;<p> 當(dāng)成一個(gè)標(biāo)識(shí)符處理,其結(jié)果必然出錯(cuò)。</p><p><b> 5.常量</b></p><p> C 語言中使用的常量可分為數(shù)字常量、字符常量、字符串常量、符號(hào)常量、轉(zhuǎn)義字符等多種。在后面章節(jié)中將專門給予介紹。</p><p><b> 6.注釋符</b></p><
74、p> C 語言的注釋符是以“/*”開頭并以“*/”結(jié)尾的串。在“/*”和“*/”之間的即為注釋。程序編譯時(shí),不對(duì)注釋作任何處理。注釋可出現(xiàn)在程序中的任何位置。注釋用來向用戶提示或解釋程序的意義。在調(diào)試程序中對(duì)暫不使用的語句也可用注釋符括起來,使翻譯跳過不作處理,待調(diào)試結(jié)束后再去掉注釋符。</p><p> 3.3軟件工程方法論的應(yīng)用</p><p> 軟件工程是指導(dǎo)計(jì)算機(jī)軟件開
75、發(fā)和維護(hù)的工程學(xué),采用工程的概念、原理、技術(shù)、和方法開發(fā)與維護(hù)軟件,把經(jīng)過時(shí)間考驗(yàn)而證明正確的管理技術(shù)和當(dāng)前能夠得到的最好的技術(shù)方法結(jié)合起來。</p><p> 自從1968年在聯(lián)邦德國召開的國際會(huì)議上正式提出并使用了“軟件工程”這個(gè)術(shù)語以來,研究軟件工程的專家學(xué)者們陸續(xù)提出了100多條關(guān)于軟件工程的準(zhǔn)則或“信條”。著名的軟件工程專家B.W.Boehm綜合這些學(xué)者們的意見并總結(jié)了TRW公司多年開發(fā)軟件的經(jīng)驗(yàn),于
76、1983年在一篇論文中提出軟件工程的七條原理。他認(rèn)為這七條原理是確保軟件產(chǎn)品質(zhì)量和開發(fā)效率的原理的最小集合。這七條原理是互相獨(dú)立的,其中任意六條原理的組合都不能代替另一條原理,因此,它們是缺一不可的最小集合,然而這七條原理又是相當(dāng)完備的,人們雖然不能用數(shù)學(xué)方法嚴(yán)格證明它們是一個(gè)完備的集合,但是,可以證明在此之前已經(jīng)提出的100多條軟件工程原理都可以由這七條原理的任意組合蘊(yùn)含或派生。</p><p> 用分階段的
77、生命周期計(jì)劃嚴(yán)格管理</p><p> 經(jīng)統(tǒng)計(jì)表明,不成功的軟件項(xiàng)目中有一半左右是由于計(jì)劃不周造成的。</p><p> Boehm認(rèn)為,在軟件的整個(gè)生命周期中應(yīng)制定并嚴(yán)格執(zhí)行六類計(jì)劃:項(xiàng)目概要計(jì)劃、里程碑計(jì)劃、項(xiàng)目控制計(jì)劃、產(chǎn)品控制計(jì)劃、驗(yàn)證計(jì)劃、運(yùn)行維護(hù)計(jì)劃</p><p><b> 堅(jiān)持進(jìn)行階段評(píng)審</b></p>&
78、lt;p> 大部分錯(cuò)誤是在編碼之前造成的</p><p> 錯(cuò)誤發(fā)現(xiàn)與改正得越晚,所需付出的代價(jià)越高。</p><p> 因此,在每個(gè)階段都進(jìn)行嚴(yán)格的評(píng)審,以便盡早發(fā)現(xiàn)在軟件開發(fā)過程的錯(cuò)誤</p><p><b> 實(shí)行嚴(yán)格的產(chǎn)品控制</b></p><p> 在軟件開發(fā)過程中不要隨意改變需求,因?yàn)楦淖兡?/p>
79、項(xiàng)需求往往需要付出較高的代價(jià),但在實(shí)踐中用戶往往會(huì)提出需求變更,因此需要采取科學(xué)的產(chǎn)品控制技術(shù)。</p><p> 目前主要實(shí)行基準(zhǔn)配置管理:基準(zhǔn)配置是指經(jīng)過階段評(píng)審后的軟件配置成分,如各個(gè)階段產(chǎn)生的文檔或程序代碼。</p><p> 對(duì)涉及基準(zhǔn)配置的修改,必須經(jīng)過嚴(yán)格的評(píng)審,通過后才能實(shí)施修改。</p><p> 采用現(xiàn)代程序設(shè)計(jì)技術(shù)</p>
80、<p> 實(shí)踐表明:采用先進(jìn)的技術(shù)既可提高軟件開發(fā)的效率,又可提高軟件維護(hù)的效率。</p><p> 80年代及之前:結(jié)構(gòu)化分析、設(shè)計(jì)技術(shù)</p><p> 90年代:面向?qū)ο蠓治觥⒃O(shè)計(jì)技術(shù)</p><p><b> 結(jié)果應(yīng)能清楚地審查</b></p><p> 軟件產(chǎn)品是看不見、摸不著的邏輯產(chǎn)品,開
81、發(fā)過程難以評(píng)價(jià)和管理。</p><p> 根據(jù)軟件開發(fā)項(xiàng)目的總目標(biāo)及完成期限,規(guī)定開發(fā)組織的責(zé)任和產(chǎn)品標(biāo)準(zhǔn),使所得的結(jié)果能夠清楚地審查</p><p> 開發(fā)小組的人員應(yīng)該少而精</p><p> 開發(fā)小組人員的素質(zhì)和數(shù)量是影響軟件產(chǎn)品質(zhì)量和開發(fā)效率的重要因素。</p><p> 開發(fā)小組人員數(shù)目的增加,使相互交流復(fù)雜、費(fèi)用增加。&l
82、t;/p><p> 承認(rèn)不斷改進(jìn)軟件工程實(shí)踐的必要性</p><p> 遵循前6條基本原理,就能夠按照當(dāng)代軟件工程基本原理實(shí)現(xiàn)軟件的工程化生產(chǎn),但不能保證趕上時(shí)代前進(jìn)的步伐。</p><p> 積極主動(dòng)采納新的軟件技術(shù),且不斷總結(jié)經(jīng)驗(yàn)</p><p> 軟件工程的傳統(tǒng)途徑是“生命周期法”,強(qiáng)調(diào)“結(jié)構(gòu)化分析、結(jié)構(gòu)化設(shè)計(jì)”。</p>
83、;<p> ?。?)“生命周期法”的起源</p><p> 人類解決復(fù)雜問題時(shí)普遍采用的一個(gè)策略是“各個(gè)擊破”,也就是對(duì)問題進(jìn)行分解,然后再分別解決各個(gè)子問題的策略。</p><p> 軟件工程采用的“生命周期法”,就是從時(shí)間角度對(duì)軟件開發(fā)和維護(hù)的復(fù)雜問題進(jìn)行分解,把軟件生存的漫長周期依次劃分為若干個(gè)階段,每個(gè)階段有相對(duì)獨(dú)立的任務(wù),然后再逐步完成每個(gè)階段的任務(wù)。</
84、p><p> ?。?)生命周期劃分的原則</p><p> 各階段的任務(wù)彼此間盡可能相對(duì)獨(dú)立,同一個(gè)階段各項(xiàng)任務(wù)的性質(zhì)盡可能相同,從而降低每個(gè)階段任務(wù)的復(fù)雜性,簡化不同階段之間的聯(lián)系,有利于軟件開發(fā)過程的組織管理。</p><p> (3) 生命周期的劃分</p><p> 軟件生命周期一般分為:軟件定義(問題定義、可行性研究、需求分析)、
85、軟件開發(fā)(總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼和單元測(cè)試、綜合測(cè)試)、軟件維護(hù)等三個(gè)時(shí)期。</p><p> 軟件工程各階段的基本任務(wù)</p><p><b> 問題定義:</b></p><p> 問題定義階段需要回答的關(guān)鍵問題是:“有解決的問題是什么?”通過問題定義階段的工作,系統(tǒng)分析員應(yīng)該提出關(guān)于問題性質(zhì)、工程目標(biāo)和規(guī)模的書面報(bào)告。通過對(duì)實(shí)際用
86、戶和使用部門負(fù)責(zé)人的訪問調(diào)查,分析員扼要地寫出他對(duì)問題的理解,并在用戶和使用部門負(fù)責(zé)人的會(huì)議上認(rèn)真討論這份書面報(bào)告,澄清含糊不清的地方,改正理解不正確的地方,最后得到一份雙方都滿意的文檔。</p><p><b> 可行性研究</b></p><p> 這個(gè)階段要回答的關(guān)鍵問題是:“對(duì)于上一個(gè)階段所確定的問題有行的通的解決方法嗎?”在問題定義階段提出的對(duì)工程目標(biāo)和
87、規(guī)模的報(bào)告通常比較模糊??尚行匝芯侩A段應(yīng)該導(dǎo)出系統(tǒng)的高層邏輯模型(通常用數(shù)據(jù)流圖表示),并且在此基礎(chǔ)上更準(zhǔn)確、更具體地確定工程規(guī)模和目標(biāo)。然后分析員更準(zhǔn)確地估計(jì)系統(tǒng)的成本和效益,對(duì)建議的系統(tǒng)進(jìn)行仔細(xì)的成本/效益分析。</p><p><b> 需求分析</b></p><p> 這個(gè)階段的任務(wù)是“為了解決這個(gè)問題,目標(biāo)系統(tǒng)必須做什么”,主要是確定目標(biāo)系統(tǒng)必須具備哪
88、些功能。在需求分析階段確定的系統(tǒng)邏輯模型是以后設(shè)計(jì)和實(shí)現(xiàn)目標(biāo)系統(tǒng)的基礎(chǔ),因此必須準(zhǔn)確完整地體現(xiàn)用戶的要求。該階段有寫的文檔有規(guī)格說明書、初步的用戶使用手冊(cè)、系統(tǒng)功能框架圖等。</p><p><b> 總體設(shè)計(jì)</b></p><p> 這個(gè)階段要回答的關(guān)鍵問題是:“概括地說,應(yīng)該如何解決這個(gè)問題?”首先應(yīng)該考慮幾種可能的解決方案。例如,目標(biāo)系統(tǒng)的一些主要功能是用
89、計(jì)算機(jī)自動(dòng)完成還是用人工完成。通常至少考慮下述幾類可能的方案:低成本解決方案、中等成本的解決方案和高成本的“十全十美”的系統(tǒng)。系統(tǒng)分析員應(yīng)該使用系統(tǒng)流程圖或者其他工具描述每種可能的系統(tǒng)。</p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p> 總體設(shè)計(jì)階段以比較抽象概括的方式提出了解決問題的方法。詳細(xì)設(shè)計(jì)階段的任務(wù)就好似把解決方法具體化,也就是回答下面這個(gè)關(guān)
90、鍵問題:“應(yīng)該怎樣具體地實(shí)現(xiàn)這個(gè)系統(tǒng)呢?”這個(gè)階段的任務(wù)還不是編寫程序,而是設(shè)計(jì)出程序的詳細(xì)規(guī)格說明。通常用HIPO圖(層次圖加輸入/處理/輸出圖)或PDL語言(過程設(shè)計(jì)語言)描述詳細(xì)的結(jié)果。該階段要產(chǎn)生的文檔有偽代碼、詳細(xì)的測(cè)試計(jì)劃、最終的用戶使用手冊(cè)等。</p><p><b> 編碼和單元測(cè)試</b></p><p> 這個(gè)階段的關(guān)鍵任務(wù)是寫出正確的容易理解
91、、容易維護(hù)的程序模塊。程序員應(yīng)該根據(jù)目標(biāo)系統(tǒng)的性質(zhì)和實(shí)際環(huán)境,選取一種適當(dāng)?shù)母呒?jí)程序設(shè)計(jì)語言,把詳細(xì)設(shè)計(jì)的結(jié)果翻譯成用選定的語言書寫的程序,并且仔細(xì)測(cè)試編寫出的每一個(gè)模塊。</p><p><b> 綜合測(cè)試</b></p><p> 這個(gè)階段的主要任務(wù)是通過各種類型的測(cè)試(及相應(yīng)的調(diào)試)使軟件達(dá)到預(yù)定的要求。最基本的測(cè)試是集成測(cè)試和驗(yàn)收測(cè)試。所謂集成測(cè)試是根據(jù)設(shè)
92、計(jì)的軟件結(jié)構(gòu),把經(jīng)過單元測(cè)試檢驗(yàn)的模塊按某種選定的策略裝備起來,在裝配過程中對(duì)程序進(jìn)行必要的測(cè)試。所謂驗(yàn)收測(cè)試是按照規(guī)格說明書的規(guī)定(通常在需求分析階段確定),有用戶(或在用戶的積極參加下)對(duì)目標(biāo)系統(tǒng)進(jìn)行驗(yàn)收。</p><p><b> 軟件維護(hù)</b></p><p> 軟件維護(hù)階段的關(guān)鍵任務(wù)是,通過各種必要的維護(hù)活動(dòng)是系統(tǒng)持久地滿足用戶的需要。通常有四類維護(hù)活
93、動(dòng):改正性維護(hù),有就是診斷和改正在使用過程中發(fā)現(xiàn)的軟件錯(cuò)誤;適應(yīng)性維護(hù),即修改軟件以適應(yīng)環(huán)境的變化;完善性維護(hù),即根據(jù)用戶的要求改進(jìn)或擴(kuò)充軟件是它更完善;預(yù)防性維護(hù),即修改軟件為將來的維護(hù)活動(dòng)預(yù)先做準(zhǔn)備。每一項(xiàng)維護(hù)活動(dòng)都應(yīng)該準(zhǔn)確地記錄下來,作為正式的文檔加以保存。</p><p> 3.4詞法語法分析簡介</p><p> 詞法分析的任務(wù)是從左到右一個(gè)字符一個(gè)字符地讀入源程序,對(duì)構(gòu)成源
94、程序的字符流進(jìn)行掃描和分解,從而識(shí)別出一個(gè)個(gè)的單詞(也稱單詞符號(hào)或符號(hào))。這里所謂的單詞是指邏輯上緊密相連的一組字符,這些字符具有集體含義。</p><p> 語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語,如“程序”,“語句”,“表達(dá)式”等等,即判斷單詞序列是否符合組成各類語法短語的組成規(guī)則,一般這種語法短語,也稱為語法單位,可表示成語法樹。</p><p> 3.5
95、詞法需求分析簡介</p><p> 詞法分析階級(jí)是編譯過程的第一個(gè)階級(jí)。這個(gè)階級(jí)的任務(wù)是從左到右一個(gè)字符一個(gè)字符地讀入源程序,對(duì)構(gòu)成源程序的字符流進(jìn)行掃描和分解,從而識(shí)別一個(gè)個(gè)單詞(也稱為單詞符號(hào)或符號(hào))。這里所謂的單詞是指邏輯上緊密相連的一組字符,這些字符具有集體含義。比如標(biāo)識(shí)是由字母開頭,后跟字母、數(shù)字字符序列組成的一種單詞,。保留字是一種單詞,此外還有算符,界符等等。</p><p&g
96、t; 詞法分析器的主要任務(wù)是讀入輸入字符,產(chǎn)生記號(hào)序列,提交給語法分析使用。詞法分析器與語法分析器之間的交互如下圖:</p><p><b> 源程序記號(hào)</b></p><p><b> 取下一個(gè)字符</b></p><p><b> 剔除空白符和注釋</b></p><
97、;p> 詞法分析器讀入輸入串,將其轉(zhuǎn)換成將被語法分析器分析的記號(hào)流。許多語言允許“空白符”(空格,制表符或者換行符)出現(xiàn)在記號(hào)之間。原程序中的注釋一般都被語法分析器和翻譯器忽略,所以他們也可以看成空白符。</p><p><b> 常數(shù)</b></p><p> 在一個(gè)表達(dá)式中,任何一個(gè)允許單個(gè)數(shù)字出現(xiàn)的位置都應(yīng)該允許任何整型常數(shù)出現(xiàn)。由于翻譯期間把數(shù)作為
98、一個(gè)單元來處理,收集數(shù)字形成整數(shù)這一任務(wù)一般由詞法分析器完成。</p><p><b> 識(shí)別標(biāo)識(shí)符和關(guān)鍵字</b></p><p> 保留關(guān)鍵字的集合可以通過適當(dāng)?shù)爻跏蓟?hào)表而得到正確的處理。</p><p> 實(shí)現(xiàn)詞法分析器的接口</p><p> 在詞法分析中,使用術(shù)語“記號(hào)”,“模式”,“詞素”表示特定
99、含義。記號(hào)包括:關(guān)鍵字、標(biāo)識(shí)符、操作符、常量、文字串、和標(biāo)點(diǎn)符號(hào)。詞法分析器把與記號(hào)有關(guān)的信息收集在記號(hào)的屬性中。記號(hào)影響語法分析,而屬性影響記號(hào)的翻譯。在實(shí)際實(shí)現(xiàn)時(shí),記號(hào)通常只有一個(gè)屬性,即指向符號(hào)表中一個(gè)表項(xiàng)的指針,與記號(hào)有關(guān)的信息保存在這個(gè)詞素第一次出現(xiàn)的行為。這些信息存儲(chǔ)在符號(hào)表中該標(biāo)識(shí)符對(duì)應(yīng)的表項(xiàng)內(nèi)。</p><p> 記號(hào)的命名規(guī)則:正規(guī)表達(dá)式</p><p> 建立正規(guī)表
100、達(dá)式時(shí),可以先定義簡單的正規(guī)表達(dá)式,然后用它們構(gòu)造出更復(fù)雜的正規(guī)表達(dá)式。每個(gè)表達(dá)式r表示一個(gè)語言L(R)。</p><p> 記號(hào)的識(shí)別:狀態(tài)轉(zhuǎn)換圖</p><p> 3.6語法需求分析簡介</p><p> 語法分析是編譯過程的第二個(gè)階級(jí)。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語,如“程序”,“語句”,“表達(dá)式”等等。一般這種語法短語,
101、也稱為語法單位,可表示成語法樹。語法分析所依據(jù)的是語言的語法規(guī)則,即描述程序結(jié)構(gòu)的規(guī)則。通過語法分析確定整個(gè)輸入串是否構(gòu)成一個(gè)語法上正確的程序。詞法分析和語法分析本質(zhì)上都是對(duì)源程序的結(jié)構(gòu)進(jìn)行分析。但詞法分析的任務(wù)僅對(duì)源程序進(jìn)行線性掃描即可完成,比如識(shí)別標(biāo)識(shí)符,因?yàn)闃?biāo)識(shí)符的結(jié)構(gòu)是字母打頭的字母和數(shù)字序列,這只要順序掃描輸入流,遇到既不是字母又不是數(shù)字字符時(shí),將前面所發(fā)現(xiàn)的所有字母和數(shù)字組合在一起而構(gòu)成單詞標(biāo)識(shí)符。但這種線性掃描則不能用于識(shí)
102、別遞歸定義的語法成分,比如就不能用此辦法去匹配表達(dá)式中的括號(hào)。</p><p> 語法分析的任務(wù)是語法分析器接收詞法分析研究器提供的記號(hào)串,檢查它們是否能由源程序的文法產(chǎn)生,語法分析器在編譯器中的位置如圖所示:</p><p> 源程序記號(hào) 中間表示</p><p><b> 語法樹&
103、lt;/b></p><p><b> 取下一</b></p><p><b> 個(gè)記號(hào)</b></p><p> 典型的文法的語法分析器有三類:一類是通用的語法分析方法,如Cocke-Younger-Kasami算法和Early算法,這些方法在生成編譯器時(shí)效率太低。編譯器常用的是自頂向下和自底向上的方法。&l
104、t;/p><p> 采用自頂向下的遞歸子程序法,就是對(duì)應(yīng)每個(gè)非終結(jié)符語法單元,編一個(gè)獨(dú)立的處理子程序。語法分析從讀入第一個(gè)單詞開始,由非終結(jié)符即開始符出發(fā),沿語法描述圖箭頭指出的方向進(jìn)行分析。當(dāng)遇到非終結(jié)符時(shí),則調(diào)用相應(yīng)的處理子程序,從語法描述圖看也就進(jìn)入了一個(gè)語法單元,再沿當(dāng)前所進(jìn)入的語法描述圖的箭頭方向進(jìn)行分析,當(dāng)遇到終結(jié)符時(shí),則判斷當(dāng)前讀入的單詞是否與圖中的終結(jié)符相匹配,若匹配,則執(zhí)行相應(yīng)的語義程序。再讀取下
105、一個(gè)單詞繼續(xù)分析。遇到分支點(diǎn)時(shí)將當(dāng)前的單詞與分支點(diǎn)上的多個(gè)終結(jié)符逐個(gè)相比較,若都不匹配時(shí)可能是進(jìn)入下一非終結(jié)符語法單位或是出錯(cuò)。</p><p><b> 3.7符號(hào)表的應(yīng)用</b></p><p> 在編譯程序中符號(hào)表用來存放語言中出現(xiàn)的有關(guān)標(biāo)識(shí)符的屬性信息,這些信息集中反映了標(biāo)識(shí)符的語義特征屬性。在詞法分析及語法分析過程中不斷積累和更新表中的信息,并在詞法分析
106、到代碼生成和各階段,按各自的需要從表中獲得不同的屬性信息。不論編譯策略是否分趟,符號(hào)表的作用和地位是完全一致的。符號(hào)表的功能主要有:</p><p> 收集符號(hào)屬性:在分析語言程序中標(biāo)識(shí)符說明部分時(shí),編譯程序根據(jù)說明信息收集有關(guān)標(biāo)識(shí)符的屬性,并在符號(hào)表中建立符號(hào)的相應(yīng)屬性信息。</p><p> 上下文語義的合法性檢查的依據(jù):同一個(gè)標(biāo)識(shí)符可能在程序和不同地方出現(xiàn),而有關(guān)該符號(hào)和屬性是在
107、不同情況下收集的,特別是在多趟編譯及程序分段編譯的情況下,更需檢查標(biāo)識(shí)符屬性在上下文中的一致性和全法性。通過符號(hào)表中屬性記錄可進(jìn)行這些語義檢查。</p><p> 作為目標(biāo)代碼生成階段地址分配的依據(jù):除語言中規(guī)定的臨時(shí)分配存儲(chǔ)的變量外,每個(gè)符號(hào)變量在目標(biāo)代碼生成時(shí)需要確定其在存儲(chǔ)分配的位置。語言程序中的符號(hào)變量由它被定義的存儲(chǔ)類別或被定義的位置來確定。首先要確定其被分配的區(qū)域。其次是根據(jù)變量出現(xiàn)的次序。<
108、/p><p> 在編譯程序中符號(hào)表用來存放語言程序中出現(xiàn)的有關(guān)標(biāo)識(shí)符的屬性信息,這些信息集中反映了標(biāo)識(shí)符的語義特征屬性。在詞法分析及語法分析過程中不斷積累和更新表中的信息,并在詞法分析到代碼生成的各階段,按各自的需要從表中獲取不同的屬性信息。不論編譯策略是否分趟,符號(hào)表的作用和地位是完全一致的。</p><p> 符號(hào)表的功能主要有:</p><p> 收集符號(hào)屬
109、性:在分析語言程序中標(biāo)識(shí)符說明部分時(shí),編譯程序根據(jù)說明信息收集有關(guān)標(biāo)識(shí)符的屬性,并在符號(hào)表中建立符號(hào)的相應(yīng)屬性信息。</p><p> 下文語義的合法性檢查的依據(jù):同一個(gè)標(biāo)識(shí)符可能在程序和不同地方出現(xiàn),而有關(guān)該符號(hào)和屬性是在不同情況下收集的,特別是在多趟編譯及程序分段編譯的情況下,更需檢查標(biāo)識(shí)符屬性在上下文中的一致性和全法性。通過符號(hào)表中屬性記錄可進(jìn)行這些語義檢查。</p><p>
110、作為目標(biāo)代碼生成階段地址分配的依據(jù):除語言中規(guī)定的臨時(shí)分配存儲(chǔ)的變量外,每個(gè)符號(hào)變量在目標(biāo)代碼生成時(shí)需要確定其在存儲(chǔ)分配的位置。語言程序中的符號(hào)變量由它被定義的存儲(chǔ)類別或被定義的位置來確定。首先要確定其被分配的區(qū)域。其次是根據(jù)變量出現(xiàn)的次序。</p><p> 語言符號(hào)可分為關(guān)鍵字(保留字)符號(hào),操作符號(hào)幾標(biāo)識(shí)符號(hào)。他們之間的主要屬性有較大的差別。因此通常為他們建立不同的符號(hào)表。</p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- c語言編譯器設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)___c語言編譯器的實(shí)現(xiàn)畢業(yè)論文
- 編譯原理課程設(shè)計(jì)--c語言編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語言編譯器實(shí)現(xiàn)
- c語言編譯器實(shí)現(xiàn)-編譯原理課程設(shè)計(jì)
- 小型c語言編譯器設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)____c語言編譯器的實(shí)現(xiàn)-
- C代碼規(guī)則編譯器的設(shè)計(jì)和實(shí)現(xiàn).pdf
- c語言編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)---c語言編譯器的實(shí)現(xiàn)
- 編譯原理課程的設(shè)計(jì)--c語言編譯器
- NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 畢業(yè)論文-c語言在線編譯器
- c語言在線編譯器畢業(yè)論文
- 編譯原理課程設(shè)計(jì)---s語言的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 基于ASIP的專用C語言編譯器的設(shè)計(jì)與實(shí)現(xiàn).pdf
- C編譯器中間代碼生成及其后端的設(shè)計(jì)與實(shí)現(xiàn).pdf
- DSP-2400的C語言編譯器的設(shè)計(jì)及實(shí)現(xiàn).pdf
- 編譯原理課程設(shè)計(jì)---小型程序設(shè)計(jì)語言編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- c-編譯器設(shè)計(jì)文檔
評(píng)論
0/150
提交評(píng)論