



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
真的ネ掉線嗎??、????????????C.語言編逹器的設(shè)計開發(fā)ぎ節(jié)代碼格式設(shè)計與實現(xiàn)畢業(yè)設(shè)計(論文)中文摘要C語言編譯器的設(shè)計開發(fā)摘要編譯程序是現(xiàn)代計算機系統(tǒng)的基本組成部分之一,而且多數(shù)計算機系統(tǒng)都含有不止一個高級語言的編譯程序,對有些高級語言甚至配置了幾個不同性能的編譯程序。從功能上看,ー個編譯程序就是ー個語言翻譯程序。它把ー種語(稱作源語言)書寫的程序翻譯成另ー種語言(稱作目標(biāo)語言)的等價的程序。比如匯編程序是ー個翻譯程序,它把匯編語言程序翻譯成機器語言程序。如果源語言是像FORTRAN,PASCAL,或C那樣的高級語言,目標(biāo)語言是像匯編語言或機器語言那樣的低級機器語言,則這種翻譯程序稱作編譯程序。ー個編譯程序的重要性體現(xiàn)在它使得多數(shù)計算機用戶不必考慮與機器有關(guān)的繁素細節(jié),使程序同和程序設(shè)計專家畢業(yè)設(shè)計(論文)外文摘要TitleTheDesignandDevelopmentofCCompilerAbstractThecompilerprocedureandtranslateoffundamentalisamoderncalculatorsystemtoconstitutetheoneoftheparts,andthesystemofmostcalculatorsallsimplytheeditandtranslatingoflanguageofahighclasstheprocedure,eveninstalledtheprocedureofeditandtranslatingofafewanddifferentfunctiontosomehighclasslanguage.Seefromthefunction,anditisprocedureofalanguagetranslationthateditandtranslatetheprocedure.Ittranslateakindoflanguage(callthesourcelanguage)procedurethatwriteintotheprocedureoftheanotherlanguage(callthetargetlanguage).Forexampleeditcollectedmaterialstheprocedureisatranslationprocedure,ittotranslateeditcollectedmaterialsthelanguageprocedureintothemachinelanguagetheprocedure.Ifhighclasslanguage,targetlanguagethatlanguageislikeofFORTRAN,PASCAL,ortheCissotoaseditcollectedmaterialsthelanguageormachinelanguagesooflowclassjadearticlespeech,thenthiskindoftranslationtheprocedurecalltoeditandtranslatetheprocedure.Animportancethateditandtranslateprocedurenowitmakemostcalculatorsesthecustomerneednotconsidertheheavydetailsthathaverelationwithmachine,andmaketheproceduredesigntheexpert7sindependencewithprocedureinthemachine,thequantitythatthisisforthemachinethatnowadaysagekeeponwithcategorytoconstantlyincreasetoimportance.Editandtranslatedtheprocesstodividethelinethephrasemethodtheanalysis,phrasingtheanalysis,languagetherighteousnesstheanalysis,inthecenterthecodeisborn,code,targetthecodeisborn,sixrank.Anothertwoimportanceofwork:Theformhandleswithcomeamisstohandletohaveconnectionwithabovesixranksesall.Keywordscompilerprocedure,sourcelanguage,targetlanguage,codegeneration,middlecode,synaxanalyers,lexicalanalyzers,intermediatecode,bytecode!引言(或緒論) ??? 12編譯器的基礎(chǔ)知識 ??????22.1編譯器的發(fā)展背景 析 33編譯過程概述 53系統(tǒng)需求分析 83.1LEX概述 82C語言簡介 93軟件工程方法論的應(yīng)用 10介 135詞法需求分析簡介 136語法需求分析簡介 ...147符號表的應(yīng)用 154系統(tǒng)設(shè)計 16圖 162語法分析體流程圖 173語法分析概要設(shè)計 184.4目標(biāo)代碼的分析 21580x86指令系統(tǒng) 24計 25.7虛擬寄存器的設(shè)計 26.8字節(jié)代碼詳細設(shè)計 275使用說明書 346結(jié)論 …… 35謝 36參考文獻 37!引言(或緒論)編譯器的設(shè)計涉及到編譯程序構(gòu)造的一般原理、基本設(shè)計方法、主要實現(xiàn)技術(shù)和一些自動構(gòu)造工具。盡管“編譯程序”是特指將高級程序設(shè)計語言翻譯成低級語言的軟件,但編譯程序構(gòu)造的基本原理和技術(shù)也廣泛應(yīng)用于一般的設(shè)計和實現(xiàn),因此,是ー門對實踐性要求較高的課程。目前,世界上存在著數(shù)千種源語言,既有Fortran和Pasca!這樣的傳統(tǒng)程序設(shè)計語言,也有各計算機應(yīng)用領(lǐng)域中出現(xiàn)的專用語言。目標(biāo)語言也同樣廣泛,目標(biāo)語言可以是另ー種程序設(shè)計語言或者是從微處理機到計算機的任何計算機的機器語言。不同語言需要不同的編譯器。根據(jù)編譯器的構(gòu)造方法或者它們要實現(xiàn)的功能,編譯器被分為一遍編譯器、多遍編譯器、裝入并執(zhí)行編譯器、調(diào)試編譯器、優(yōu)化編譯器等多種類別。從表面上看,編譯器的種類似乎千變?nèi)f化,多種多樣,實質(zhì)上任何編譯器所要完成的基本任務(wù)都是相同的。通過理解這些任務(wù),我們可以利用同樣的基本技術(shù)為各種各樣的源語言和目標(biāo)機器構(gòu)建編譯器。編譯器也可能沒有生成真正的可執(zhí)行代碼,而是生成了某種形式的匯編代碼,這必須由匯編器、鏈接器和裝入器進行進ー步處理。匯編器、鏈接器和裝入器可由操心系統(tǒng)提供或由編譯器自帶。在翻譯期間,中間表示或IR代表了源程序和數(shù)據(jù)結(jié)構(gòu)。雖然抽象語法樹是源代碼完美充分的表達,即使對于代碼生成也不過這樣,但是它與目標(biāo)代碼極不相像,在控制流構(gòu)造上尤為如此。在控制流構(gòu)造上,目標(biāo)代碼使用轉(zhuǎn)移語句而不是if和while語句。因此,編譯器編寫者可能希望從語法樹生成一個更接近目標(biāo)代碼的中間表示形式,或者用這樣ー個中間表示代替語法樹,然后再從這個新的中間表示生成目標(biāo)代碼。中間代碼生成在進行了上述的語法分析和語義分析的工作之后,有的編譯程序?qū)⒃闯绦蜃兂梢环N內(nèi)部表示形式,這種內(nèi)部表示形式叫做中間語言或中間代碼。所謂“中間代碼”是一種結(jié)構(gòu)簡單、含義明確的記號系統(tǒng),這種記號系統(tǒng)可以設(shè)計為多種多樣的形式,重要的設(shè)計原則為兩點:ー是容易生成;ニ是容易將它翻譯成目標(biāo)代碼。很多編譯程采用了一種近似“三地址指令”的“四元式”中間代碼,這種四元式的形式為:(運算符,運算對象1,運算對象2,結(jié)果)。2編譯器的基礎(chǔ)知識ー個編譯程序就是一個語言翻譯程序。它把ー種語(稱作源語言)書寫的程序翻譯成另ー種語言(稱作目標(biāo)語言)的等價的程序。比如匯編程序是ー個翻譯程序,它把匯編語言程序翻譯成機器語言程序。如果源語言是像FORTRAN,PASCAL,或C那樣的高級語言,目標(biāo)語言是像匯編語言或機器語言那樣的低級語言,則這種翻譯程序稱作編譯程序。2.1編譯器的發(fā)展背景編譯程序是現(xiàn)代計算機系統(tǒng)的基本組成部分之一,而且多數(shù)計算機系統(tǒng)都含有不止ー個高級語言的編譯程序,對有些高級語言甚至配置了幾個不同性能的編譯程序。從功能上看,ー個編譯程序就是一個語言翻譯程序。它把ー種語(稱作源語言)書寫的程序翻譯成另ー種語言(稱作目標(biāo)語言)的等價的程序。比如匯編程序是ー個翻譯程序,它把匯編語言程序翻譯成機器語言程序。如果源語言是像FORTRAN,PASCAL,或C那樣的高級語言,目標(biāo)語言是像匯編語言或機器語言那樣的低級語言,則這種翻譯程序稱作編譯程序。ー個編譯程序的重要性體現(xiàn)在它使得多數(shù)計算機用戶不必考慮與機器有關(guān)的繁索細節(jié),使程序員和程序設(shè)計專家獨立于機器,這對于當(dāng)今機器的數(shù)量和種類持續(xù)不斷地增長的年代憂為重要。除了編譯程序外,還需要一些其它的程序才能生成一個可在計算機執(zhí)行的目標(biāo)程序。ー個源程序有時可能分成幾個模塊存放在不同的文件里,將這些源程序匯集在ー起的任務(wù),由一個叫做預(yù)處理程序的程序完成,有些預(yù)處理程序也負責(zé)宏展開,像C語言和預(yù)處理程序要完成文件合并、宏展開等任務(wù)。也就是說,ー個編譯程序的輸入可能要一個或多個預(yù)處理程序來產(chǎn)生,另外,為得到能運行的機器代碼,編譯程序的輸出可能仍需要進ー步地處理。詞法分析階級是編譯過程的第一個階級。這個階級的任務(wù)是從左到右一個字符一個字符地讀入源程序,對構(gòu)成源程序的字符流進行掃描和分解,從而識別ー個個單詞(也稱為單詞符號或符號)。這里所謂的單詞是指邏輯上緊密相連的ー組字符,這些字符具有集體含義。比如標(biāo)識是由字母開頭,后跟字母、數(shù)字字符序列組成的ー種單詞,。保留字是ー種單詞,此外還有算符,界符等等。語法分析是編譯過程的第二個階段。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語。如“程序”,“語句”,“表達式”等等。一般這種語法短語也稱為語法單位,可表示成語法樹。語法分析所依據(jù)的是語言的語法規(guī)則,即描述程序結(jié)構(gòu)的規(guī)則。通過語法分析確定整個輸入串是否構(gòu)成一個語法上正確的程序。典型的文法的語法分析器有三類:ー類是通用的語法分析方法,如Cocke-Younger-Kasami算法和Early算法,這些方法在生成編譯器時效率太低。編譯器常用的是自頂向下和自底向上的方法。采用自頂向下的遞歸子程序法,就是對應(yīng)每個非終結(jié)符語法單元,編ー個獨立的處理子程序。語法分析從讀入第一個單詞開始,由非終結(jié)符即開始符出發(fā),沿語法描述圖箭頭指出的方向進行分析。當(dāng)遇到非終結(jié)符時,則調(diào)用相應(yīng)的處理子程序,從語真的不掉線嗎??ヽ????????????法描述圖看也就進入了一個語法單元,再沿當(dāng)前所進入的語法描述圖的箭頭方向進行分析,當(dāng)遇到終結(jié)符時,則判斷當(dāng)前讀入的單詞是否與圖中的終結(jié)符相匹配,若匹配,則執(zhí)行相應(yīng)的語義程序。再讀取下ー個單詞繼續(xù)分析。遇到分支點時將當(dāng)前的單詞與分支點上的多個終結(jié)符逐個相比較,若都不匹配時可能是進入下ー非終結(jié)符語法單位或是出錯。自頂向下的分析算法通過在最左推導(dǎo)中描述出各個步驟來分析記號串輸入。之所以稱這樣的算法為自頂向下是由于分析樹隱含的編號是ー個前序編,而且其順序是由根到葉子。自頂向下的分析程序有兩類:回溯分析程序和預(yù)測分析程序。預(yù)測分析程序試圖利用ー個或多個先行記號來預(yù)測出輸入串中的下ー個構(gòu)造,而回溯分析程序則試著分析其他可能的輸入,當(dāng)ー種可能失敗時就要求榆入中備份任意數(shù)量的字符。雖然回溯分析程序比預(yù)測強大許多,但它們都非常慢,一般都在指數(shù)的數(shù)量級上,所以對于實際的編譯器并不適合。遞歸下降程序分析和LL(1)分析一般地都要求計算先行集合,它們分別稱作First集合和Follow集合。由于無需顯示地構(gòu)造出這些集合就可以構(gòu)造出簡單的自頂向下的分析程序,所以在基本算法的介紹之后我們再討論它們。之后我償還要談到ー個由遞歸下降分析構(gòu)造的分析程序〇由于代碼生成較復(fù)雜,所以編譯器一般將這ー階段分成幾個涉及不同中間數(shù)據(jù)結(jié)構(gòu)的步驟,其中包括了某種稱作中間代碼的抽象代碼。編譯器也可能沒有生成真正的可執(zhí)行代碼,而是生成了某種形式的匯編代碼,這必須由匯編器、鏈接器和裝入器進行進ー步處理。匯編器、鏈接器和裝入器可由操心系統(tǒng)提供或由編譯器自帶。在翻譯期間,中間表示或IR代表了源程序和數(shù)據(jù)結(jié)構(gòu)。雖然抽象語法樹是源代碼完美充分的表達,即使對于代碼生成也不過這樣,但是它與目標(biāo)代碼極不相像,在控制流構(gòu)造上尤為如此。在控制流構(gòu)造上,目標(biāo)代碼使用轉(zhuǎn)移語句而不是if和while語句。因此,編譯器編寫者可能希望從語法樹生成一個更接近目標(biāo)代碼的中間表示形式,或者用這樣ー個中間表示代替語法樹,然后再從這個新的中間表示生成目標(biāo)代碼。這種類似目標(biāo)代碼的中間表示稱為中間代碼。2.2編譯器研發(fā)的可行性分析編寫編譯器的原理和技術(shù)具有十分普遍的意義,以致于在每ー個計算機科學(xué)家的研究生涯中,許多原理和技術(shù)都會反復(fù)用到。編譯器的編寫涉及到程序設(shè)計語言、計算機體系結(jié)構(gòu)、語言理論、算法和軟件工程等學(xué)科。幸運的是,有幾種基本編譯器編寫技術(shù)已經(jīng)被用于構(gòu)建許多計算機的多種語言翻譯器。簡單的說,編譯器是ー個程序,它讀入用某種語言(源語言)編寫的程序并將其翻譯成一個與之等價的以另ー種語言(目標(biāo)語言)編寫的程序。作為這個翻譯過程匠ー個重要組成部分,編譯器能夠向用戶報告被編譯的源程序中出現(xiàn)的錯誤。編譯器由兩部分組成:分析與綜合。分析部分將源程序切分成一些基本塊并形成源程序的中間表示,綜合部分把源程序的中間表示轉(zhuǎn)為所需的目標(biāo)程序。在分析期間,源程序所蘊含的操作將被確定下來并被表示成為ー個稱為語法樹的分層結(jié)構(gòu)。語法樹的每個節(jié)點表示一個操作,該節(jié)點的子節(jié)點表示這個操作的參數(shù)。許多操縱源程序的軟件工具都首先完成某種類型的分析。下邊是這類工具的示例:真的不掉線嗎??、????????????
1.結(jié)構(gòu)編輯器,結(jié)構(gòu)編輯器將一個命令序列作為1.結(jié)構(gòu)編輯器,結(jié)構(gòu)編輯器將一個命令序列作為輸入ー構(gòu)造程序。智能打印機,智能打印機能夠?qū)Τ绦蜻M行分析,打印出結(jié)構(gòu)清晰的程序。靜態(tài)檢查器,靜態(tài)檢查器讀入ー個程序,分析這個程序,并在不運行這個程序的條件試圖發(fā)現(xiàn)程序的潛在錯誤。解釋器,解釋器不是通過翻譯來產(chǎn)生目標(biāo)程序,而是直接執(zhí)行源程序中蘊含的操作。目前,世界上存在著數(shù)千種源語言,既有Fortran和Pasca!這樣的傳統(tǒng)程序設(shè)計語言,也有各計算機應(yīng)用領(lǐng)域中出現(xiàn)的專用語言。目標(biāo)語言也同樣廣泛,目標(biāo)語言可以是另ー種程序設(shè)計語言或者是從微處理機到計算機的任何計算機的機器語言。不同語言需要不同的編譯器。根據(jù)編譯器的構(gòu)造方法或者它們要實現(xiàn)的功能,編譯器被分為一遍編譯器、多遍編譯器、裝入并執(zhí)行編譯器、調(diào)試編譯器、優(yōu)化編譯器等多種類別。從表面上看,編譯器的種類似乎千變?nèi)f化,多種多樣,實質(zhì)上任何編譯器所要完成的基本任務(wù)都是相同的。通過理解這些任務(wù),我們可以利用同樣的基本技術(shù)為各種各樣的源語言和目標(biāo)機器構(gòu)建編譯器。從20世紀50年代早期第一個編譯器出現(xiàn)到今,我們所掌握的有關(guān)編譯器的知識已經(jīng)得到了長足的發(fā)展。整個20世紀50年代,編譯器的編寫一直被認為是ー個極難的問題。目前我們已經(jīng)系統(tǒng)地掌握了處理編譯期間發(fā)生的許多重要任務(wù)的技術(shù)。良好的實現(xiàn)語言、程序設(shè)計環(huán)境和軟件工具也已經(jīng)被開發(fā)出來。20世紀50年代末有人開始研究編譯程序的自動生成技術(shù),提出并研制編譯程序的編譯程序。它的功能是以任ー語言的詞法規(guī)則、語法規(guī)則和語義解釋出發(fā),自動產(chǎn)生該語言的編譯程序。目前,很多自動生成的工具已廣泛使用,如詞法分析的生成系統(tǒng)LEX,語法分析程序的生成系統(tǒng)YACC等。20世紀60年代起,不斷有人使用自展技術(shù)來構(gòu)造編譯程序。自展的主要特征是用被編譯的語言來書寫該語言自身的編譯程序。自從1971年,PASCAL的編譯程序用自展技術(shù)生成后,起影響就越來越大。研究編譯程序是有意義在于:編譯程序構(gòu)造是計算機科學(xué)中的ー個非常成功的分支,也是最早獲的成功的分支之一;它與文件轉(zhuǎn)換程序關(guān)系密集,且不僅僅適用于編譯程序;它包含許多在實際應(yīng)用中有用的算法。由于近幾年并行機及多處理機的發(fā)展,對軟件的并行處理技術(shù)提出了新的要求。特別是并行編譯技術(shù)發(fā)展很快,目前處理并行編譯技術(shù)有兩種方法:第一種方法,運用重構(gòu)技術(shù)把已有的串行語言編寫的程序經(jīng)過相關(guān)分析,分解成可并行的成分,分配到多CPU或多處理機上運行,這種技術(shù)國內(nèi)已有FORTRAN和C語言的并行重構(gòu)處理系統(tǒng),相當(dāng)成功。第二種方法,即在程序設(shè)計語言機制上允許用戶自己編寫并行程序,這當(dāng)然比編寫串行語言對編程人員提出的要求更多。即用戶自己必須知道程序各模塊之間邏輯結(jié)構(gòu)關(guān)系及調(diào)用關(guān)系乃至運算量,以確定哪些模塊可以并行執(zhí)行。若編程者能按程序設(shè)計情況編出并行程序,無疑并行程序效率將比第一種方法要好。隨著并行技術(shù)和并行語言的發(fā)展,處理并行語言的并行編譯技術(shù)正在深入研究之中,將串行程序轉(zhuǎn)換成并行程序的自動并行編譯技術(shù)也正在深入研究之中。代碼生成較復(fù)雜,所以編譯器一般將這ー階段分成幾個涉及不同中間數(shù)據(jù)結(jié)構(gòu)的步驟,其中包括了某種稱作中間代碼的抽象代碼。編譯器也可能沒有生成真正的可執(zhí)真的不掉線嗎??、????????????行代碼,而是生成了某種形式的匯編代碼,這必須由匯編器、鏈接器和裝入器進行進ー步處理。匯編器、鏈接器和裝入器可由操心系統(tǒng)提供或由編譯器自帶。在翻譯期間,中間表示或IR代表了源程序和數(shù)據(jù)結(jié)構(gòu)。雖然抽象語法樹是源代碼完美充分的表達,即使對于代碼生成也不過這樣,但是它與目標(biāo)代碼極不相像,在控制流構(gòu)造上尤為如此。在控制流構(gòu)造上,目標(biāo)代碼使用轉(zhuǎn)移語句而不是if和while語句。因此,編譯器編寫者可能希望從語法樹生成一個更接近目標(biāo)代碼的中間表示形式,或者用這樣ー個中間表示代替語法樹,然后再從這個新的中間表示生成目標(biāo)代碼。這種類似目標(biāo)代碼的中間表示稱為中間代碼。然后編譯程序再調(diào)用相應(yīng)的處理程序,將中間代碼轉(zhuǎn)換為計算機能處理的機器指令,最終得到目標(biāo)代碼。3編譯過程概述編譯程序是現(xiàn)代計算機系統(tǒng)的基本組成部分之一,而且多數(shù)計算機系統(tǒng)都含有不止ー個高級語言的編譯程序,對有些高級語言甚至配置了幾個不同性能的編譯程序。從功能上看,ー個編譯程序就是ー個語言翻譯程序。它把ー種語(稱作源語言)書寫的程序翻譯成另ー種語言(稱作目標(biāo)語言)的等價的程序。比如匯編程序是ー個翻譯程序,它把匯編語言程序翻譯成機器語言程序。如果源語言是像FORTRAN,PASCAL,或C那樣的高級語言,目標(biāo)語言是像匯編語言或機器語言那樣的低級玉器言,則這種翻譯程序稱作編譯程序。ー個編譯程序的重要性體現(xiàn)在它使得多數(shù)計算機用戶不必考慮與機器有關(guān)的繁索細節(jié),使程序員和程序設(shè)計專家獨立于機器,這對于當(dāng)今機器的數(shù)量和種類持續(xù)不斷地增長的年代憂為重要。除了編譯程序外,還需要一些其它的程序才能生成一個可在計算機執(zhí)行的目標(biāo)程序。高級語言程序的處理過程如圖:需處理的源程序編譯程序目標(biāo)匯編程序可再裝配的機器代碼可在裝配的目標(biāo)文件真的不掉線嗎??、????????????絕對機器代碼ー個源程序有時可能分成幾個模塊存放在不同的文件里,將這些源程序匯集在ー起的任務(wù),由一個叫做預(yù)處理程序的程序完成,有些預(yù)處理程序也負責(zé)宏展開,像C語言和預(yù)處理程序要完成文件合并、宏展開等任務(wù)。也就是說,ー個編譯程序的輸入可能要一個或多個預(yù)處理程序來產(chǎn)生,另外,為得到能運行的機器代碼,編譯程序的輸出可能仍需要進ー步地處理。編譯程序完成從源程序到目標(biāo)程序的翻譯工作,是ー個復(fù)雜的整體的過程。從概念上來講,ー個編譯程序和整體工作過程是劃分成階級進行的,每個階級將源程序的ー種表示形式換成另ー種表示形式,各個階級進行的操場作在邏輯上是緊密連接在ー起的,如圖1所示,給出了一個編譯過的和各個階級,這是一種比較典型的劃分方法。圖1圖1將編譯過程劃分了詞法分析、語法分析、語義分析、中間代碼生成、代碼優(yōu)化、目標(biāo)代碼生成、六個階級。另外兩個重要的工作:表格處理和出錯處理與上述六個階級都有聯(lián)系。編譯過程是源程序和各種信息被子保留在種種不同的表格里,編譯各階級的工作都涉及到構(gòu)造、查找或更新有關(guān)的表格,因此需要有表格處理的工作;如果編譯過程中發(fā)現(xiàn)源程序有錯誤,編譯程序應(yīng)報告錯誤的性質(zhì)和錯誤發(fā)生的地點,并且將錯誤所造成的影響限制在盡可能小的范圍內(nèi),使得源程序的其余部分能繼續(xù)被編譯下去,有些編譯程序還能自動校正錯誤,這些工作稱之為出錯處理。詞法分析階級是編譯過程的第一個階級。這個階級的任務(wù)是從左到右一個字符一個字符地讀入源程序,對構(gòu)成源程序的字符流進行掃描和分解,從而識別ー個個單詞(也稱為單詞符號或符號)。這里所謂的單詞是指邏輯上緊密相連的ー組字符,這些字符具有集體含義。比如標(biāo)識是由字母開頭,后跟字母、數(shù)字字符序列組成的ー種單詞,。保留字是ー種單詞,此外還有算符,界符等等。語法分析是編譯過程的第二個階級。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單真的不掉線嗎??ヽ????????????詞序列分解成各類語法短語,如“程序”,“語句”,“表達式”等等。一般這種語法短語,也稱為語法單位,可表示成語法樹。語法分析所依據(jù)的是語言的語法規(guī)則,即描述程序結(jié)構(gòu)的規(guī)則。通過語法分析確定整個輸入串是否構(gòu)成一個語法上正確的程序。詞法分析和語法分析本質(zhì)上都是對源程序的結(jié)構(gòu)進行分析。但詞法分析的任務(wù)僅對源程序進行線性掃描即可完成,比如識別標(biāo)識符,因為標(biāo)識符的結(jié)構(gòu)是字母打頭的字母和數(shù)字序列,這只要順序掃描輸入流,遇到既不是字母又不是數(shù)字字符時,將前面所發(fā)現(xiàn)的所有字母和數(shù)字組合在ー起而構(gòu)成單詞標(biāo)識符。但這種線性掃描則不能用于識別遞歸定義的語法成分,比如就不能用此辦法去匹配表達式中的括號。語義分析階級是審查源程序有無語義錯誤,為代碼生成階級收集類型信息。比如語分析的ー個工作是進行類型審查,審查每個算符是否具有語言規(guī)范允許的運算對象,當(dāng)不符合語言規(guī)范時,編譯程序應(yīng)報告錯誤。如有的編譯程序要對實數(shù)用個數(shù)組下標(biāo)的情況報告錯誤。又如某些語言規(guī)定運算對象可被強制,那么當(dāng)二目運算一整數(shù)和一實型時,編譯程序應(yīng)將整型轉(zhuǎn)換成實型而不能認為是源程序的錯誤。中間代碼生成在進行了上述的語法分析和語義分析
的工作之后,有的編譯程序?qū)⒃闯绦蜃兂梢环N內(nèi)部表示形式,這種內(nèi)部表示形式叫做中間語言或中間代碼。所謂“中間代碼”是ー種結(jié)構(gòu)簡單、含義明確的記號系統(tǒng),這種記號系統(tǒng)可以設(shè)計為多種多樣的形式,重要的設(shè)計原則為兩點:ー是容易生成;ニ是容易將它翻譯成目標(biāo)代碼。很多編譯程采用了一種近似“三地址指令”的“四元式”中間代碼,這種四元式的形式為:(運算符,運算對象1,運算對象2,結(jié)果)。代碼優(yōu)化在此階級的任務(wù)是對前階級產(chǎn)生的是間代碼進行變換或進行改造,目的是使生成的目標(biāo)代碼更為高效,即省時間和省空間。目標(biāo)代碼生成的任務(wù)是把是間代碼變換成特定機器上的絕對指令代碼或可重定位的指令代碼或匯編指令代碼。這是編譯的最后階級,它的工作與硬件系統(tǒng)結(jié)構(gòu)和指令含義有關(guān),這個階的工作很復(fù)雜,涉及到硬件系統(tǒng)功能部件的運用、機器指令的選擇、各種數(shù)據(jù)類型變量的存儲空間分配以及寄存器和后緩寄存器的調(diào)度等。有時,常常把編譯的過程分為前端和后端,前端由那
樣ー些階級組成:這些階級的工作主要依賴于源語言而與目標(biāo)機無關(guān)。通常這些階段包括詞法分析、語法分析、語義分析和中間代碼生成,某些優(yōu)化工作也可在前端做,也包括與前端每個階級相關(guān)的出錯處量工作和符號表管理工作。后端工作指那些依賴于目標(biāo)機而一般不依賴源語言,只與中間代碼有關(guān)的那些階段,即目標(biāo)代碼生成,以及相關(guān)出錯處理和符號表操作。若按照這種姐合方式實現(xiàn)編譯程序,可以設(shè)想,某ー編譯程序的前端加上相應(yīng)不同的后端則可以為不同的機器構(gòu)成一個源語言的編譯程序。也可以設(shè)想,不同語言編譯的前端生成同一種中間語言,再使用一個共同的后端,則可為同一機器生成幾個語言的編譯程序。ー個編譯過程可由一遍、兩遍或多遍完成。所謂“遍”,也稱作“煩”,是對源程序或其等價的中間語言程序從頭到尾掃視并完成規(guī)定任務(wù)的過程。每一遍掃視可完成上述一個階段或多個階段的工作。例如一遍可以只完成詞法分析工作;一遍完成詞法分析和語法分析工作;甚至ー遍完成整個編譯工作。對于多遍的編譯程序,第一遍的輸入是用戶書寫的源程序,最后一遍是輸出是目標(biāo)語言程序,其余是上一遍的輸出為下一遍的輸入。真的ネ掉線嗎??、????????????3系統(tǒng)需求分析3.1LEX概述LEX是ー個詞法分析器(掃描器)的自動產(chǎn)生系統(tǒng),它的示意圖如下:
LEX源程序LEXLEX源程序LEXyylex輸入串yylex 單詞符號串LEX源程序是用一種面向問題的語言寫成的。這個語言的核心是正規(guī)表達式(正規(guī)式),用它描述輸入串的詞法結(jié)構(gòu)。在這個語言中用戶還可以描述某ー個詞形被識別出來時要完成的動作,例如在高級語言的詞法分析器中,當(dāng)識別出ー個關(guān)鍵字時,它應(yīng)該向語法分析器返回該關(guān)鍵字的內(nèi)部編碼。LEX并不是ー個完整的語言,它只是某種高級語言(稱為LEX的宿主語言)的擴充,因此,LEX沒有為描述動作設(shè)計新的語言,而是借助其宿主語言來描述動作。LEX自動地把表示輸入串詞法結(jié)構(gòu)的正規(guī)式及相應(yīng)的動作轉(zhuǎn)換成一個宿主語言的程序,即詞法分析程序,它有一個固定的名字yylex,在這里yylex是ー個C語言程序。2C語言簡介C語言是在70年代初問世的。ー九七八年由美國電話電報公司(AT&T)貝爾實驗室正式發(fā)表了C語言。同時由8ホ.わ[プ81^1I和ル就!("ぬれ合著了著名的“THECPROGRAMMINGLANGUAGE,,ー書。通常簡稱為《K&R》,M人稱之為《K&R》標(biāo)準(zhǔn)。但是,在《K&R》中并沒有定義ー個完整的標(biāo)準(zhǔn)C語言,后來由美國國家標(biāo)準(zhǔn)協(xié)會(AmericanNationalStandardsInstitute)在此基礎(chǔ)上制定了一個C語言標(biāo)準(zhǔn),于一九八三年發(fā)表。通常稱之為ANSIC8早期的C語言主要是用于UNIX系統(tǒng)。由于C語言的強大功能和各方面的優(yōu)點逐漸為人們認識,到了ハ十年代,C開始進入其它操作系統(tǒng),并很快在各類大、中、小和微型計算機上得到了廣泛的使用,成為當(dāng)代最真的不掉線嗎??、????????????優(yōu)秀的程序設(shè)計語言之一。目前最流行的C語言有以下幾種:MicrosoftC或稱MSCBorlandTurboC或稱TurboC
AT&TC這些C語言版本不僅實現(xiàn)了ANSIC標(biāo)準(zhǔn),而且在此基礎(chǔ)上各自作了一些擴充,使之更加方便、完美。C語言的特點:1語言簡潔、緊湊,使用方便、靈活。ANSIC-共只有32個關(guān)鍵字:breakCasecharconstcoinue
doubleelseenumexternfltifintlongregisterrernstaticSizofstructswitchtydefVOidvolatilewhile9種控制語句,程序書寫自由,主要用小寫字母表示,壓縮了一切不必要的成分。TurboC擴充了11個關(guān)鍵字:asm_cs _ds _es _sscdeclfarhugeinterruptnear pascal注意:在C語言中,關(guān)鍵字都是小寫的。?運算符豐富。共有34種。C把括號、賦值、逗號等都作為運算符處理。從而使C的運算類型極為豐富,可以實現(xiàn)其他高級語言難以實現(xiàn)的運算。?數(shù)據(jù)結(jié)構(gòu)類型豐富。?具有結(jié)構(gòu)化的控制語句。語法限制不太嚴格,程序設(shè)計自由度大。?C語言允許直接訪問物理地址,能進行位(biい操作,能實現(xiàn)匯編語言的大部分功能,可以直接對硬件進行操作。因此有人把它稱為中級語言。?生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。?與匯編語言相比,用C語言寫的程序可移植性好。但是,C語言對程序員要求也高,程序員用C寫程序會感到限制少、靈活性大,功能強,但較其他高級語言在學(xué)習(xí)上要困難ー些。C語言的字符集:字符是組成語言的最基本的元素。C語言字符集由字母,數(shù)字,空格,標(biāo)點和特殊字符組成。在字符常量,字符串常量和注釋中還可以使用漢字或其它可表示的圖形符號。.字母小寫字母a?Z共26個大寫字母A?Z共26個.數(shù)字〇?9共10個空格符、制表符、換行符等統(tǒng)稱為空白符??瞻追辉谧址A亢妥址A恐衅鹱饔谩T谄渌胤匠霈F(xiàn)時,只起間隔作用,編譯程序?qū)λ鼈兒雎圆挥?。因此在程序真的不掉線嗎??、????????????中使用空白符與否,對程序的編譯不發(fā)生影響,但在程序中適當(dāng)?shù)牡胤绞褂每瞻追麑⒃黾映绦虻那逦院涂勺x性。4.標(biāo)點和特殊字符C語言詞匯:在C語言中使用的詞匯分為六類:標(biāo)識符,關(guān)鍵字,運算符,分隔符,常量,注釋符等。在程序中使用的變量名、函數(shù)名、標(biāo)號等統(tǒng)稱為標(biāo)識符。除庫函數(shù)的函數(shù)名由系統(tǒng)定義外,其余都由用戶自定義。C規(guī)定,標(biāo)識符只能是字母(A?Z,a?z)、數(shù)字(〇?9)、下劃線。組成的字符串,并且其第一個字符必須是字母或下劃線。以下標(biāo)識符是合法的:a,x,x3,BOOK_1,sum5以下標(biāo)識符是非法的:3s 以數(shù)字開頭s*T 出現(xiàn)非法字符?-3x 以減號開頭bowy-1出現(xiàn)非法字符-(減號)在使用標(biāo)識符時還必須注意以下幾點:(1)標(biāo)準(zhǔn)C不限制標(biāo)識符的長度,但它受各種版本的C語言編譯系統(tǒng)限制,同時也受到具體機器的限制。例如在某版本C中規(guī)定標(biāo)識符前八位有效,當(dāng)兩個標(biāo)識符前ハ位相同時,則被認為是同一個標(biāo)識符。(2)在標(biāo)識符中,大小寫是有區(qū)別的。例如BOOK和book是兩個不同的標(biāo)識符。(3)標(biāo)識符雖然可由程序員隨意定義,但標(biāo)識符是用于標(biāo)識某個量的符號。因此,命名應(yīng)盡量有相應(yīng)的意義,以便于閱讀理解,作到“顧名思義”。關(guān)鍵字是由C語言規(guī)定的具有特定意義的字符串,通常也稱為保留字。用戶定義的標(biāo)識符不應(yīng)與關(guān)鍵字相同。C語言的關(guān)鍵字分為以下幾類:(1)類型說明符用于定義、說明變量、函數(shù)或其它數(shù)據(jù)結(jié)構(gòu)的類型。如前面例題中用到的int,double等(2)語句定義符用于表示一個語句的功能。如例1.3中用到的ifelse就是條件語句的語句定義符。(3)預(yù)處理命令字用于表示一個預(yù)處理命令。如前面各例中用到的includeo.運算符C語言中含有相當(dāng)豐富的運算符。運算符與變量,函數(shù)一起組成表達式,表示各種運算功能。運算符由ー個或多個字符組成。.分隔符在C語言中采用的分隔符有逗號和空格兩種。逗號主要用在類型說明和函數(shù)參數(shù)表中,分隔各個變量。空格多用于語句各單詞之間,作間隔符。在關(guān)鍵字,標(biāo)識符之間必須要有一個以上的空格符作間隔,否則將會出現(xiàn)語法錯誤,例如把inta;寫成inta;C編譯器會把inta真的不掉線嗎??、????????????當(dāng)成一個標(biāo)識符處理,其結(jié)果必然出錯。.常量C語言中使用的常量可分為數(shù)字常量、字符常量、字符串常量、符號常量、轉(zhuǎn)義字符等多種。在后面章節(jié)中將專門給予介紹。.注釋符C語言的注釋符是以“/*”開頭并以“*/”結(jié)尾的串。在“/*”和“*/”之間的即為注釋。程序編譯時,不對注釋作任何處理。注釋可出現(xiàn)在程序中的任何位置。注釋用來向用戶提示或解釋程序的意義。在調(diào)試程序中對暫不使用的語句也可用注釋符括起來,使翻譯跳過不作處理,待調(diào)試結(jié)束后再去掉注釋符。3.3軟件工程方法論的應(yīng)用軟件工程是指導(dǎo)計算機軟件開發(fā)和維護的工程學(xué),釆用工程的概念、原理、技術(shù)、和方法開發(fā)與維護軟件,把經(jīng)過時間考驗而證明正確的管理技術(shù)和當(dāng)前能夠得到的最好的技術(shù)方法結(jié)合起來。自從1968年在聯(lián)邦德國召開的國際會議上正式提出并使用了“軟件工程”這個術(shù)語以來,研究軟件工程的專家學(xué)者們陸續(xù)提出了100多條關(guān)于軟件工程的準(zhǔn)則或“信條”。著名的軟件工程專家B.W.Boehm綜合這些學(xué)者們的意見并總結(jié)了TRW公司多年開發(fā)軟件的經(jīng)驗,于1983年在ー篇論文中提出軟件工程的七條原理。他認為這七條原理是確保軟件產(chǎn)品質(zhì)量和開發(fā)效率的原理的最小集合。這七條原理是互相獨立的,其中任意六條原理的組合都不能代替另一條原理,因此,它們是缺ー不可的最小集合,然而這七條原理又是相當(dāng)完備的,人們雖然不能用數(shù)學(xué)方法嚴格證明它們是ー個完備的集合,但是,可以證明在此之前已經(jīng)提出的100多條軟件工程原理都可以由這七條原理的任意組合蘊含或派生。?用分階段的生命周期計劃嚴格管理經(jīng)統(tǒng)計表明,不成功的軟件項目中有一半左右是由于計劃不周造成的。Boehm認為,在軟件的整個生命周期中應(yīng)制定并嚴格執(zhí)行六類計劃:項目概要計劃、里程碑計劃、項目控制計劃、產(chǎn)品控制計劃、驗證計劃、運行維護計劃?堅持進行階段評審大部分錯誤是在編碼之前造成的錯誤發(fā)現(xiàn)與改正得越晚,所需付出的代價越高。因此,在每個階段都進行嚴格的評審,以便盡早發(fā)現(xiàn)在軟件開發(fā)過程的錯誤?實行嚴格的產(chǎn)品控制在軟件開發(fā)過程中不要隨意改變需求,因為改變某項需求往往需要付出較高的代價,但在實踐中用戶往往會提出需求變更,因此需要采取科學(xué)的產(chǎn)品控制技術(shù)。目前主要實行基準(zhǔn)配置管理:基準(zhǔn)配置是指經(jīng)過階段評審后的軟件配置成分,如各個階段產(chǎn)生的文檔或程序代碼。對涉及基準(zhǔn)配置的修改,必須經(jīng)過嚴格的評審,通過后才能實施修改。?采用現(xiàn)代程序設(shè)計技術(shù)實踐表明:采用先進的技術(shù)既可提高軟件開發(fā)的效率,又可提高軟件維護的效率。80年代及之前:結(jié)構(gòu)化分析、設(shè)計技術(shù)90年代:面向?qū)ο蠓治?、設(shè)計技術(shù)?結(jié)果應(yīng)能清楚地審查軟件產(chǎn)品是看不見、摸不著的邏輯產(chǎn)品,開發(fā)過程難以評價和管理。真的不掉線嗎??、????????????根據(jù)軟件開發(fā)項目的總目標(biāo)及完成期限,規(guī)定開發(fā)組織的責(zé)任和產(chǎn)品標(biāo)準(zhǔn),使所得的結(jié)果能夠清楚地審查?開發(fā)小組的人員應(yīng)該少而精開發(fā)小組人員的素質(zhì)和數(shù)量是影響軟件產(chǎn)品質(zhì)量和開發(fā)效率的重要因素。開發(fā)小組人員數(shù)目的增加,使相互交流復(fù)雜、費用增加。?承認不斷改進軟件工程實踐的必要性遵循前6條基本原理,就能夠按照當(dāng)代軟件工程基本原理實現(xiàn)軟件的工程化生產(chǎn),但不能保證趕上時代前進的步伐。積極主動采納新的軟件技術(shù),且不斷總結(jié)經(jīng)驗軟件工程的傳統(tǒng)途徑是“生命周期法”,強調(diào)“結(jié)構(gòu)化分析、結(jié)構(gòu)化設(shè)計”。(1)“生命周期法”的起源人類解決復(fù)雜問題時普遍釆用的ー個策略是“各個擊破”,也就是對問題進行分解,然后再分別解決各個子問題的策略。軟件工程采用的“生命周期法”,就是從時間角度對軟件開發(fā)和維護的復(fù)雜問題進行分解,把軟件生存的漫長周期依次劃分為若干個階段,每個階段有相對獨立的任務(wù),然后再逐步完成每個階段的任務(wù)。(2)生命周期劃分的原則各階段的任務(wù)彼此間盡可能相對獨立,同一個階段各項任務(wù)的性質(zhì)盡可能相同,從而降低每個階段任務(wù)的復(fù)雜性,簡化不同階段之間的聯(lián)系,有利于軟件開發(fā)過程的組織管理。(3)生命周期的劃分軟件生命周期一般分為:軟件定義(問題定義、可行性研究、需求分析)、軟件開發(fā)(總體設(shè)計、詳細設(shè)計、編碼和單元測試、綜合測試)、軟件維護等三個時期。軟件工程各階段的基本任務(wù)問題定義:問題定義階段需要回答的關(guān)鍵問題是:“有解決的問題是什么?”通過問題定義階段的工作,系統(tǒng)分析員應(yīng)該提出關(guān)于問題性質(zhì)、工程目標(biāo)和規(guī)模的書面報告。通過對實際用戶和使用部門負責(zé)人的訪問調(diào)查,分析員扼要地寫出他對問題的理解,并在用戶和使用部門負責(zé)人的會議上認真討論這份書面報告,澄清含糊不清的地方,改正理解不正確的地方,最后得到ー份雙方都滿意的文檔??尚行匝芯窟@個階段要回答的關(guān)鍵問題是:“對于上一個階段所確定的問題有行的通的解決方法嗎?”在問題定義階段提出的對工程目標(biāo)和規(guī)模的報告通常比較模糊??尚行匝芯侩A段應(yīng)該導(dǎo)出系統(tǒng)的高層邏輯模型(通常用數(shù)據(jù)流圖表示),并且在此基礎(chǔ)上更準(zhǔn)確、更具體地確定工程規(guī)模和目標(biāo)。然后分析員更準(zhǔn)確地估計系統(tǒng)的成本和效益,對建議的系統(tǒng)進行仔細的成本/效益分析。需求分析這個階段的任務(wù)是“為了解決這個問題,目標(biāo)系統(tǒng)必須做什么”,主要是確定目標(biāo)系統(tǒng)必須具備哪些功能。在需求分析階段確定的系統(tǒng)邏輯模型是以后設(shè)計和實現(xiàn)目標(biāo)系統(tǒng)的基礎(chǔ),因此必須準(zhǔn)確完整地體現(xiàn)用戶的要求。該階段有寫的文檔有規(guī)格說明書、初步的用戶使用手冊、系統(tǒng)功能框架圖等??傮w設(shè)計真的不掉線嗎??、????????????這個階段要回答的關(guān)健問題是:“概括地說,應(yīng)該如何解決這個問題?”首先應(yīng)該考慮幾種可能的解決方案。例如,目標(biāo)系統(tǒng)的ー些主要功能是用計算機自動完成還是用人工完成。通常至少考慮下述幾類可能的方案:低成本解決方案、中等成本的解決方案和高成本的“十全十美”的系統(tǒng)。系統(tǒng)分析員應(yīng)該使用系統(tǒng)流程圖或者其他工具描述每種可能的系統(tǒng)。詳細設(shè)計總體設(shè)計階段以比較抽象概括的方式提出了解決問題的方法。詳細設(shè)計階段的任務(wù)就好似把解決方法具體化,也就是回答下面這個關(guān)鍵問題:“應(yīng)該怎樣具體地實現(xiàn)這個系統(tǒng)呢?”這個階段的任務(wù)還不是編寫程序,而是設(shè)計出程序的詳細規(guī)格說明。通常用HIPO圖(層次圖加輸入/處理/輸出圖)或PDL語言(過程設(shè)計語言)描述詳細的結(jié)果。該階段要產(chǎn)生的文檔有偽代碼、詳細的測試計劃、最終的用戶使用手冊等。編碼和單元測試這個階段的關(guān)鍵任務(wù)是寫出正確的容易理解、容易維護的程序模塊。程序員應(yīng)該根據(jù)目標(biāo)系統(tǒng)的性質(zhì)和實際環(huán)境,選取ー種適當(dāng)?shù)母呒壋绦蛟O(shè)計語言,把詳細設(shè)計的結(jié)果翻譯成用選定的語言書寫的程序,并且仔細測試編寫出的每一個模塊。綜合測試這個階段的主要任務(wù)是通過各種類型的測試(及相應(yīng)的調(diào)試)使軟件達到預(yù)定的要求。最基本的測試是集成測試和驗收測試。所謂集成測試是根據(jù)設(shè)計的軟件結(jié)構(gòu),把經(jīng)過單元測試檢驗的模塊按某種選定的策略裝備起來,在裝配過程中對程序進行必要的測試。所謂驗收測試是按照規(guī)格說明書的規(guī)定(通常在需求分析階段確定),有用戶(或在用戶的積極參加下)對目標(biāo)系統(tǒng)進行驗收。軟件維護軟件維護階段的關(guān)鍵任務(wù)是,通過各種必要的維護活動是系統(tǒng)持久地滿足用戶的需要。通常有四類維護活動:改正性維護,有就是診斷和改正在使用過程中發(fā)現(xiàn)的軟件錯誤;適應(yīng)性維護,即修改軟件以適應(yīng)環(huán)境的變化;完善性維護,即根據(jù)用戶的要求改進或擴充軟件是它更完善;預(yù)防性維護,即修改軟件為將來的維護活動預(yù)先做準(zhǔn)備。每ー項維護活動都應(yīng)該準(zhǔn)確地記錄下來,作為正式的文檔加以保存。4詞法語法分析簡介詞法分析的任務(wù)是從左到右一個字符一個字符地讀入源程序,對構(gòu)成源程序的字符流進行掃描和分解,從而識別出ー個個的單詞(也稱單詞符號或符號)。這里所謂的單詞是指邏輯上緊密相連的ー組字符,這些字符具有集體含義。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語,如“程序”,“語句”,“表達式”等等,即判斷單詞序列是否符合組成各類語法短語的組成規(guī)則,一般這種語法短語,也稱為語法單位,可表示成語法樹。5詞法需求分析簡介詞法分析階級是編譯過程的第一個階級。這個階級的任務(wù)是從左到右一個字符一個字符地讀入源程序,對構(gòu)成源程序的字符流進行掃描和分解,從而識別ー個個單詞(也稱為單詞符號或符號)。這里所謂的單詞是指邏輯上緊密相連的ー組字符,這些字符具有集體含義。比如標(biāo)識是由字母開頭,后跟字母、數(shù)字字符序列組成的ー種單詞,。保留字是ー種單詞,此外還有算符,界符等等。真的ネ掉線嗎??、????????????詞法分析器的主要任務(wù)是讀入輸入字符,產(chǎn)生記號序列,提交給語法分析使用。詞法分析器與語法分析器之間的交互如下圖:詞法分析器源程序 記號取下ー個字符1. 剔除空白符和注釋詞法分析器讀入輸入串,將其轉(zhuǎn)換成將被語法分析器分析的記號流。許多語言允許“空白符”(空格,制表符或者換行符)出現(xiàn)在記號之間。原程序中的注釋一般都被語法分析器和翻譯器忽略,所以他們也可以看成空白符。2.常數(shù)2.常數(shù)在ー個表達式中,任何ー個允許單個數(shù)字出現(xiàn)的位置都應(yīng)該允許任何整型常數(shù)出現(xiàn)。由于翻譯期間把數(shù)作為ー個單元來處理,收集數(shù)字形成整數(shù)這一任務(wù)一般由詞法分析器完成。識別標(biāo)識符和關(guān)鍵字保留關(guān)鍵字的集合可以通過適當(dāng)?shù)爻跏蓟柋矶玫秸_的處理。實現(xiàn)詞法分析器的接口在詞法分析中,使用術(shù)語“記號”,“模式”,“詞素”表示特定含義。記號包括:關(guān)鍵字、標(biāo)識符、操作符、常量、文字串、和標(biāo)點符號。詞法分析器把與記號有關(guān)的信息收集在記號的屬性中。記號影響語法分析,而屬性影響記號的翻譯。在實際實現(xiàn)時,記號通常只有一個屬性,即指向符號表中一個表項的指針,與記號有關(guān)的信息保存在這個詞素第一次出現(xiàn)的行為。這些信息存儲在符號表中該標(biāo)識符對應(yīng)的表項內(nèi)。
5.記號的命名規(guī)則:正規(guī)表達式5.記號的命名規(guī)則:正規(guī)表達式建立正規(guī)表達式時,可以先定義簡單的正規(guī)表達式,然后用它們構(gòu)造出更復(fù)雜的正規(guī)表達式。每個表達式r表示ー個語言L(R)。記號的識別:狀態(tài)轉(zhuǎn)換圖3.6語法需求分析簡介語法分析是編譯過程的第二個階級。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語,如“程序”,“語句”,“表達式”等等。一般這種語法短語,也稱為語法單位,可表示成語法樹。語法分析所依據(jù)的是語言的語法規(guī)則,即描述程序結(jié)構(gòu)的規(guī)則。通過語法分析確定整個輸入串是否構(gòu)成一個語法上正確的程序。詞法分析和語法分析本質(zhì)上都是對源程序的結(jié)構(gòu)進行分析。但詞法分析的任務(wù)僅對源程序進行線性掃描即可完成,比如識別標(biāo)識符,因為標(biāo)識符的結(jié)構(gòu)是字母打頭的字母和數(shù)字序列,這只要順序掃描輸入流,遇到既不是字母又不是數(shù)字字符時,將前面所真的不掉線嗎??ヽ????????????發(fā)現(xiàn)的所有字母和數(shù)字組合在ー起而構(gòu)成單詞標(biāo)識符。但這種線性掃描則不能用于識別遞歸定義的語法成分,比如就不能用此辦法去匹配表達式中的括號。語法分析的任務(wù)是語法分析器接收詞法分析研究器提供的記號串,檢查它們是否能由源程序的文法產(chǎn)生,語法分析器在編譯器中的位置如圖所示:源程序中間表示語法樹取下ー個記號典型的文法的語法分析器有三類:ー類是通用的語法分析方法,如Cocke-Younger-Kasami算法和Early算法,這些方法在生成編譯器時效率太低。編譯器常用的是自頂向下和自底向上的方法。采用自頂向下的遞歸子程序法,就是對應(yīng)每個非終結(jié)符語法單元,編一個獨立的處理子程序。語法分析從讀入第一個單詞開始,由非終結(jié)符即開始符出發(fā),沿語法描述圖箭頭指出的方向進行分析。當(dāng)遇到非終結(jié)符時,則調(diào)用相應(yīng)的處理子程序,從語法描述圖看也就進入了一個語法單元,再沿當(dāng)前所進入的語法描述圖的箭頭方向進行分析,當(dāng)遇到終結(jié)符時,則判斷當(dāng)前讀入的單詞是否與圖中的終結(jié)符相匹配,若匹配,則執(zhí)行相應(yīng)的語義程序。再讀取下一個單詞繼續(xù)分析。遇到分支點時將當(dāng)前的單詞與分支點上的多個終結(jié)符逐個相比較,若都不匹配時可能是進入下ー非終結(jié)符語法單位或是出錯。7符號表的應(yīng)用在編譯程序中符號表用來存放語言中出現(xiàn)的有關(guān)標(biāo)識符的屬性信息,這些信息集中反映了標(biāo)識符的語義特征屬性。在詞法分析及語法分析過程中不斷積累和更新表中的信息,并在詞法分析到代碼生成和各階段,按各自的需要從表中獲得不同的屬性信息。不論編譯策略是否分趟,符號表的作用和地位是完全一致的。符號表的功能主要有:收集符號屬性:在分析語言程序中標(biāo)識符說明部分時,編譯程序根據(jù)說明信息收集有關(guān)標(biāo)識符的屬性,并在符號表中建立符號的相應(yīng)屬性信息。上下文語義的合法性檢查的依據(jù):同一個標(biāo)識符可能在程序和不同地方出現(xiàn),而有關(guān)該符號和屬性是在不同情況下收集的,特別是在多趟編譯及程序分段編譯的情況下,更需檢查標(biāo)識符屬性在上下文中的一致性和全法性。通過符號表中屬性記錄可進行這些語義檢查。作為目標(biāo)代碼生成階段地址分配的依據(jù):除語言中規(guī)定的臨時分配存儲的變量外,每個符號變量在目標(biāo)代碼生成時需要確定其在存儲分配的位置。語言程序中的符號變量由它被定義的存儲類別或被定義的位置來確定。首先要確定其被分配的區(qū)域。真的不掉線嗎??ヽ????????????其次是根據(jù)變量出現(xiàn)的次序。在編譯程序中符號表用來存放語言程序中出現(xiàn)的有關(guān)標(biāo)識符的屬性信息,這些信息集中反映了標(biāo)識符的語義特征屬性。在詞法分析及語法分析過程中不斷積累和更新表中的信息,并在詞法分析到代碼生成的各階段,按各自的需要從表中獲取不同的屬性信息。不論編譯策略是否分趟,符號表的作用和地位是完全一致的。符號表的功能主要有:收集符號屬性:在分析語言程序中標(biāo)識符說明部分時,編譯程序根據(jù)說明信息收集有關(guān)標(biāo)識符的屬性,并在符號表中建立符號的相應(yīng)屬性信息。下文語義的合法性檢查的依據(jù):同一個標(biāo)識符可能在程序和不同地方出現(xiàn),而有關(guān)該符號和屬性是在不同情況下收集的,特別是在多趟編譯及程序分段編譯的情況下,更需檢查標(biāo)識符屬性在上下文中的一致性和全法性。通過符號表中屬性記錄可進行這些語義檢查。作為目標(biāo)代碼生成階段地址分配的依據(jù):除語言中規(guī)定的臨時分配存儲的變量外,每個符號變量在目標(biāo)代碼生成時需要確定其在存儲分配的位置。語言程序中的符號變量由它被定義的存儲類別或被定義的位置來確定。首先要確定其被分配的區(qū)域。其次是根據(jù)變量出現(xiàn)的次序。語言符號可分為關(guān)鍵字(保留字)符號,操作符號幾標(biāo)識符號。他們之間的主要屬性有較大的差別。因此通常為他們建立不同的符號表。4系統(tǒng)設(shè)計編譯程序的功能圖如下:高級語言程序,^能序)低級語言(目標(biāo)語言)ー個編譯程序的重要性體現(xiàn)在它使得多數(shù)計算機用戶不必考慮與機器的煩瑣細節(jié),使程序員和程序設(shè)計獨立于機器,這對于當(dāng)今機器的數(shù)量和種類持續(xù)不斷地增長的年代真的不掉線嗎??、????????????尤為重要。1系統(tǒng)設(shè)計總體流程圖調(diào)用Read_File()把源程序調(diào)入到內(nèi)存當(dāng)前程序是否為結(jié)束符4.2語法分析體流程圖真的不掉線嗎??、????????????遞歸調(diào)用Programme()3語法分析概要設(shè)計語法分析是編譯過程的核心部分,語法分析的任務(wù)是:按照文法,從源程序符號串中識別出各類語法成分,同時進行語法檢查,為語義分析和代碼生成做準(zhǔn)備。語法分析設(shè)計采用遞歸下降分析法,遞歸下降分析技術(shù)是ー種無回溯的自頂向下分析技術(shù),它的實現(xiàn)思想是:讓一個識別符程序由一組子程序組成,其中每ー個子程序?qū)?yīng)于文法的ー個非終結(jié)符;根據(jù)文法的遞歸定義,這些子程序往往是遞歸于程序。這種技術(shù)稱為遞歸下降技術(shù),相應(yīng)的識別程序稱為遞歸下降識別程序〇在遞歸下降識別程序中的每ー個子程序都對應(yīng)于文法的一個非終結(jié)符,更確切地說為各個非終結(jié)符設(shè)計一個子程序,每ー個子程序分析相對于相應(yīng)非終結(jié)符短語。例如,當(dāng)進入關(guān)于非終結(jié)符真的不掉線嗎??、????????????號〈語句〉的遞歸子程序時,便期待句子中出現(xiàn)相對于〈語句〉的短語,這時必要的是讓識別程序邏輯知道句子中正期待短語的位置。遞歸下降分析技術(shù)是面向目標(biāo)的,這個目標(biāo)是子程序所相應(yīng)的非終結(jié)符號,也是預(yù)測的,預(yù)言能找到這個相對于該非終結(jié)符號的短語。C語言的語法分析EBNF如下:く程序) [く宏定義)][く頭文件〉]く主函數(shù)(main)>[く子函數(shù))]く主函數(shù)(main)》 [く變量說明部分〉][く常量說明部分〉][く子函數(shù)調(diào)用〉]く語句〉く常量說明部分〉 CONSTく常量定義>{,く常量定義〉};く常量定義〉 く標(biāo)識符〉=く整型常量〉く整型常量〉 [+1-]く數(shù)字〉{く數(shù)字〉}く變量說明部分〉 く類型說明X標(biāo)識符イ,く標(biāo)識符)};く類型猊明》 int|flaot|double|charく標(biāo)識符〉 く字母〉{く字母>Iく數(shù)字)}く語句〉 く賦值語句〉Iく條件語句>Iく循環(huán)語句>Iく子函數(shù)調(diào)用語句〉Iく輸入語句〉Iく輸出語句〉く賦值語句〉 く標(biāo)識符〉=く表達式〉く條件〉 く表達式〉く關(guān)系運算符〉く表達式〉I!く表達式〉く循環(huán)語句〉<F0R循環(huán)語句〉!<WHILE循環(huán)語句>KD0-WHILE循環(huán)語句)くFOR循環(huán)語句〉 forヤ[賦值語句]"表達式]';,[條件語句],)'
くWHILEくWHILE循環(huán)語句)while,(y條件)リy語句)く(!〇,11"^_^環(huán)語句> do5{,く語句》,},while?(,く條件〉グく函數(shù)調(diào)用語句〉 く函數(shù)名〉’('[く變量說明〉]')'く輸入語句〉 scanfYY輸入類型聲明〉<,,せく標(biāo)識符〉‘)";'く輸出語句〉 printf,(,く輸出類型聲明〉,'’く標(biāo)識符〉')";'く輸出類型聲明> %d|%c|%sく表達式〉 [+1Tく項〉く加減法運算符〉く項〉く項〉 く因子〉く乘除法運算符〉く因子〉く因子) く標(biāo)識符>1く無符號整數(shù)>1'('く表達式)’)く加減法運算符》+|-く乘除法送算符〉 ?1/く關(guān)系運算符〉 ==I<I<=I>I>=I!く條件語句〉 ifく條件〉く語句〉elseく語句〉く字母〉a|b|……|A|B|……IZく數(shù)字〉0111……19用C語言實現(xiàn)遞歸下降分析程序如下:voidError(){...}main()Constant();Variable();Call-sentence();Sentence();真的不掉線嗎??ヽ??Constant()/?常量說明部分?/if(const)Constant-define();Constant-define()/?常量定義?/Identifer0;Variable() /?變量說明部分?/if(類型說明)定義標(biāo)識符;if(!Set-value.sentence())if(!Condition.sentence())if(!Circle_sentence())if(!Call.sentence0)if(Iprintf)if(!scanf)returnError();Identifer();/*標(biāo)識符?/Expression();/?表達式?/Condition() /?條件?/Expression();Expression();Circle-sentence() /?循環(huán)語句?/for語句();while語句();真的不掉線嗎??、????????????do-while語句();Function.Identifer(); /?函數(shù)名?/Expression() /?表達式*/if(+H)ItemQ;Math-symbol0; /?算數(shù)運算符?/Item() /?項?/Factor();Math,symbol();Factor();Identifer();Integer;IfCO)Expression();If0)')Get-next_word();Get_next_word();Relation-symbol();if(Relation-symbol())Get-next-word();ifC(')真的不掉線嗎??、????????????Expression();if(り’)Sentence();if(else)Sentence();}4.4目標(biāo)代碼的分析代碼生成概要:代碼生成的基礎(chǔ)是用目標(biāo)代碼段系統(tǒng)地替換AST的結(jié)點和子樹,用這種方法可以保持語義緊接著是ー個線性代階段,從重寫的AST產(chǎn)生一個線性指令序列。替換過程被稱為樹重寫.線性化由目標(biāo)代碼段和數(shù)據(jù)流和控制流需求控制。代碼生成中的三個主要問題是代碼選擇、寄存器分配和指令排序。一般情況下,發(fā)現(xiàn)最優(yōu)組合是NP完全的。有三個方法簡化代碼生成問:1每次只考慮AST的一小部分;2簡化目標(biāo)機;3限制代碼段之間的接口。代碼生成分三個階段進行:1預(yù)處理,通過程序轉(zhuǎn)換,有些AST結(jié)點模式被其他AST結(jié)點模式替換;2正確代碼生成,通過樹重寫,所有AST結(jié)點模式被目標(biāo)代碼序列替換;3后處理,通過窺孔優(yōu)化,有些目標(biāo)代碼序列被其他目標(biāo)代碼序列替換。預(yù)處理和后處理可能反復(fù)執(zhí)行得到代碼最簡單的方法是為AST的每個結(jié)點生成代碼段,由迭代解釋程序為其執(zhí)行。如果目標(biāo)代碼為C或C++,所有優(yōu)化都可能留給C或C++編譯程序。這個過程用最小的投入使解釋程序變?yōu)榫幾g程序??梢陨蓪熘泻唵慰截惖睦陶{(diào)用,而不是多次重復(fù)ー個代碼段,這可以相當(dāng)可觀地減小目標(biāo)代碼的長度。這個技術(shù)被稱為線程代碼。目標(biāo)代碼長度的減少對嵌入式系統(tǒng)可能是重要的。通過將庫例程編號并且將程序存儲為這些編號數(shù)的ー個列表可以大大減小目標(biāo)代碼長度。所有目標(biāo)機依賴現(xiàn)在集中于庫例程中。在其他方向,每ー個重復(fù)的代碼段可能在它們的上下文中被部分求值,從而導(dǎo)致更有效的代碼。在簡單代碼生成中,為每個可能的結(jié)點類型選擇了到目標(biāo)代碼的固定翻譯。這些翻譯基于共同的接口規(guī)定。簡單代碼生成只需局部判定,因此尤其適合窄編譯程序。寄存器機的簡單代碼生成用機器指令重寫每個表達式結(jié)點,這滿足了代碼選擇的需要。接口規(guī)定是:一條指令的輸出寄存器必要性須即用作父母指令的輸入寄存器。寄存器機上的表達式的代碼可以通過深度優(yōu)先遞歸訪問生成,這滿足了指令排序的需要。遞歸例程攜帶兩個額外的參數(shù),結(jié)果必須傳入其中的寄存器和空閑寄存器集,這滿足了寄存器分配的需要。因為每個沒有處理的操作數(shù)都占用了一個寄存器,為需要最多寄存器的操作數(shù)首先編譯代碼是有利的。這要求可以在深度優(yōu)先訪問中計算結(jié)點的權(quán)。當(dāng)ー個表達式需要的寄存器多于可用的寄存器時,我們需要溢出ー個和多個寄存真的不掉線嗎??ヽ????????????器至存儲器。沒有最好的寄存器溢出技術(shù),除非進行全面的研究。因此我們求助于啟發(fā)式算法。在ー個啟發(fā)式算法中,我們分離出可以用可用寄存器編譯的最大子表達式,編譯它們,將結(jié)果存儲進臨時變量。變減小了原始樹,我們對其重復(fù)這個過程。機器寄存器被編譯程序設(shè)計者分為四組:為管理目的所需的、為參數(shù)傳遞保留的、為表達式求值保留的和用于存儲局部變量的。通常情況下,每個集合的大小是固定,并且有些集合可能是空的。通常情況下,為局部變量保留的寄存器集比候選集要小。啟發(fā)式算法包括先來先服務(wù)、來自程序員的寄存器提示以及從靜態(tài)或動態(tài)簡要表得的使用計數(shù)。更高級的啟發(fā)算法使用圖著色。棧上的編譯用符號解釋的編譯有些類似于符號解釋。在后者中,我們保持符號表示法,但現(xiàn)在我們包括棧和寄存器,更重要的是,這ー次,表示法中的信息必須精確。這種表示法被稱為寄變描述符。如果結(jié)點的效果可以精確存儲于寄變描述符中,我們就這樣做。沒有為結(jié)點生成代碼,但其語義保留在寄變描述符中:舊寄變描述+結(jié)點如呆結(jié)點的效果使我們不能精確地在寄變描述符中保留信息,我們生成代碼以獲得效果并且在寄變描述符中記錄結(jié)果。因此語義被保留于結(jié)點的重寫中。如果從活躍分析中得到可用信息,當(dāng)離開其活躍范圍時,我們可以從寄變描述符中刪除關(guān)于變量的所有信息?;緣K為控制圖的最大部分,它不包含分裂和結(jié)合。基本塊是從標(biāo)號或從例程的開頭開始,正好在轉(zhuǎn)移或類轉(zhuǎn)移結(jié)點、標(biāo)號或例程的結(jié)尾結(jié)束。它只包含表達式和賦值?;緣K的概念從對控制流的關(guān)注中分離出對表達式和賦值的整齊序列的代碼生成的關(guān)注。這種分離對窄編譯程序尤其有用,因為它允許它們?yōu)楸磉_式序列做優(yōu)化代碼生成?;緣K的代碼生成分兩步進行。首先將控制流圖轉(zhuǎn)換成依賴圖,它是一“dag”,即有向非循環(huán)圖。然后我們重寫依賴圖至代碼。收益在于比起控制流圖,依賴圖對指令順序限制較少。基本塊的依賴圖由兩種依賴組成:表達式中通過操作數(shù)的數(shù)據(jù)依賴以及通過變量的數(shù)據(jù)依賴,這些變量的賦值中得到它們的值并且它們的值在且中被繼續(xù)使用。最終的數(shù)據(jù)依賴是那些在基本塊后仍被需要的值,這些值稱為基本塊的根。強調(diào)這些數(shù)據(jù)依賴并且移除其他的控制流依賴產(chǎn)生了一個粗糙的數(shù)據(jù)依賴圖,它可以通過旁路賦值并且只保留那些從根可達的結(jié)點而被簡化。這個圖是dag,即有向非循環(huán)圖?;緣K的dag可以通過識別公共子表達式而進ー步縮減。這個縮減可以通過不斷地合并具有相同操作數(shù)、運算符和依賴的結(jié)點而得到。傳統(tǒng)地,基本塊的dag作為三元式的數(shù)組而實現(xiàn)。?基本塊dag中的結(jié)點被重寫至相對應(yīng)的機器指令,然后基于操作數(shù)求值將dag線性化。?用于線性化dag的晚求值的特有形式可以識別梯形序列,該梯形序列匹配寄存器,ーー存儲器指令序列,這些指令都有公共寄存器。這種序列十分有效。真的不掉線嗎ワ?,?????????????為發(fā)現(xiàn)先性化,重一個梯形開始,將第一個可用的梯形序列分離出來,以由后至前的順序生成代碼,然后從dag上離除這個梯形并且重復(fù)上述過程。?基本塊中表達式中的指針可以用兩個簡單的規(guī)則處理:1.對指針?biāo)缸兞康馁x值使隨后的表達式中使用的任何變量依賴該賦值;2.從指針檢索ー個值依賴于所有前面的賦值。擴展分析可能允許取消某些依賴。?表達式樹的最優(yōu)重寫可以通過BURS代碼生成得到,BURS代表自底向上重寫系統(tǒng)。BURS技術(shù)允許將給定的任意復(fù)雜的輸入樹分解為許多子樹,其中的每個子樹是給定樹集的成員,既模式樹。模式樹可能同樣是任意復(fù)雜的。應(yīng)用BURS生成代碼,我們將輸入樹看作表達式AST,將模式樹看作帶機器指令的AST.BURS在輸入樹上的兩遍掃描中操作:一遍自底向上和一遍自頂向下。自底向上掃描參照模式樹的結(jié)點注釋輸入樹中的每個結(jié)點。在輸入樹中,結(jié)點I與結(jié)點N相關(guān)意味著頂部有I的樹可以用頂部有N子樹來重寫其頂部。這暗示在重寫頂部后,I以下的樹的所有其他部分也可以被重寫,然后自頂向下掃描可以重寫整個樹。自底向上掃描結(jié)合模式樹的片段集,特別象詞法分析器結(jié)合正則表達式的項目集。與詞法分析器ー樣,BURS模式匹配的速度可以通過將其作為FSA而試銷來提高(在這種情況下,它是ー個樹自動機),而不是采用解釋的方法)。與詞法分析器不同,不同模式有不同代價,而我們想要最小代價的重寫。在解釋實現(xiàn)中,基于代價的判定可以用動態(tài)程序設(shè)計技術(shù)處理:在每個結(jié)點,只有在給頂寄存器類型中得到結(jié)果的代價最地的方法被保留。在樹自動機實現(xiàn)中,常量代價可以被合并進自動機。結(jié)果轉(zhuǎn)換表經(jīng)常是巨大但可以被可觀地壓縮。?BURS代碼生成可以相對容易地為額外的需要而改寫。例如,具有集中類型寄存器的機器的代碼生成和方法到控制流指令的擴展。?兩個變量都存活于程序中的一個給定位置,當(dāng)涉及到寄存器分配時它們會相互干擾。如果我們知道所有變量的活躍范圍,可以創(chuàng)建變量的寄存器相干圖,其中每個結(jié)點代表一個變量并且兩結(jié)點N1與N2之間的每條弧表示結(jié)點N!與N2所代表的標(biāo)量的活躍范圍互相重疊。?通過對圖著色,沒有相同顏色的兩結(jié)點被弧連接,沒種顏色代表ー個寄存器,這樣我們可以發(fā)現(xiàn)ー個可能的寄存器至變量的分配》最優(yōu)寄存器分配與使用最低顏色數(shù)的圖著色對應(yīng)。?最優(yōu)圖著色問題是NP完全的,但存在好的啟發(fā)式算法,例如,從圖中暫時移除度最小的結(jié)點,用相同的算法遞歸地對余下的圖著色,重新連接移去的結(jié)點并且對其著色。?在超級編譯中,ー個小但經(jīng)常使用的中間代碼片段被采用并且用慣犯的研究來為它生成可能的最好的代碼。結(jié)果代碼在編譯程序中被用做模板。用這種方法已經(jīng)發(fā)現(xiàn)了驚人的代碼序列。?在將中間代碼轉(zhuǎn)換成目標(biāo)代碼前,可能會進行預(yù)處理以提高效率。簡單預(yù)處理的例子有恒定折?和算術(shù)簡化。如果原程序語義需要如此,必須注意算術(shù)溢出條件是否被預(yù)處理忠實地翻譯。?更廣泛的預(yù)處理可以在例程上進行,它們可以被內(nèi)聯(lián)或克隆。在內(nèi)聯(lián)中對例程的調(diào)用被被調(diào)用的例程體替換。這節(jié)省了調(diào)用與返回序列,為進ー步優(yōu)化開真的不掉線嗎??ヽ?????????????辟了道路。必須注意保持參數(shù)轉(zhuǎn)移的語義。?在克隆中,制作例程R的拷貝C,其中參數(shù)P的值固定為值V;對R的所有調(diào)用(其中參數(shù)P有值V)被對拷貝C的調(diào)用替換。對拷貝C經(jīng)常可以產(chǎn)生一個比對原來的例程R更好的翻譯。?代碼生成過程產(chǎn)生的某些次最優(yōu)符號機器代碼序列可以同歸窺孔優(yōu)化移除,其中固定的參數(shù)化序列被其他更好的固定的參數(shù)化序列取代。大約1〇〇種替換模式就足夠解決相對簡單代碼生成器留下的幾乎所有修正的低效問題?指令流中的可替換序列在窺孔優(yōu)化中用基于替換模式的FSA識別。FSA識別器識別最長的可能序列,正如其在詞法分析器中所做的。然后,序列被替換并且重新開始。?代碼生成產(chǎn)生了符號奇跡指令表,其離可執(zhí)行的二進制程序還有幾步之遙。在大多數(shù)編譯程序中,這些步驟有局部匯編程序完成。?匯編程序?qū)樵创a模塊生成的符號指令翻譯成可重定位的二進制目標(biāo)文件。連接程序?qū)⒁恍┛芍囟ㄎ坏亩M制文件和可能的ー些庫目標(biāo)文件結(jié)合為可執(zhí)行的二進制程序文件。載入程序?qū)⒖蓤?zhí)行二景致程序文件的內(nèi)容裝入存儲器并且開始執(zhí)行程序??芍囟ㄎ荒繕?biāo)文件的代碼段和數(shù)據(jù)段由直接從符號指令的來的二進制代碼組成。因為ー些機器指令需要特殊的對齊,必須在可重定位目標(biāo)代碼中插入空操作指令??芍囟ㄎ欢M制目標(biāo)文件包含代碼段、數(shù)據(jù)段、重定位信息以及外部連接信息。計算可重定位二進制文件中的存儲器地址就好象文件在位置。被裝入存儲器。重定位信息列出地址的位置,就象通常一樣,當(dāng)文件被裝入不同位置時,它必須更新。得到重定位信息從理論上說是ー個兩遍掃描過程。第二遍掃描可以通過回填重定位地址而避免。重定位信息通常作為位圖實現(xiàn)。外部入口點在可重定位二進制文件中標(biāo)記ー個給定單元使其可以被其他可重定位二進制文件使用。ー個模塊中的外部入口點可以被不同甚至相同模塊中的外部訪問存取。外部連接信息經(jīng)常作為記錄數(shù)組實現(xiàn)連接程序結(jié)合其輸入文件的代碼段和數(shù)據(jù)段,用重定位與外部連接信息將相對地址轉(zhuǎn)換為絕對地址,在庫模塊中連接以滿足剩余的外部訪問。連接產(chǎn)生一個可執(zhí)行代碼文件,它由一個代碼段和ー個數(shù)據(jù)段組成。重定位位圖與外部符號表已經(jīng)不存在了,完成了它們的使命。這就是完成了翻譯過程。從編譯程序構(gòu)造的極度高級的觀點看,可以認為文本分析由模式匹配完成,上下文處理由數(shù)據(jù)流機完成,目標(biāo)代碼合成再教育次由模式匹配完成。4.580x86指令系統(tǒng)計算機是通過執(zhí)行指令序列來解決問題的,因而每種計算機都有一組指令集供給用戶使用,這組指令集就稱為計算機的指令系統(tǒng)。目前,一般小型或微型計算機的指令系統(tǒng)可以包括幾十種或百余種指令。這里簡單介紹一下80X86的指令系統(tǒng)以及在指令格式。計算機中的指令由操作碼字段和操作數(shù)字段兩部分組成。操作碼字段指示計算機所要執(zhí)行的操作,而操作數(shù)字段則指出在指令執(zhí)行操作的過程中所需要的操作數(shù)。例如,加法指令除需要指定加法操作外,還需要提供加數(shù)和被加數(shù)。操作數(shù)字段可以是操作數(shù)本身,也可以是操作數(shù)地址或是地址的一部分,還可以是指向操作數(shù)地址的指針或其他相關(guān)操作數(shù)的信息。指令的格式一般是:真的ネ掉線嗎??、????????????操作數(shù)字段可以是ー個、兩個、或三個,通常稱為ー地址、二地址或三地址指令。80X86的大多數(shù)運算指令采用二地址指令,少數(shù)釆用三地址指令。指令的操作碼字段在機器里的表示比較簡單,只需對每ー種操作指定確定的二進制代碼就可以了。指令的操作數(shù)字段的情況就比較復(fù)雜了,如果操作數(shù)存放在寄存器中,則由于寄存器的數(shù)量較少,因而需要指定的操作數(shù)地址的位數(shù)就較少;但如果操作數(shù)存放在存儲器里,那么ー個存儲單元的地址對8086就需要20位對80386及其后繼機型則需要32位。
計算機只能識別二進制代碼,所以機器指令是二進制代碼組成的。為便于人們使用而采用匯編語言寫程序。匯編語言是一種符號語言,它用助記符來表示操作碼,用符號或符號地址來表示操作數(shù)或操作數(shù)地址,它與機器指令——對應(yīng)的。4.6字節(jié)代碼設(shè)計所用匯編指令的字節(jié)代碼表示:Opcodeinstruction89MOV 1000100150P
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年專注種子繁育員職業(yè)資格考試試題及答案
- 明確目標(biāo)的體育經(jīng)紀人備考方法試題及答案
- 模具設(shè)計師資格認證考試解題策略與試題及答案
- 人教版初中英語八年級上學(xué)期期末考試試卷5英語試題含聽力音頻及答案解析
- 主動學(xué)習(xí)的2024年籃球裁判員考試試題及答案
- 模具設(shè)計師職業(yè)未來與資格考試的聯(lián)系試題及答案
- 游泳救生員安全意識提升試題及答案
- 一站式獲取體育經(jīng)紀人考試試題及答案
- 2024年體育經(jīng)紀人應(yīng)關(guān)注的政策變化試題及答案
- 助力農(nóng)業(yè)植保員職業(yè)認證試題及答案指南
- 試劑售后承諾書
- 小學(xué)校本課程-生活中的陌生人教學(xué)課件設(shè)計
- 榆陽區(qū)可可蓋煤礦礦山地質(zhì)環(huán)境保護與土地復(fù)墾方案
- 滬教版三年級下冊數(shù)學(xué)第二單元 用兩位數(shù)乘除 測試卷及參考答案【培優(yōu)a卷】
- 中小型病理技術(shù)團隊崗位設(shè)置及績效分配現(xiàn)狀分析
- 防護棚驗收表
- 磁粉檢測試題庫
- 教科版-四年級下-第一單元-快樂讀書屋一:皎皎空中孤月輪 名師獲獎
- 2022-2023學(xué)年天津市部分區(qū)高二(下)期中數(shù)學(xué)試卷及答案解析
- 醫(yī)院侵害未成年人案件強制報告制度培訓(xùn)課件
- 內(nèi)蒙古曹四夭鉬礦床原生暈特征及深部找礦預(yù)測
評論
0/150
提交評論