2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p>  附1 成績: </p><p>  畢業(yè)設(shè)計(jì) (論文)文獻(xiàn)綜述</p><p>  院 (系):信息與控制工程學(xué)院 </p><p>  專業(yè)班級: 計(jì)算機(jī)0801 </p><p>  畢 業(yè) 設(shè)

2、 計(jì)論 文 方 向 : </p><p>  綜述題目:基于Java的小型編譯器前端的設(shè)計(jì)與開發(fā)文獻(xiàn)綜述</p><p>  基于Java的小型編譯器前端的設(shè)計(jì)與開發(fā)文獻(xiàn)綜述</p><p><b>  摘要:</b></p><p>  21世紀(jì)是電腦發(fā)展的時(shí)代,從事軟件開發(fā)的人越來越多,

3、使用的開發(fā)軟件和開發(fā)環(huán)境也不盡相同,但是不論是哪種開發(fā)環(huán)境,都少不了使用編譯器。包括常用的C語言。</p><p>  編譯器(Compiler),是一種電腦程式,它會將用某種編程語言寫成的源代碼(原始語言),轉(zhuǎn)換成另一種編程語言(目標(biāo)語言)。它主要的目的是將便于人編寫,閱讀,維護(hù)的高級計(jì)算機(jī)語言所寫作的源代碼程式,翻譯為計(jì)算機(jī)能解讀、運(yùn)行的低階機(jī)器語言的程序,也就是執(zhí)行檔。編譯器將原始程序(Source pro

4、gram)作為輸入,翻譯產(chǎn)生使用目標(biāo)語言(Target language)的等價(jià)程序</p><p>  一個(gè)現(xiàn)代編譯器的主要工作流程:源代碼 (source code) → 預(yù)處理器 (preprocessor) → 編譯器 (compiler) → 匯編程序 (assembler) → 目標(biāo)代碼 (object code) → 鏈接器 (Linker) → 可執(zhí)行程序 (executables)。低階機(jī)器語言

5、是計(jì)算機(jī)能直接解讀、運(yùn)行的。編譯器將源程序作為輸入,翻譯產(chǎn)生使用目標(biāo)語言的等價(jià)程序。源代碼一般為高級語言 , 如Pascal、C、C++、C#、Java等,而目標(biāo)語言則是匯編語言或目標(biāo)機(jī)器的目標(biāo)代碼,有時(shí)也稱作機(jī)器代碼。</p><p>  論文首先論述編譯器的發(fā)展歷程開發(fā)背景和研究的目的與意義,然后對本次編譯器前端設(shè)計(jì)進(jìn)行簡單介紹,同時(shí)闡述該編譯器所具有的的功能,以及實(shí)現(xiàn)所用的工具和參考的資料</p>

6、;<p>  關(guān)鍵詞:編譯器,源代碼,目標(biāo)代碼</p><p><b>  1. 前言</b></p><p>  編譯程序是現(xiàn)代計(jì)算機(jī)系統(tǒng)的基本組成部分之一。編譯程序一般由詞法分析程序、語法分析程序、語義分析程序、中間代碼生成程序、目標(biāo)代碼生成程序、代碼優(yōu)化程序、表格管理程序和出錯(cuò)處理程序等成分構(gòu)成。</p><p>  在編譯

7、原理的教學(xué)過程中,語法和語義分析階段關(guān)于算法的講解都需要對算法進(jìn)行詳細(xì)的分析,包括算法條件的判斷,文法分析表的構(gòu)造過程,文法分析表的具體生成,針對文法的句子的分析過程等。這些過程往往需要占用大量時(shí)間來分析、制表等。</p><p>  2.C語言編譯器的發(fā)展歷程</p><p>  C語言是在70年代初問世的。一九七八年由美國電話電報(bào)公司(AT&T)貝爾實(shí)驗(yàn)室正式發(fā)表了C語言。同時(shí)

8、由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)學(xué)會在此基礎(chǔ)上制定了一個(gè)C 語言標(biāo)準(zhǔn),于一九八三年發(fā)表。通常稱之為ANSI C</p><p>  C語言是一種結(jié)構(gòu)化語言。它層次清晰,便于按模塊

