編譯原理 論文_第1頁(yè)
編譯原理 論文_第2頁(yè)
編譯原理 論文_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

編譯原理心得計(jì)本(2)班孫璐1104012031編譯原理是計(jì)算機(jī)及相關(guān)專業(yè)的一門(mén)重要專業(yè)課程,在計(jì)算機(jī)科學(xué)中有很重要的地位和作用,已被國(guó)內(nèi)外高校列為計(jì)算機(jī)專業(yè)的主要課程。它主要介紹了高級(jí)程序設(shè)計(jì)語(yǔ)言編譯程序構(gòu)造的一般原理、基本設(shè)計(jì)方法、主要實(shí)現(xiàn)技術(shù)和一些自動(dòng)構(gòu)造工具。通過(guò)該課程的學(xué)習(xí),對(duì)提高學(xué)生計(jì)算機(jī)軟件素質(zhì),使學(xué)生真正認(rèn)識(shí)計(jì)算機(jī)信息處理實(shí)質(zhì)并綜合運(yùn)用所學(xué)的軟件設(shè)計(jì)技術(shù)來(lái)分析問(wèn)題等具有很大作用。該課程理論性與實(shí)踐性都很強(qiáng),我們?cè)趯W(xué)習(xí)是普遍感到內(nèi)容非常抽象,不易理解,內(nèi)容多且繁瑣,難以完整、全面地掌握編譯原理的有關(guān)知識(shí),更不用說(shuō)靈活運(yùn)用編譯原理知識(shí)從事相關(guān)設(shè)計(jì)或應(yīng)用于其他領(lǐng)域。雖然只有少數(shù)人從事編譯方面的工作,但是這門(mén)課在理論、技術(shù)、方法上都對(duì)我們提供了系統(tǒng)而有效的訓(xùn)練,有利于提高軟件人員的素質(zhì)和能力。采用有用的資助手段增強(qiáng)課堂教學(xué)效果?;贗nternet網(wǎng)絡(luò)和多媒體技能,資助手段有種種千般的情勢(shì),可以借用有:討論學(xué)習(xí)模式、探索學(xué)習(xí)模式、提供種種資源庫(kù)的網(wǎng)上資助教學(xué)應(yīng)用模式。在Internet上實(shí)現(xiàn)討論學(xué)習(xí)的要領(lǐng)有多種,最簡(jiǎn)略實(shí)用的是使用現(xiàn)有的電子通告牌體系(BBS),這種體系具有用戶管理、討論管理、文章討論、實(shí)時(shí)討論,用戶留言、電子信件等諸多功效。編譯原理在學(xué)習(xí)歷程,門(mén)生題目難點(diǎn)不能逐一與老師舉行面臨面舉行,那末議決網(wǎng)絡(luò),可以題目果然,老師創(chuàng)建相應(yīng)的主題,門(mén)生可以在自己學(xué)習(xí)的特定地域發(fā)言,門(mén)生之間可以舉行交換,全部的題目都果然化。探索學(xué)習(xí)模式。這種模式一樣平常都是由某些教誨機(jī)構(gòu)設(shè)立一些適當(dāng)特定門(mén)生工具的題目,議決Internet向門(mén)生公布,要求門(mén)生解答;同時(shí)提供大量的、與題目相十的信息資源供門(mén)生在解決題目歷程中查閱。這種模式徹底轉(zhuǎn)變了傳統(tǒng)教學(xué)歷程中門(mén)生被動(dòng)繼承的狀態(tài),而使門(mén)生處于積極自動(dòng)的職位地方,因而能有用地引發(fā)門(mén)生的學(xué)習(xí)興趣和創(chuàng)造性。在我們學(xué)習(xí)編譯原理以前,都認(rèn)為編譯原理只能應(yīng)用在寫(xiě)程序語(yǔ)言的編譯器上,覺(jué)得用處不大,學(xué)習(xí)興趣不高。而在后來(lái)的學(xué)習(xí)中,我們逐漸認(rèn)識(shí)到計(jì)算機(jī)專業(yè)的學(xué)生,除了要會(huì)編寫(xiě)程序語(yǔ)言之外,還應(yīng)該了解它是如何被計(jì)算機(jī)所識(shí)別,這才是真正并且透徹地學(xué)習(xí)軟件。另外,編譯器中每一個(gè)模塊的編寫(xiě),都能對(duì)我們的編程能力的提高有很大幫助。在今后若從事軟件工程,這門(mén)課程也能夠?qū)帉?xiě)程序有所幫助。為了能夠系統(tǒng)掌握這門(mén)專業(yè)課,我們把編譯原理分為以下幾個(gè)模塊:(1)語(yǔ)言和文法;(2)詞法分析;(3)語(yǔ)法分析;(4)語(yǔ)義分析和中間代碼生成;(5)代碼優(yōu)化和目標(biāo)代碼生成;(6)關(guān)于實(shí)踐。在學(xué)習(xí)的開(kāi)始,我們需要掌握什么是編譯,編譯分為哪些階段,編譯程序和解釋程序的區(qū)別等等。在做好了這些方面的準(zhǔn)備后,開(kāi)始了系統(tǒng)的學(xué)習(xí)。語(yǔ)言和文法部分的知識(shí)包括文法基本概念及文法的二義性?;靖拍钣形姆ǘx、推導(dǎo)、句型、句子等等。二義性文法是通過(guò)畫(huà)語(yǔ)法樹(shù)的方法來(lái)證明。詞法分析相對(duì)來(lái)說(shuō)比較簡(jiǎn)單。可能是詞法分析程序本身實(shí)現(xiàn)起來(lái)很簡(jiǎn)單吧,很多沒(méi)有學(xué)過(guò)編譯原理的人也同樣可以寫(xiě)出各種各樣的詞法分析程序。不過(guò)編譯原理在講解詞法分析的時(shí)候,重點(diǎn)把正則表達(dá)式和自動(dòng)機(jī)原理加了進(jìn)來(lái),然后以一種十分標(biāo)準(zhǔn)的方式來(lái)講解詞法分析程序的產(chǎn)生。這樣的做法道理很明顯,就是要讓詞法分析從程序上升到理論的地步。語(yǔ)法分析部分就比較麻煩一點(diǎn)了。現(xiàn)在一般有兩種語(yǔ)法分析算法,LL自頂向下算法和LR自底向上算法。LL算法還好說(shuō),到了LR算法的時(shí)候,困難就來(lái)了。很多自學(xué)編譯原理的都是遇到LR算法的理解成問(wèn)題后就放棄了自學(xué)。其實(shí)這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫(xiě)出來(lái)才算真正的會(huì)。像LR算法的語(yǔ)法分析器,一般都是用工具Yacc來(lái)生成,實(shí)踐中完全沒(méi)有比較自己來(lái)實(shí)現(xiàn)。對(duì)于LL算法中特殊的遞歸下降算法,因?yàn)槠鋵?shí)踐十分簡(jiǎn)單,那么就應(yīng)該要求每個(gè)學(xué)生都能自己寫(xiě)。當(dāng)然,現(xiàn)在也有不少好的LL算法的語(yǔ)法分析器,不過(guò)要是換在非C平臺(tái),比如Java,Delphi,你不能運(yùn)用YACC工具了,那么你就只有自己來(lái)寫(xiě)語(yǔ)法分析器。等學(xué)到詞法分析和語(yǔ)法分析時(shí)候,你可能會(huì)出現(xiàn)這樣的疑問(wèn):“詞法分析和語(yǔ)法分析到底有什么?”就從編譯器的角度來(lái)講,編譯器需要把程序員寫(xiě)的源程序轉(zhuǎn)換成一種方便處理的數(shù)據(jù)結(jié)構(gòu)(抽象語(yǔ)法樹(shù)或語(yǔ)法樹(shù)),那么這個(gè)轉(zhuǎn)換的過(guò)程就是通過(guò)詞法分析和語(yǔ)法分析的。其實(shí)詞法分析并非一開(kāi)始就被列入編譯器的必備部分,只是我們?yōu)榱撕?jiǎn)化語(yǔ)法分析的過(guò)程,就把詞法分析這種繁瑣的工作單獨(dú)提取出來(lái),就成了現(xiàn)在的詞法分析部分。除了編譯器部分,在其它地方,詞法分析和語(yǔ)法分析也是有用的。比如我們?cè)贒OS,Unix,Linux下輸入命令的時(shí)候,程序如何分析你輸入的命令形式,這也是簡(jiǎn)單的應(yīng)用??傊@兩部分的工作就是把不“規(guī)則”的文本信息轉(zhuǎn)換成一種比較好分析好處理的數(shù)據(jù)結(jié)構(gòu)。那么為什么編譯原理的教程都最終把要分析的源分析轉(zhuǎn)換成“樹(shù)”這種數(shù)據(jù)結(jié)構(gòu)呢?數(shù)據(jù)結(jié)構(gòu)中有Stack,Line,List…這么多數(shù)據(jù)結(jié)構(gòu),各自都有各自的特點(diǎn)。但是Tree這種結(jié)構(gòu)有很強(qiáng)的遞歸性,也就是說(shuō)我們可以把Tree的任何結(jié)點(diǎn)Node提取出來(lái)后,它依舊是一顆完整的Tree。這一點(diǎn)符合我們現(xiàn)在編譯原理分析的形式語(yǔ)言,比如我們?cè)诤瘮?shù)里面使用函樹(shù),循環(huán)中使用循環(huán),條件中使用條件等等,那么就可以很直觀地表示在Tree這種數(shù)據(jù)結(jié)構(gòu)上。同樣,我們?cè)趫?zhí)行形式語(yǔ)言的程序的時(shí)候也是如此的遞歸性。在編譯原理后面的代碼生成的部分,就會(huì)介紹一種堆棧式的中間代碼,我們可以根據(jù)分析出來(lái)的抽象語(yǔ)法樹(shù),很容易,很機(jī)械地運(yùn)用遞歸遍歷抽象語(yǔ)法樹(shù)就可以生成這種指令代碼。而這種代碼其實(shí)也被廣泛運(yùn)用在其它的解釋型語(yǔ)言中。像現(xiàn)在流行的 Java,.NET,其底層的字節(jié)碼bytecode,可以說(shuō)就是這中基于堆棧的指令代碼的。在學(xué)習(xí)文法時(shí),對(duì)文法的組成,用法都較為明了,而在真正做題時(shí)卻感到十分吃力。例如給出了一個(gè)語(yǔ)言,要求寫(xiě)出它的上下文無(wú)關(guān)文法,就感到十分棘手,所以今后在這方面要加大練習(xí)量,以熟練掌握。而在之后的詞法分析和語(yǔ)法分析中,我感到在看基本原理時(shí)十分困難,通常要長(zhǎng)時(shí)間鉆研才能夠有所了解,而一旦掌握了基本原理,做題時(shí)就感到十分順暢了。例如,在剛接觸到LR(0)文法時(shí),我用了大量的時(shí)間去學(xué)習(xí)它的原理,掌握之后,在列LR(0)分析表和寫(xiě)分析過(guò)程時(shí),只要思路清晰,就會(huì)比較順暢,而且不會(huì)犯錯(cuò)。關(guān)于語(yǔ)義分析,語(yǔ)法制導(dǎo)翻譯,類型檢查等等部分,其實(shí)都是一種完善前面得到的抽象語(yǔ)法樹(shù)的過(guò)程。比如說(shuō),我們寫(xiě)C語(yǔ)言程序的時(shí)候,都知道,如果把一個(gè)浮點(diǎn)數(shù)直接賦值給一個(gè)整數(shù),就會(huì)出現(xiàn)類型不匹配,那么C語(yǔ)言的編譯器是怎么知道的呢?就是通過(guò)這一步的類型檢查。像C++語(yǔ)言這中支持多態(tài)函數(shù)的語(yǔ)言,這部分要處理的問(wèn)題就更多更復(fù)雜了。大部編譯原理的教材在這部分都是講解一些比較好的處理策略而已。因?yàn)樾碌膯?wèn)題總是在發(fā)生,舊的辦法不見(jiàn)得足夠解決。程序的語(yǔ)義就是它的“意思”,它與語(yǔ)法或結(jié)構(gòu)不同。程序的語(yǔ)義確定程序的運(yùn)行,但是大多數(shù)的程序設(shè)計(jì)語(yǔ)言都具有在執(zhí)行之前被確定而不易由語(yǔ)法表示和由分析程序分析的特征。 這些特征被稱作靜態(tài)語(yǔ)義,而語(yǔ)義分析程序的任務(wù)就是分析這樣的語(yǔ)義(程序的“動(dòng)態(tài)”語(yǔ)義具有只有在程序執(zhí)行時(shí)才能確定的特性,由于編譯器不能執(zhí)行程序,所以它不能由編譯器來(lái)確定)。一般的程序設(shè)計(jì)語(yǔ)言的典型靜態(tài)語(yǔ)義包括聲明和類型檢查。由語(yǔ)義分析程序計(jì)算的額外信息(諸如數(shù)據(jù)類型)被稱為屬性,它們通常是作為注釋或“裝飾”增加到樹(shù)中(還可將屬性添加到符號(hào)表中)。在正運(yùn)行的C表達(dá)式a[index]=4+2中,該行分析之前收集的典型類型信息可能是:a是一個(gè)整型值的數(shù)組,它帶有來(lái)自整型子范圍的下標(biāo); index則是一個(gè)整型變量。接著,語(yǔ)義分析程序?qū)⒂盟械淖颖磉_(dá)式類型來(lái)標(biāo)注語(yǔ)法樹(shù),并檢查賦值是否使這些類型有意義了,如若沒(méi)有,則聲明一個(gè)類型匹配錯(cuò)誤。在上例中,所有的類型均有意義,有關(guān)語(yǔ)法樹(shù)的語(yǔ)義分析結(jié)果可用以下注釋了的樹(shù)來(lái)表示。語(yǔ)義分析重點(diǎn)是其功能,中間代碼生成和語(yǔ)法制導(dǎo)翻譯定義與方法。關(guān)于中間代碼生成,代碼生成,代碼優(yōu)化部分的內(nèi)容就實(shí)在不好說(shuō)了。國(guó)內(nèi)很多教材到了這部分都會(huì)很簡(jiǎn)單地走馬觀花講過(guò)去,學(xué)生聽(tīng)了也只是作為了解,不知道如何運(yùn)用。不過(guò)這部分內(nèi)容的東西如果要認(rèn)真講,單獨(dú)開(kāi)一學(xué)期的課程都講不完。在《編譯原理及實(shí)踐》的書(shū)上,對(duì)于這部分的講解就恰到好處。作者主要講解的還是一種以堆棧為基礎(chǔ)的指令代碼,十分通俗易懂,讓人看了后,很容易模仿,自己下來(lái)后就可以寫(xiě)自己的代碼生成。代碼優(yōu)化部分在大學(xué)本科教學(xué)中還是一個(gè)不太重要的部分,就是算是實(shí)踐過(guò)程中,相信大家也不太運(yùn)用得到。畢竟,自己做的編譯器能正確生成執(zhí)行代碼已經(jīng)很不錯(cuò)了,還談什么優(yōu)化呢?編譯原理的課程畢竟還只是講解原理的課程,不是專門(mén)的編譯技術(shù)課程。這兩門(mén)課程是有很大的區(qū)別的。編譯技術(shù)更關(guān)注實(shí)際的編寫(xiě)編譯器過(guò)程中運(yùn)用到的技術(shù),而原理的課關(guān)注講解其基本理論。但是計(jì)算機(jī)科學(xué)本身就是一門(mén)實(shí)踐性很強(qiáng)的課程,如果能夠?qū)W以致用,那才叫真正的學(xué)會(huì)。李陽(yáng)在講解瘋狂英語(yǔ)的時(shí)候就說(shuō)到,只要當(dāng)你會(huì)實(shí)際中運(yùn)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論