<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    www.baidu.com

    JavaCode--我愛你,芳兒

    JavaStudy--我愛你,芳兒

    學習編譯原理的相關建議

    編譯原理一般認為是較難的一門課.從網上的評論來看,有人說學了一年半軟件理論,就一門編譯看不懂;有人甚至說它是大本軟件課程里最難的一門;有人抱怨國內的編譯教材沒有一本容易懂的。

      從筆者學習實踐來看,第一次學了一個多月,理論部分一知半解,第二次學了一星期,基本看懂詞法分析的理論部分,語法分析就一知半解了,第三次學了一星期,才基本看懂詞法分析和語法分析.由此看來,這門課確實有難度.網上有的帖子,把編譯器的編寫搞得高深莫測一般,似乎難度極大,非常人能及.

      編譯原理究竟難在哪里?筆者的體會,主要在這幾點:

      1.錯誤認識: 很多人以為編譯原理只能應用在寫程序語言的編譯器上,覺得用處不大,學習興趣不高.而且可能覺得寫編譯器就必須完全手工來寫.

      2.自動機理論: 象NFA,DFA之類,比較抽象,要費些腦子,特別如果學離散數學時沒有學自動機理論的話,更是需要多花點時間.

      3.集合論的推演: 主要是一些閉包運算之類,數學基礎不好的話,學起來也會感到吃力.

      4.LR文法: 主要是又引入了自動機

      不管哪本編譯教材,即使是絕對經典”龍書”也不例外,都要涉及到這幾個難點.由于這些內容本身不好懂,作者有再大的本事,也很難把書寫得象小說那么流暢好懂.

      明確了難點,接著想對策.大致有這么幾種:

      1.端正認識: 編譯原理在靜態文本處理上有廣泛的應用,舉個簡單的例子,把HTML文件轉化為純文本,利用編譯原理來實現”非常”簡單.理解了編譯原理的實用性,大概可以提高學習興趣.

      2.反復看書: 這個辦法看起來最笨,卻是基本的方法.忘了是哪位名人說過,書只要多看,總能看得懂的.

      3.結合源碼來看: 這是經典教材Compiler Design in C的作者Allen Hollub建議的方法.這本教材的特色就是包含了大段yacc,lex的代碼.這也是個好方法,而且,只有看懂了代碼,才能說在根本上理解了理論.當然,要完全看懂yacc的代碼,工作量是很大的,而且同樣要先理解理論.

      4.刪繁就簡,避重就輕.網上流傳較廣的一篇《編譯原理學習導論》(作者四川大學唐良)就基本是這種思路,對于詞法分析,作者避免了自動機理論和集合論推演的介紹,直接搬出源碼來,大大降低了理解難度,對于語法分析,作者介紹了遞歸下降和LL文法及相應的源碼,而對LR文法,只說”理解理論就可以了”.雖然這種方法回避了對于難點的學習,但是用這種方法學習,可以在較短時間內編寫出一個能夠運行的詞法分析器和語法分析器,可以大大提高學習積極性.

    筆者的思路大體上類似第4種方法,但也稍有不同.由于一個偶然的原因, 筆者需要編寫一個詞法分析器和語法分析器,用于程序源代碼的靜態分析.開始無從下手,硬著頭皮看了點編譯原理,覺得困難很大.后來偶然找到一個類似的開源程序,是利用一個叫做PCCTS的編譯器自動生成工具開發的,大受啟發.開源就是好!筆者找來了一個叫做ANTLR的工具(它是PCCTS的新版,支持生成java,c++和c#代碼),又下載了一個c語言的語法文件(因為筆者需要處理c代碼文件),然后自己編了少量動作(action)語句,界面代碼,分析處理代碼等,就這樣,在對編譯原理所知甚少(以前學過的因為理解不深都忘了,只記得正則表達式)的情況下,僅用一個星期就寫出了程序.

      這次實踐使筆者對編譯原理興趣大增,重新又學了一遍編譯原理,并歸納出筆者認為比較實用有效的編譯原理學習步驟:

      1.先利用ANTLR之類的編譯器生成工具,做一個小程序(如上面提到的HTML文件轉化成純文本文件的程序),所需知識只是正則表達式的基本知識和生成工具本身的使用方法(可以看聯機幫助和網上教程(tutorial)來掌握). 這樣做的好處是: 

      1)可以體會到編譯原理的實用性,提高學習興趣

      2)入門容易,消除編譯原理學習的畏難情緒.

      3)獲得詞法分析器和語法分析器的感性認識,有利于加深對理論的理解.

      4)獲得編譯器自動生成工具(compiler compiler)的使用經驗,提高解決實際問題的能力.(實際工作很多都不是手編而是利用工具的)

      2.象ANTLR之類的工具是開源(open source)的,可研究其源碼,以便必要時自己手編分析程序.

      3.回過頭來看編譯原理教材. 這時大概會發現,很多理論很容易懂,剩下的只有上面說的幾個難點,多看幾遍,重點突破.

      4.結合教材所附源碼,進一步加深對教材的理解

      這里順便提一下,有的編譯原理的教材,對于輸入子系統不單立一章來講,有的甚至完全忽略,筆者認為, 輸入子系統相對于詞法分析器和語法分析器來說當然簡單地多,但也是兩者的基礎,故有必要看源碼來理解.在這方面,ANTLR的實現機制和Lex是不同的(當然和java與c的差異有關),可對照著看.
      
      筆者學習VC++時,深切體會到好教材的重要.筆者開始吃了劣質光盤版”教材”和”21天學VC++”的禍害,看了一個月還如入云霧之中,后來看了《VC++技術內幕》,方才豁然開朗.但是編譯原理的教材卻似乎質量相差不是特別大,關鍵還在于合適的方法.以上方法筆者也是誤打誤撞總結出來的,希望有所參考價值.



     

    芳兒寶貝.我愛你

    posted on 2008-02-26 00:34 wǒ愛伱--咾婆 閱讀(523) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    公告

    芳兒寶貝.我愛你


    黑客基地
    http://www.hackbase.com
    全球最大的黑客門戶網站


     最近在讀的書:

    常用鏈接

    留言簿(1)

    隨筆分類(37)

    JavaCode

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品无码一区二区| 亚洲美女激情视频| 国产精品久久亚洲一区二区| 成年在线观看免费人视频草莓| 77777亚洲午夜久久多喷| 永久免费av无码不卡在线观看| 国产精品亚洲专区在线观看| 成人毛片免费播放| 边摸边脱吃奶边高潮视频免费| 免费人成无码大片在线观看| 亚洲免费在线观看| 亚洲精品国产精品乱码视色| 日韩中文字幕免费视频| 亚洲欧洲国产综合| 国产成人免费A在线视频| 美女羞羞喷液视频免费| 亚洲欧洲∨国产一区二区三区| 最近免费中文字幕MV在线视频3| 精品亚洲A∨无码一区二区三区| 亚洲一区二区三区免费视频| 亚洲一区二区观看播放| 亚洲AV无码一区二三区 | 4338×亚洲全国最大色成网站| 精品久久久久久无码免费| 亚洲av伊人久久综合密臀性色| 三年片在线观看免费观看大全一 | 色吊丝永久在线观看最新免费| 色多多免费视频观看区一区| 亚洲AV永久无码精品| 成人免费一区二区三区在线观看| 美女18一级毛片免费看| 亚洲成av人片天堂网| 97视频免费在线| 精品一区二区三区高清免费观看 | 456亚洲人成在线播放网站| 国产成人综合久久精品免费 | 国产黄色免费观看| 亚洲欧洲校园自拍都市| 国产一级做a爱免费视频| 国产免费拔擦拔擦8X高清在线人| 亚洲熟妇av午夜无码不卡|