9、化方式組織程序,易于調(diào)試和維護(hù)。C語言的表現(xiàn)能力和處理能力極強(qiáng)。它不僅具有豐富的運(yùn)算符和數(shù)據(jù)類型,便于實(shí)現(xiàn)各類復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。它還可以直接訪問內(nèi)存的物理地址,進(jìn)行位(bit)一級的操作。由于C語言實(shí)現(xiàn)了對硬件的編程操作,因此C語言集高級語言和低級語言的功能于一體。既可用于系統(tǒng)軟件的開發(fā),也適合于應(yīng)用軟件的開發(fā)。此外,C語言還具有效率高,可移植性強(qiáng)等特點(diǎn)。因此廣泛地移植到了各類各型計(jì)算機(jī)上,從而形成了多種版本的C語言</p>

10、<p>  目前最流行的C語言編譯器有以下幾種: </p><p>  ·GNU Compiler Collection 或稱 GCC </p><p>  ·Microsoft C 或稱 MS C </p><p>  ·Borland Turbo C 或稱 Turbo C </p><p>  這

11、些C語言版本不僅實(shí)現(xiàn)了ANSI C標(biāo)準(zhǔn),而且在此基礎(chǔ)上各自作了一些擴(kuò)充,使之更加方便、完美</p><p><b>  3本次設(shè)計(jì)實(shí)現(xiàn)目標(biāo)</b></p><p>  本次論文要求設(shè)計(jì)與開發(fā)一個(gè)能夠識別C語言子集的小型編譯器前端系統(tǒng),按照面向?qū)ο蟮乃枷肱c技術(shù)完成需求分析與系統(tǒng)設(shè)計(jì),要求對給定的C語言子集能夠進(jìn)行詞法分析、語法分析、語義分析及語法制導(dǎo)的中間代碼的生成,中

12、間代碼以三地址碼形式生成。</p><p>  編譯器前端主要負(fù)責(zé)解析(parse)輸入的源代碼,由語法分析器和語意分析器協(xié)同工作。語法分析器負(fù)責(zé)把源代碼中的‘單詞’(Token)找出來,語義分析器把這些分散的單詞按預(yù)先定義好的語法組裝成有意義的表達(dá)式,語句 ,函數(shù)等等。 例如“a = b + c;”前端語法分析器看到的是“a, =, b , +, c;”,語意分析器按定義的語法,先把他們組裝成表達(dá)式“b + c

13、”,再組裝成“a = b + c”的語句。 前端還負(fù)責(zé)語義(semantic checking)的檢查,例如檢測參與運(yùn)算的變量是否是同一類型的,簡單的錯(cuò)誤處理。最終的結(jié)果常常是一個(gè)抽象的語法樹(abstract syntax tree,或 AST),最后通過中間代碼生成器將語法分析樹,轉(zhuǎn)化為三地址代碼,這樣后端可以在此基礎(chǔ)上進(jìn)一步優(yōu)化,處理。</p><p><b>  編譯器翻譯程序步驟</b&

14、gt;</p><p>  編譯器內(nèi)部包括了許多步驟或稱為階段(phase),它們執(zhí)行不同的邏輯操作。將這些階段設(shè)想為編譯器中一個(gè)個(gè)單獨(dú)的片斷是很有用的,盡管在應(yīng)用中它們是經(jīng)常組合在一起的,但它們確實(shí)是作為單獨(dú)的代碼操作來編寫的。圖1 - 1是編譯器中的階段和與以下階段(文字表、符號表和錯(cuò)誤處理器)或其中的一部分交互的3個(gè)輔助部件。這里只是簡要地描述一下每個(gè)階段,今后大家還會更詳細(xì)地學(xué)到它們(文字表和符號表在1

15、. 4節(jié)中,錯(cuò)誤處理器在1 . 5節(jié))。</p><p>  (1) 掃描程序(scanner)</p><p>  在這個(gè)階段編譯器實(shí)際閱讀源程序(通常以字符流的形式表示)。掃描程序執(zhí)行詞法分析(Lexical analysis):它將字符序列收集到稱作記號(token)的有意義單元中,記號同自然語言,如英語中的字詞相似。因此可以認(rèn)為掃描程序執(zhí)行與拼寫相似的任務(wù)。例如在下面的代碼行(它可

16、以是C程序的一部分)中:</p><p>  a [index] = 4 + 2</p><p>  這個(gè)代碼包括了1 2個(gè)非空字符,但只有8個(gè)記號:</p><p><b>  a 標(biāo)識符</b></p><p><b>  [ 左括號</b></p><p>  i n

17、d e x 標(biāo)識符</p><p><b>  ] 右括號</b></p><p><b>  = 賦值</b></p><p><b>  4 數(shù)字</b></p><p><b>  + 加號</b></p><p><b

