1。 你學(xué)到了一種解決問(wèn)題的方法,而且是強(qiáng)有力的方法。也許你一輩子都無(wú)緣寫一個(gè)C語(yǔ)言的編譯器,但如果你一直做程序,一直在尋求高效而通用的解決問(wèn)題之道,總有一天你的自己設(shè)計(jì)小尺度的語(yǔ)言。語(yǔ)法分析,語(yǔ)義分析,和代碼優(yōu)化的知識(shí)(當(dāng)然不光是知識(shí)啦,還有技巧,思想)能讓你終生受益。
2。你得以學(xué)習(xí)大量?jī)?yōu)美的算法,并得以欣賞理論和實(shí)踐在編譯器開(kāi)發(fā)中如何美妙地結(jié)合在一起。
3。你可以了解怎樣規(guī)劃,設(shè)計(jì),和實(shí)現(xiàn)一個(gè)大型的系統(tǒng) (編譯器的代碼量可不?。?。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
痛苦,最近在看《編譯原理》,龍書,有點(diǎn)犯傻了。
一天的進(jìn)度,頂多三十頁(yè),再多就看不下去,要不然就是那種,感覺(jué)自己是在瀏覽書里字是怎么寫的,壓根沒(méi)想這些字表達(dá)的意思是什么。
想請(qǐng)教學(xué)過(guò)編譯,并且學(xué)的不錯(cuò)的大蝦么,怎么堅(jiān)持下去,并看完編譯的。
感覺(jué)學(xué)了編譯還不錯(cuò),因?yàn)榍懊孀约旱教幙袞|西,書里說(shuō)的話都能明白。而且看了編譯更是明白數(shù)學(xué)建模的妙處,數(shù)據(jù)結(jié)構(gòu)的用處,離散數(shù)學(xué)的經(jīng)典。原來(lái)學(xué)這些課程的時(shí)候,以為學(xué)了沒(méi)用,現(xiàn)在想想,不是沒(méi)用,是自己不會(huì)用。
評(píng)論:
~~~~~~~~
我建議還是從實(shí)踐出發(fā)進(jìn)行學(xué)習(xí),首先要有需求。
編譯原理我認(rèn)為有兩方面的作用:
1.有助于你理解程序的原理,有助于本身程序功力的提升
2.經(jīng)常會(huì)用一些工具需要制作,會(huì)用到編譯原理。比如做一個(gè)數(shù)據(jù)描述語(yǔ)言等等。
可以從使用工具出發(fā),初步理解其中的原理,推薦學(xué)習(xí)flex+bison
~~~~~~~~~
感覺(jué)需要的時(shí)候再學(xué)~
或者當(dāng)小說(shuō)先看一遍也可
~~~~~~~~~
1. 龍書再好,也算是比較理論了,理論就意味著難以和真實(shí)的情況銜接。。。 。。。
畢竟現(xiàn)在有很多很好的工具了,用這些工具可以很快的構(gòu)造出Lexer和Parser,不再需要你手工寫了。。。
我以前和一個(gè)大牛聊過(guò)?!咀ⅲ赫娲笈!?,
他寫編譯器就是用ANTLR的,所以我現(xiàn)在也在學(xué),而且這些工具生產(chǎn)的代碼,并不比你手寫的差。
我問(wèn)他,那還有手寫的嗎?他說(shuō)有,但是更多是為了產(chǎn)生更好的編譯錯(cuò)誤提示等等。
對(duì)于C/C++程序員,就是看Lex和Yacc,要在Windows上面玩,可以baidu flex和bison?!?/span>flex是fast lex,不是flash開(kāi)發(fā)RIA那個(gè)Flex】
對(duì)于Java程序員,可以研究ANTLR。。。ANTLR現(xiàn)在是強(qiáng)中強(qiáng)了,JVM上面有一半的腳本語(yǔ)言,都是用ANTLR作為Lex處理工具的。
2. 這門課嚴(yán)重的枯燥,且基本不實(shí)用。。。想學(xué)下去很難,除非給自己一個(gè)目標(biāo)。
至少是一個(gè)簡(jiǎn)單的目標(biāo),
至少要手寫一個(gè)詞法分析程序。。。簡(jiǎn)單的如Python,C,Java。。。復(fù)雜的像Ruby的詞法。
更簡(jiǎn)單的是SQL,都可以試著手寫一下Lex去解析它們。。。
我不會(huì)正則表達(dá)式,每用到都是現(xiàn)查的。。。但是你做過(guò)一次這個(gè)詞法分析后,就發(fā)現(xiàn)正則挺沒(méi)勁了。
3. Parser是第二步。
有了Lexer,下面就是Parser了。。。
這個(gè)時(shí)候,你也可以手寫,也可以使用工具了。。。
建議你看看ANTLR生成的代碼,非常容易懂,通篇都是大白話,在Eclipse的幫助下,你可以很快了解一個(gè)Lexer和Parser都干了什么。。。當(dāng)你了解這一點(diǎn)的時(shí)候,你手寫Parser的日子就不遠(yuǎn)了。
只是這個(gè)時(shí)候,你有興趣寫一個(gè)真正的小腳本嗎?
4. 優(yōu)化都是后話,我基本沒(méi)看呢。。。其實(shí)學(xué)習(xí)龍書的整個(gè)過(guò)程,好多介紹的內(nèi)容,在你實(shí)際寫一個(gè)小解釋器的過(guò)程中,都是很不適用的,因?yàn)橹v的太不接近實(shí)踐了。
有一本書,叫做《游戲腳本編程》?好像是,也可以看看。。。淺顯很多。。。
我學(xué)這些東西的時(shí)候,是好幾本書一起看的,這個(gè)地方看不懂了,就換本看。很多地方也是一知半解的。
先說(shuō)這么多。。。再聊。。。
~~~~~~~~~~~
合理規(guī)劃一下,你以后用不太上的東西,別太勉強(qiáng)。
~~~~~~~~~~~~~
我們項(xiàng)目組目前就在做一個(gè)編譯器,之前我也看了一段時(shí)間的紫龍書(龍書 第三版),個(gè)人覺(jué)得可以針對(duì)性的看,例如我們現(xiàn)在只做詞法分析,所以我就看了第二,三兩章,你用到什么就看什么這樣就不會(huì)覺(jué)得看的枯燥了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
編譯原理是計(jì)算機(jī)專業(yè)的一門重要專業(yè)課,旨在介紹編譯程序構(gòu)造的一般原理和基本方法。內(nèi)容包括語(yǔ)言和文法、詞法分析、語(yǔ)法分析、語(yǔ)法制導(dǎo)翻譯、中間代碼生成、存儲(chǔ)管理、代碼優(yōu)化和目標(biāo)代碼生成。
編譯原理是計(jì)算機(jī)專業(yè)設(shè)置的一門重要的專業(yè)課程。雖然只有少數(shù)人從事編譯方面的工作,但是這門課在理論、技術(shù)、方法上都對(duì)學(xué)生提供了系統(tǒng)而有效的訓(xùn)練,有利于提高軟件人員的素質(zhì)和能力。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
編譯原理是計(jì)算機(jī)科學(xué)與技術(shù)中一個(gè)非常成熟的分支,非常完美地將原理與技術(shù)結(jié)合了起來(lái),對(duì)于理解計(jì)算機(jī)的本質(zhì)非常有幫助
編譯原理的很多設(shè)計(jì)思想可以在你設(shè)計(jì)的程序中運(yùn)用
比如你想寫個(gè)程序?qū)τ谀硞€(gè)文本作詞法分析和語(yǔ)法分析的處理,那么編譯原理的知識(shí)完全可以幫助你來(lái)完成它
又或者你也可能寫個(gè)能自動(dòng)生成菜單或者界面的程序,你需要自定義一個(gè)非常簡(jiǎn)單的腳本語(yǔ)言并解析它,編譯原理也可以幫助你做到這一點(diǎn)
總之,編譯原理應(yīng)用的領(lǐng)域十分廣泛,不要以為學(xué)編譯原理就僅僅是用來(lái)做編譯器的
另外,編譯原理包含了很多巧妙的設(shè)計(jì)構(gòu)思,作為一名CS的學(xué)生,當(dāng)然是很有必要來(lái)學(xué)習(xí)它的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
學(xué)編譯可不一定是讓你去寫編譯器
編譯原理很多時(shí)候會(huì)直接影響你對(duì)計(jì)算機(jī)的認(rèn)識(shí)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
個(gè)人認(rèn)為學(xué)習(xí)編譯原理及其他基礎(chǔ)課程,其中一項(xiàng)意義,
就是要追隨先賢們的思想軌跡,學(xué)習(xí)他們的思考方法,
了解他們是如何推導(dǎo)和發(fā)現(xiàn)問(wèn)題和解決方法,
當(dāng)自己碰到問(wèn)題時(shí),進(jìn)行創(chuàng)新性的思考。
具體到編譯原理,的確大部分人不需要開(kāi)發(fā)編譯器,
但是了解程序的編譯過(guò)程,對(duì)于自己寫代碼調(diào)試bug很有好處,
通過(guò)換位思考,想象一下編譯器如何處理我們寫的代碼,
從而改進(jìn)自己的代碼,對(duì)于代碼和語(yǔ)法的理解也能加深。
在解決其他復(fù)雜的問(wèn)題時(shí),也可以借鑒編譯原理的思想,
不一定是編譯程序具體的實(shí)現(xiàn)模式,而是解決編譯問(wèn)題時(shí)的思考方法。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
當(dāng)你專心學(xué)基礎(chǔ)的時(shí)候你又會(huì)被社會(huì)坑了,社會(huì)招聘要求會(huì)這會(huì)那,出去就要求做過(guò)多少東西,寫多多少行代碼,多vc,java多熟悉,一個(gè)人大學(xué)四年有這么時(shí)間么?到頭來(lái)都是死代碼,漸漸成了IT民工,浮躁的原因來(lái)源于社會(huì)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
編譯原理一般認(rèn)為是較難的一門課.從網(wǎng)上的評(píng)論來(lái)看,有人說(shuō)學(xué)了一年半軟件理論,就一門編譯看不懂;有人甚至說(shuō)它是大本軟件課程里最難的一門;有人抱怨國(guó)內(nèi)的編譯教材沒(méi)有一本容易懂的。 從筆者學(xué)習(xí)實(shí)踐來(lái)看,第一次學(xué)了一個(gè)多月,理論部分一知半解,第二次學(xué)了一星期,基本看懂詞法分析的理論部分,語(yǔ)法分析就一知半解了,第三次學(xué)了一星期,才基本看懂詞法分析和語(yǔ)法分析.由此看來(lái),這門課確實(shí)有難度.網(wǎng)上有的帖子,把編譯器的編寫搞得高深莫測(cè)一般,似乎難度極大,非常人能及. 編譯原理究竟難在哪里?筆者的體會(huì),主要在這幾點(diǎn): 1.錯(cuò)誤認(rèn)識(shí): 很多人以為編譯原理只能應(yīng)用在寫程序語(yǔ)言的編譯器上,覺(jué)得用處不大,學(xué)習(xí)興趣不高.而且可能覺(jué)得寫編譯器就必須完全手工來(lái)寫. 2.自動(dòng)機(jī)理論: 象NFA,DFA之類,比較抽象,要費(fèi)些腦子,特別如果學(xué)離散數(shù)學(xué)時(shí)沒(méi)有學(xué)自動(dòng)機(jī)理論的話,更是需要多花點(diǎn)時(shí)間. 3.集合論的推演: 主要是一些閉包運(yùn)算之類,數(shù)學(xué)基礎(chǔ)不好的話,學(xué)起來(lái)也會(huì)感到吃力. 4.LR文法: 主要是又引入了自動(dòng)機(jī) 不管哪本編譯教材,即使是絕對(duì)經(jīng)典”龍書”也不例外,都要涉及到這幾個(gè)難點(diǎn).由于這些內(nèi)容本身不好懂,作者有再大的本事,也很難把書寫得象小說(shuō)那么流暢好懂. 明確了難點(diǎn),接著想對(duì)策.大致有這么幾種: 1.端正認(rèn)識(shí): 編譯原理在靜態(tài)文本處理上有廣泛的應(yīng)用,舉個(gè)簡(jiǎn)單的例子,把HTML文件轉(zhuǎn)化為純文本,利用編譯原理來(lái)實(shí)現(xiàn)”非常”簡(jiǎn)單.理解了編譯原理的實(shí)用性,大概可以提高學(xué)習(xí)興趣. 2.反復(fù)看書: 這個(gè)辦法看起來(lái)最笨,卻是基本的方法.忘了是哪位名人說(shuō)過(guò),書只要多看,總能看得懂的. 3.結(jié)合源碼來(lái)看: 這是經(jīng)典教材Compiler Design in C的作者Allen Hollub建議的方法.這本教材的特色就是包含了大段yacc,lex的代碼.這也是個(gè)好方法,而且,只有看懂了代碼,才能說(shuō)在根本上理解了理論.當(dāng)然,要完全看懂yacc的代碼,工作量是很大的,而且同樣要先理解理論. 4.刪繁就簡(jiǎn),避重就輕.網(wǎng)上流傳較廣的一篇《編譯原理學(xué)習(xí)導(dǎo)論》(作者四川大學(xué)唐良)就基本是這種思路,對(duì)于詞法分析,作者避免了自動(dòng)機(jī)理論和集合論推演的介紹,直接搬出源碼來(lái),大大降低了理解難度,對(duì)于語(yǔ)法分析,作者介紹了遞歸下降和LL文法及相應(yīng)的源碼,而對(duì)LR文法,只說(shuō)”理解理論就可以了”.雖然這種方法回避了對(duì)于難點(diǎn)的學(xué)習(xí),但是用這種方法學(xué)習(xí),可以在較短時(shí)間內(nèi)編寫出一個(gè)能夠運(yùn)行的詞法分析器和語(yǔ)法分析器,可以大大提高學(xué)習(xí)積極性.
筆者的思路大體上類似第4種方法,但也稍有不同.由于一個(gè)偶然的原因,筆者需要編寫一個(gè)詞法分析器和語(yǔ)法分析器,用于程序源代碼的靜態(tài)分析.開(kāi)始無(wú)從下手,硬著頭皮看了點(diǎn)編譯原理,覺(jué)得困難很大.后來(lái)偶然找到一個(gè)類似的開(kāi)源程序,是利用一個(gè)叫做PCCTS的編譯器自動(dòng)生成工具開(kāi)發(fā)的,大受啟發(fā).開(kāi)源就是好!筆者找來(lái)了一個(gè)叫做ANTLR的工具(它是PCCTS的新版,支持生成java,c++和c#代碼),又下載了一個(gè)c語(yǔ)言的語(yǔ)法文件(因?yàn)楣P者需要處理c代碼文件),然后自己編了少量動(dòng)作(action)語(yǔ)句,界面代碼,分析處理代碼等,就這樣,在對(duì)編譯原理所知甚少(以前學(xué)過(guò)的因?yàn)槔斫獠簧疃纪?/span>,只記得正則表達(dá)式)的情況下,僅用一個(gè)星期就寫出了程序. 這次實(shí)踐使筆者對(duì)編譯原理興趣大增,重新又學(xué)了一遍編譯原理,并歸納出筆者認(rèn)為比較實(shí)用有效的編譯原理學(xué)習(xí)步驟: 1.先利用ANTLR之類的編譯器生成工具,做一個(gè)小程序(如上面提到的HTML文件轉(zhuǎn)化成純文本文件的程序),所需知識(shí)只是正則表達(dá)式的基本知識(shí)和生成工具本身的使用方法(可以看聯(lián)機(jī)幫助和網(wǎng)上教程(tutorial)來(lái)掌握).這樣做的好處是: 1)可以體會(huì)到編譯原理的實(shí)用性,提高學(xué)習(xí)興趣 2)入門容易,消除編譯原理學(xué)習(xí)的畏難情緒. 3)獲得詞法分析器和語(yǔ)法分析器的感性認(rèn)識(shí),有利于加深對(duì)理論的理解. 4)獲得編譯器自動(dòng)生成工具(compilercompiler)的使用經(jīng)驗(yàn),提高解決實(shí)際問(wèn)題的能力.(實(shí)際工作很多都不是手編而是利用工具的) 2.象ANTLR之類的工具是開(kāi)源(opensource)的,可研究其源碼,以便必要時(shí)自己手編分析程序. 3.回過(guò)頭來(lái)看編譯原理教材.這時(shí)大概會(huì)發(fā)現(xiàn),很多理論很容易懂,剩下的只有上面說(shuō)的幾個(gè)難點(diǎn),多看幾遍,重點(diǎn)突破. 4.結(jié)合教材所附源碼,進(jìn)一步加深對(duì)教材的理解 這里順便提一下,有的編譯原理的教材,對(duì)于輸入子系統(tǒng)不單立一章來(lái)講,有的甚至完全忽略,筆者認(rèn)為,輸入子系統(tǒng)相對(duì)于詞法分析器和語(yǔ)法分析器來(lái)說(shuō)當(dāng)然簡(jiǎn)單地多,但也是兩者的基礎(chǔ),故有必要看源碼來(lái)理解.在這方面,ANTLR的實(shí)現(xiàn)機(jī)制和Lex是不同的(當(dāng)然和java與c的差異有關(guān)),可對(duì)照著看. 筆者學(xué)習(xí)VC++時(shí),深切體會(huì)到好教材的重要.筆者開(kāi)始吃了劣質(zhì)光盤版”教材”和”21天學(xué)VC++”的禍害,看了一個(gè)月還如入云霧之中,后來(lái)看了《VC++技術(shù)內(nèi)幕》,方才豁然開(kāi)朗.但是編譯原理的教材卻似乎質(zhì)量相差不是特別大,關(guān)鍵還在于合適的方法.以上方法筆者也是誤打誤撞總結(jié)出來(lái)的,希望有所參考價(jià)值.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
原文來(lái)源:http://topic.csdn.net/u/20100104/14/64712eab-e5c1-419b-99dc-4d90f001fb89.html
聯(lián)系客服