18、>  2 數(shù)字</b></p><p>  每一個(gè)記號均由一個(gè)或多個(gè)字符組成,在進(jìn)一步處理之前它已被收集在一個(gè)單元中。掃描程序還可完成與識別記號一起執(zhí)行的其他操作。例如,它可將標(biāo)識符輸入到符號表中,將文字(literal)輸入到文字表中(文字包括諸如3.14159265 35的數(shù)字常量,以及諸如“ Hello ,world!”的引用字符串)。</p><p>  (2)

19、語法分析程序(parser)</p><p>  語法分析程序從掃描程序中獲取記號形式的源代碼,并完成定義程序結(jié)構(gòu)的語法分析(syntax analysis),這與自然語言中句子的語法分析類似。語法分析定義了程序的結(jié)構(gòu)元素及其關(guān)系。通常將語法分析的結(jié)果表示為分析樹( parse tree)或語法樹(syntax tree)。例如,還是那行C代碼,它表示一個(gè)稱為表達(dá)式的結(jié)構(gòu)元素,該表達(dá)式是一個(gè)由左邊為下標(biāo)表達(dá)式、右

20、邊為整型表達(dá)式的賦值表達(dá)式組成。這個(gè)結(jié)構(gòu)可按下面的形式表示為一個(gè)分析樹:</p><p><b>  圖2</b></p><p>  請注意,分析樹的內(nèi)部節(jié)點(diǎn)均由其表示的結(jié)構(gòu)名標(biāo)示出,而分析樹的葉子則表示輸入中的</p><p>  記號序列(結(jié)構(gòu)名以不同字體表示以示與記號的區(qū)別)。分析樹對于顯示程序的語法或程序元素很有幫助,但是對于表示該結(jié)

21、構(gòu)卻顯得力不從心了。分析程序更趨向于生成語法樹,語法樹是分析樹中所含信息的濃縮(有時(shí)因?yàn)檎Z法樹表示從分析樹中的進(jìn)一步抽取,所以也被稱為抽象的語法樹( abstract syntax tree))。下面是一個(gè)C賦值語句的抽象語法樹的例子:</p><p><b>  圖3</b></p><p>  請注意,在語法樹中,許多節(jié)點(diǎn)(包括記號節(jié)點(diǎn)在內(nèi))已經(jīng)消失。例如,如果知

22、道表達(dá)式是一個(gè)下標(biāo)運(yùn)算,則不再需要用括號“ [”和“]”來表示該操作是在原始輸入中。</p><p>  (3) 語義分析程序(semantic analyzer)</p><p>  程序的語義就是它的“意思”,它與語法或結(jié)構(gòu)不同。程序的語義確定程序的運(yùn)行,但是大多數(shù)的程序設(shè)計(jì)語言都具有在執(zhí)行之前被確定而不易由語法表示和由分析程序分析的特征。這些特征被稱作靜態(tài)語義( static sem

23、antic),而語義分析程序的任務(wù)就是分析這樣的語義(程序的“動(dòng)態(tài)”語義具有只有在程序執(zhí)行時(shí)才能確定的特性,由于編譯器不能執(zhí)行程序,所以它不能由編譯器來確定)。一般的程序設(shè)計(jì)語言的典型靜態(tài)語義包括聲明和類型檢查。由語義分析程序計(jì)算的額外信息(諸如數(shù)據(jù)類型)被稱為屬性(attribute),它們通常是作為注釋或“裝飾”增加到樹中(還可將屬性添加到符號表中)。在正運(yùn)行的C表達(dá)式a [index] = 4 + 2中,該行分析之前收集的典型類型

24、信息可能是: a是一個(gè)整型值的數(shù)組,它帶有來自整型子范圍的下標(biāo);index則是一個(gè)整型變量。接著,語義分析程序?qū)⒂盟械淖颖磉_(dá)式類型來標(biāo)注語法樹,并檢查賦值是否使這些類型有意義了,如若沒有,則聲明一個(gè)類型匹配錯(cuò)誤。在上例中,所有的類型均有意義,有關(guān)語法樹的語義分析結(jié)果可用以下注釋了的樹來表示:</p><p><b>  圖4</b></p><p>  (4) 源代

25、碼優(yōu)化程序(source code optimizer)</p><p>  編譯器通常包括許多代碼改進(jìn)或優(yōu)化步驟。絕大多數(shù)最早的優(yōu)化步驟是在語義分析之后完成的,而此時(shí)代碼改進(jìn)可能只依賴于源代碼。這種可能性是通過將這一操作提供為編譯過程中的單獨(dú)階段指出的。每個(gè)編譯器不論在已完成的優(yōu)化種類方面還是在優(yōu)化階段的定位中都有很大的差異。在上例中,我們包括了一個(gè)源代碼層次的優(yōu)化機(jī)會,也就是:表達(dá)式4 + 2可由編譯器計(jì)算先

26、得到結(jié)果6(這種優(yōu)化稱為常量合并(constant folding))。當(dāng)然,還會有更復(fù)雜的情況。還是在上例中,通過將根節(jié)點(diǎn)右面的子樹合并為它的常量值,這個(gè)優(yōu)化就可以直接在(注釋)語法樹上完成:</p><p><b>  圖5</b></p><p>  盡管許多優(yōu)化可以直接在樹上完成,但是在很多情況下,優(yōu)化接近于匯編代碼線性化形式的樹更為簡便。這樣節(jié)點(diǎn)的變形有許多

27、,但是三元式代碼( three-address code)(之所以這樣稱呼是因?yàn)樗诖鎯ζ髦邪?個(gè)(或3個(gè)以上)位置的地址)卻是標(biāo)準(zhǔn)選擇。另一個(gè)常見的選擇是P -代碼(P - cod e),它常用于Pascal編譯器中。在前面的例子中,原先的C表達(dá)式的三元式代碼應(yīng)是:</p><p><b>  t = 4 + 2</b></p><p>  a [ index]

28、 = t</p><p> ?。ㄕ堊⒁?,這里利用了一個(gè)額外的臨時(shí)變量t 存放加法的中間值)。這樣,優(yōu)化程序就將這個(gè)代碼改進(jìn)為兩步。首先計(jì)算加法的結(jié)果:</p><p><b>  t = 6</b></p><p>  a [index] = t</p><p>  接著,將t替換為該值以得到三元語句</p>

29、<p>  a [index] = 6</p><p>  圖1 - 1已經(jīng)指出源代碼優(yōu)化程序可能通過將其輸出稱為中間代碼( intermediate code)來使用三元式代碼。中間代碼一直是指一種位于源代碼和目標(biāo)代碼(例如三元式代碼或類似的線性表示)之間的代碼表示形式。但是,我們可以更概括地認(rèn)為它是編譯器使用的源代碼的任何一個(gè)內(nèi)部表示。此時(shí),也可將語法樹稱作中間代碼,源代碼優(yōu)化程序則確實(shí)能繼續(xù)在

30、其輸出中使用這個(gè)表示。有時(shí),這個(gè)中間代碼也稱作中間表示( intermediate representation, I R)。</p><p>  (5) 代碼生成器(code generator)</p><p>  代碼生成器得到中間代碼( I R),并生成目標(biāo)機(jī)器的代碼。盡管大多數(shù)編譯器直接生成目標(biāo)代碼,但是為了便于理解,本書用匯編語言來編寫目標(biāo)代碼。正是在編譯的這個(gè)階段中,目標(biāo)機(jī)器

31、的特性成為了主要因素。當(dāng)它存在于目標(biāo)機(jī)器時(shí),使用指令不僅是必須的而且數(shù)據(jù)的形式表示也起著重要的作用。例如,整型數(shù)據(jù)類型的變量和浮點(diǎn)數(shù)據(jù)類型的變量在存儲器中所占的字節(jié)數(shù)或字?jǐn)?shù)也很重要。在上面的示例中,現(xiàn)在必須決定怎樣存儲整型數(shù)來為數(shù)組索引生成代碼。</p><p><b>  例如,下面是所</b></p><p>  給表達(dá)式的一個(gè)可能的樣本代碼序列(在假設(shè)的匯編語言

32、中):</p><p>  MOV R0, index ;; value of index -> R0</p><p>  MUL R0, 2 ;; double value in R0</p><p>  MOV R1, &a ;; address of a -> R1</p><p>  ADD R1, R0 ;; a

33、dd R0 to R1</p><p>  MOV *R1, 6 ;; constant 6 -> address in R1</p><p>  在以上代碼中,為編址模式使用了一個(gè)類似C的協(xié)定,因此& a是a的地址(也就是數(shù)組的基地址),* R 1則意味著間接寄存器地址(因此最后一條指令將值6存放在R 1包含的地址中)。這個(gè)代碼還假設(shè)機(jī)器執(zhí)行字節(jié)編址,并且整型數(shù)占據(jù)存儲器的

34、兩個(gè)字節(jié)(所以在第2條指令中用2作為乘數(shù))。</p><p>  (6) 目標(biāo)代碼優(yōu)化程序(target code optimizer)</p><p>  在這個(gè)階段中,編譯器嘗試著改進(jìn)由代碼生成器生成的目標(biāo)代碼。這種改進(jìn)包括選擇編址模式以提高性能、將速度慢的指令更換成速度快的,以及刪除多余的操作。在上面給出的樣本目標(biāo)代碼中,還可以做許多更改:在第2條指令中,利用移位指令替代乘法(通常地

35、,乘法很費(fèi)時(shí)間),還可以使用更有效的編址模式(例如用索引地址來執(zhí)行數(shù)組存儲)。</p><p>  使用了這兩種優(yōu)化后,目標(biāo)代碼就變成:</p><p>  MOV R0, index ;; value of index -> R0</p><p>  SHL R0 ;; double value in R0</p><p>  MOV

36、 &a[R0], 6 ;; constant 6 -> address a + R0</p><p>  到這里,對編譯器階段的簡要描述就結(jié)束了,但我們還應(yīng)特別強(qiáng)調(diào)這些講述僅僅是示意性的,也無需表示出正在工作中的編譯器的實(shí)際結(jié)構(gòu)。編譯器在其結(jié)構(gòu)細(xì)節(jié)上確實(shí)差別很大,然而,上面講到的階段總會出現(xiàn)在幾乎所有的編譯器的某個(gè)形式上。我們還談到了用于維持每一個(gè)階段所需信息的數(shù)據(jù)結(jié)構(gòu),例如語法樹、中間代碼(假設(shè)它

37、們并不相同)、文字表和符號表。下一節(jié)是編譯器中的主要數(shù)據(jù)結(jié)構(gòu)的概覽。</p><p>  編譯器中的主要數(shù)據(jù)結(jié)構(gòu)</p><p>  當(dāng)然,由編譯器的階段使用的算法與支持這些階段的數(shù)據(jù)結(jié)構(gòu)之間的交互是非常強(qiáng)大的。編譯器的編寫者盡可能有效實(shí)施這些方法且不引起復(fù)雜性。理想的情況是:與程序大小成線性比例的時(shí)間內(nèi)編譯器,換言之就是,在0 ( n)時(shí)間內(nèi), n是程序大小的度量(通常是字符數(shù))。本節(jié)將

38、講述一些主要的數(shù)據(jù)結(jié)構(gòu),它們是其操作部分階段所需要的,并用來在階段中交流信息。</p><p>  (1) 記號(t o k e n)</p><p>  當(dāng)掃描程序?qū)⒆址占揭粋€(gè)記號中時(shí),它通常是以符號表示這個(gè)記號;這也就是說,作為一個(gè)枚舉數(shù)據(jù)類型的值來表示源程序的記號集。有時(shí)還必須保留字符串本身或由此派生出的其他信息(例如:與標(biāo)識符記號相關(guān)的名字或數(shù)字記號值)。在大多數(shù)語言中,掃描程

39、序一次只需要生成一個(gè)記號(這稱為單符號先行( single symbol lookahead))。在這種情況下,可以用全程變量放置記號信息;而在別的情況(最為明顯的是F O RT R A N)下,則可能會需要一個(gè)記號數(shù)組。</p><p>  (2) 語法樹(syntax tre e)</p><p>  如果分析程序確實(shí)生成了語法樹,它的構(gòu)造通常為基于指針的標(biāo)準(zhǔn)結(jié)構(gòu),在進(jìn)行分析時(shí)動(dòng)態(tài)分配

40、該結(jié)構(gòu),則整棵樹可作為一個(gè)指向根節(jié)點(diǎn)的單個(gè)變量保存。結(jié)構(gòu)中的每一個(gè)節(jié)點(diǎn)都是一個(gè)記錄,它的域表示由分析程序和之后的語義分析程序收集的信息。例如,一個(gè)表達(dá)式的數(shù)據(jù)類型可作為表達(dá)式的語法樹節(jié)點(diǎn)中的域。有時(shí)為了節(jié)省空間,這些域也是動(dòng)態(tài)分配或存放在諸如符號表的其他數(shù)據(jù)結(jié)構(gòu)中,這樣就可以有選擇地進(jìn)行分配和釋放。實(shí)際上,根據(jù)它所表示的語言結(jié)構(gòu)的類型(例如:表達(dá)式節(jié)點(diǎn)對于語句節(jié)點(diǎn)或聲明節(jié)點(diǎn)都有不同的要求),每一個(gè)語法</p><p&

41、gt;  樹節(jié)點(diǎn)本身都可能要求存儲不同的屬性。在這種情況下,可由不同的記錄表示語法樹中的每個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)類型只包含與本身相關(guān)的信息。</p><p>  (3) 符號表(symbol table)</p><p>  這個(gè)數(shù)據(jù)結(jié)構(gòu)中的信息與標(biāo)識符有關(guān):函數(shù)、變量、常量以及數(shù)據(jù)類型。符號表幾乎與編譯器的所有階段交互:掃描程序、分析程序或?qū)?biāo)識符輸入到表格中的語義分析程序;語義分析程序?qū)⒃黾?/p>

42、數(shù)據(jù)類型和其他信息;優(yōu)化階段和代碼生成階段也將利用由符號表提供的信息選出恰當(dāng)?shù)拇a。因?yàn)閷Ψ柋淼脑L問如此頻繁,所以插入、刪除和訪問操作都必須比常規(guī)操作更有效。盡管可以使用各種樹的結(jié)構(gòu),但雜湊表卻是達(dá)到這一要求的標(biāo)準(zhǔn)數(shù)據(jù)結(jié)構(gòu)。有時(shí)在一個(gè)列表或棧中可使用若干個(gè)表格。</p><p>  (4) 常數(shù)表(literal table)</p><p>  常數(shù)表的功能是存放在程序中用到的常量和字

43、符串,因此快速插入和查找在常數(shù)表中也十分重要。但是,在其中卻無需刪除,這是因?yàn)樗臄?shù)據(jù)全程應(yīng)用于程序而且常量或字符串在該表中只出現(xiàn)一次。通過允許重復(fù)使用常量和字符串,常數(shù)表對于縮小程序在存儲器中的大小顯得非常重要。在代碼生成器中也需要常數(shù)表來構(gòu)造用于常數(shù)和在目標(biāo)代碼文件中輸入數(shù)據(jù)定義的符號地址。</p><p>  (5) 中間代碼(intermediate code)</p><p> 

44、 根據(jù)中間代碼的類型(例如三元式代碼和P -代碼)和優(yōu)化的類型,該代碼可以是文本串的數(shù)組、臨時(shí)文本文件或是結(jié)構(gòu)的連接列表。對于進(jìn)行復(fù)雜優(yōu)化的編譯器,應(yīng)特別注意選擇允許簡單重組的表示。</p><p>  (6) 臨時(shí)文件(t e m p o r a ry file)</p><p>  計(jì)算機(jī)過去一直未能在編譯器時(shí)將整個(gè)程序保留在存儲器中。這一問題已經(jīng)通過使用臨時(shí)文件來保存翻譯時(shí)中間步驟的

45、結(jié)果或通過“匆忙地”編譯(也就是只保留源程序早期部分的足夠信息用以處理翻譯)解決了。存儲器的限制現(xiàn)在也只是一個(gè)小問題了,現(xiàn)在可以將整個(gè)編譯單元放在存儲器之中,特別是在可以分別編譯的語言中時(shí)。但是偶爾還是會發(fā)現(xiàn)需要在某些運(yùn)行步驟中生成中間文件。其中典型的是代碼生成時(shí)需要反填( b a c k p a t c h)地址。例如,當(dāng)翻譯如下的條件語句時(shí)</p><p>  if x = 0 then ... else .

46、..</p><p>  在知道e l s e部分代碼的位置之前必須由文本跳到e l s e部分:</p><p><b>  CMP X, 0</b></p><p>  JNE NEXT ;; location of NEXT not yet known</p><p>  < code for then-pa

47、rt ></p><p><b>  N E X T :</b></p><p>  < code for else-part ></p><p>  通常,必須為N E X T的值留出一個(gè)空格,一旦知道該值后就會將該空格填上,利用臨時(shí)文件可以很容易地做到這一點(diǎn)。</p><p>  4.概要設(shè)計(jì)及基本

48、功能</p><p>  本系統(tǒng)使用java語言開發(fā),主要能讀取識別c語言代碼,因此,并能對給定的C語言子集能夠進(jìn)行詞法分析、語法分析、語義分析及語法制導(dǎo)的中間代碼的生成,并用圖形顯示語法分析樹,中間代碼以三地址碼形式生成。</p><p>  基本功能:1.識別C語言子集</p><p>  2.對給定的C語言子集能夠進(jìn)行詞法分析</p><p

49、>  3.對給定的C語言子集能夠進(jìn)行語法分析</p><p>  4.對給定的C語言子集能夠進(jìn)行語義分析及語法制導(dǎo)的中間代碼</p><p>  的生成,中間代碼以三地址碼形式生成</p><p><b>  5. 總結(jié)</b></p><p>  編譯原理作為計(jì)算機(jī)專業(yè)及其重要的組成部分,理論上需要掌握有關(guān)形式語

50、言和自動(dòng)機(jī)的抽象概念,技術(shù)上又要能夠熟練地利用各種數(shù)據(jù)結(jié)構(gòu)進(jìn)行編程。本文通過一個(gè)實(shí)際的可視編譯器開發(fā)實(shí)例,描述了編譯器前端的實(shí)現(xiàn)方法。希望通過詞法分析和語法分析的可視化過程使得編譯原理直觀化和可視化。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1]譚浩強(qiáng). C程序設(shè)計(jì)(第4版)[M].清華大學(xué)出版社,2010</p><p

51、>  [2]顏志軍,欒媛媛.Java程序設(shè)計(jì)實(shí)踐教程[M]. 清華大學(xué)出版社,2011</p><p>  [3]Alfred V. Aho著,趙建華等譯.編譯原理(第2版 本科教學(xué)版)[M]. 機(jī)械工業(yè)出版社,2009</p><p>  [4]http://blog.csdn.net/xianyuxiaoqiang/article/details/7042679</p>

52、;<p>  [5]http://www.56doc.com/computer/vb/142.html</p><p>  [6]http://blog.sciencenet.cn/home.php?mod=space&uid=39686&do=blog&id=221450</p><p>  [7] http://baike.baidu.com/vi

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論