編譯原理天書一樣難懂
① 有沒有比龍書通俗易懂的編譯原理書籍
大學課程為什麼要開設編譯原理呢?這門課程關注的是編譯器方面的產生原理和技術問題,似乎和計算機的基礎領域不沾邊,可是編譯原理卻一直作為大學本科的必修課程,同時也成為了研究生入學考試的必考內容。編譯原理及技術從本質上來講就是一個演算法問題而已,當然由於這個問題十分復雜,其解決演算法也相對復雜。我們學的數據結構與演算法分析也是講演算法的,不過講的基礎演算法,換句話說講的是演算法導論,而編譯原理這門課程講的就是比較專註解決一種的演算法了。在20世紀50年代,編譯器的編寫一直被認為是十分困難的事情,第一Fortran的編譯器據說花了18年的時間才完成。在人們嘗試編寫編譯器的同時,誕生了許多跟編譯相關的理論和技術,而這些理論和技術比一個實際的編譯器本身價值更大。就猶如數學家們在解決著名的哥德巴赫猜想一樣,雖然沒有最終解決問題,但是其間誕生不少名著的相關數論。
推薦參考書
雖然編譯理論發展到今天,已經有了比較成熟的部分,但是作為一個大學生來說,要自己寫出一個像TurbocC,java那樣的編譯器來說還是太難了。不僅寫編譯器困難,學習編譯原理這門課程也比較困難。
第一本書的原名叫《CompilersPrinciples,Techniques,andTools》,另外一個響亮的名字就是龍書。原因是這本書的封面上有條紅色的龍,也因為獗臼樵詒嘁朐?砘?嘴域確實?忻?所以很多國外的學者都直接取名為龍書。最近機械工業出版社已經出版了此書的中文版,名字就叫《編譯原理》。該書出的比較早,大概是在85或86年編寫完成的,作者之一還是著名的貝爾實驗室的科學家。裡面講解的核心編譯原理至今都沒有變過,所以一直到今天,它的價值都非凡。這本書最大的特點就是一開始就通過一個實際的小例子,把編譯原理的大致內容羅列出來,讓很多編譯原理的初學者很快心裡有了個底,也知道為什麼會有這些理論,怎麼運用這些理論。而這一點是我感覺國內的教材缺乏的東西,所以國內的教材都不是寫給願意自學的讀者,總之讓人看了半天,卻不知道裡面的東西有什麼用。
第二本書的原名叫《ModernCompilerDesign》,中文名字叫做《現代編譯程序設計》。該書由人民郵電出版社所出。此書比較關注的是編譯原理的實踐,書中給出了不少的實際程序代碼,還有很多實際的編譯技術問題等等。此書另外一個特點就是其現代而字。在傳統的編譯原理教材中,你是不可能看到如同Java中的垃圾回收等演算法的。因為Java這樣的解釋執行語言是在近幾年才流行起來的東西。如果你想深入學習編譯原理的理論知識,那麼你肯定得看前面那本龍書,如果你想自己動手做一個先進的編譯器,那麼你得看這本《現代編譯程序設計》。
第三本書就是很多國內的編譯原理學者都推薦的那本《編譯原理及實踐》。或許是這本書引入國內比較早吧,我記得我是在高中就買了這本書,不過也是在前段時間才把整本書看完。此書作為入門教程也的確是個不錯的選擇。書中給出的編譯原理講解也相當細致,雖然不如前面的龍書那麼深入,但是很多地方都是點到為止,作為大學本科教學已經是十分深入了。該書的特點就是注重實踐,不過感覺還不如前面那本《現代編譯程序設計》的實踐味道更重。此書的重點還是在原理上的實踐,而非前面那本那樣的技術實踐。《編譯原理及實踐》在講解編譯原理的各個部分的同時,也在逐步實踐一個現代的編譯器TinyC.等你把整本書看完,差不多自己也可以寫一個TinyC了。作者還對Lex和Yacc這兩個常用的編譯相關的工具進行了很詳細的說明,這一點也是很難在國內的教材中看到的。
推薦了這三本教材,都有英文版和中文版的。很多英文好的同學只喜歡看原版的書,不我的感覺是這三本書的翻譯都很不錯,沒有必要特別去買英文版的。理解理論的實質比理解表面的文字更為重要。
編譯原理的實質
幾乎每本編譯原理的教材都是分成詞法分析,語法分析(LL演算法,遞歸下降演算法,LR演算法),語義分析,運行時環境,中間代碼,代碼生成,代碼優化這些部分。其實現在很多編譯原理的教材都是按照85,86出版的那本龍書來安排教學內容的,所以那本龍書的內容格式幾乎成了現在編譯原理教材的定式,包括國內的教材也是如此。一般來說,大學裡面的本科教學是不可能把上面的所有部分都認真講完的,而是比較偏重於前面幾個部分。像代碼優化那部分東西,就像個無底洞一樣,如果要認真講,就是單獨開一個學期的課也不可能講得清楚。所以,一般對於本科生,對詞法分析和語法分析掌握要求就相對要高一點了。
詞法分析相對來說比較簡單。可能是詞法分析程序本身實現起來很簡單吧,很多沒有學過編譯原理的人也同樣可以寫出各種各樣的詞法分析程序。不過編譯原理在講解詞法分析的時候,重點把正則表達式和自動機原理加了進來,然後以一種十分標準的方式來講解詞法分析程序的產生。這樣的做法道理很明顯,就是要讓詞法分析從程序上升到理論的地步。
語法分析部分就比較麻煩一點了。現在一般有兩種語法分析演算法,LL自頂向下演算法和LR自底向上演算法。LL演算法還好說,到了LR演算法的時候,困難就來了。很多自學編譯原理的都是遇到LR演算法的理解成問題後就放棄了自學。其實這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫出來才算真正的會。像LR演算法的語法分析器,一般都是用工具Yacc來生成,實踐中完全沒有比較自己來實現。對於LL演算法中特殊的遞歸下降演算法,因為其實踐十分簡單,那麼就應該要求每個學生都能自己寫。當然,現在也有不少好的LL演算法的語法分析器,不過要是換在非C平台,比如Java,Delphi,你不能運用YACC工具了,那麼你就只有自己來寫語法分析器。
等學到詞法分析和語法分析時候,你可能會出現這樣的疑問:詞法分析和語法分析到底有什麼?就從編譯器的角度來講,編譯器需要把程序員寫的源程序轉換成一種方便處理的數據結構(抽象語法樹或語法樹),那麼這個轉換的過程就是通過詞法分析和語法分析的。其實詞法分析並非一開始就被列入編譯器的必備部分,只是我們為了簡化語法分析的過程,就把詞法分析這種繁瑣的工作單獨提取出來,就成了現在的詞法分析部分。除了編譯器部分,在其它地方,詞法分析和語法分析也是有用的。比如我們在DOS,Unix,linux下輸入命令的時候,程序如何分析你輸入的命令形式,這也是簡單的應用。總之,這兩部分的工作就是把不規則的文本信息轉換成一種比較好分析好處理的數據結構。那麼為什麼編譯原理的教程都最終把要分析的源分析轉換成樹這種數據結構呢?數據結構中有Stack,Line,List這么多數據結構,各自都有各自的特點。但是Tree這種結構有很強的遞歸性,也就是說我們可以把Tree的任何結點Node提取出來後,它依舊是一顆完整的Tree。這一點符合我們現在編譯原理分析的形式語言,比如我們在函數裡面使用函樹,循環中使用循環,條件中使用條件等等,那麼就可以很直觀地表示在Tree這種數據結構上。同樣,我們在執行形式語言的程序的時候也是如此的遞歸性。在編譯原理後面的代碼生成的部分,就會介紹一種堆棧式的中間代碼,我們可以根據分析出來的抽象語法樹,很容易,很機械地運用遞歸遍歷抽象語法樹就可以生成這種指令代碼。而這種代碼其實也被廣泛運用在其它的解釋型語言中。像現在流行的Java,.NET,其底層的位元組碼bytecode,可以說就是這中基於堆棧的指令代碼的。
關於語義分析,語法制導翻譯,類型檢查等等部分,其實都是一種完善前面得到的抽象語法樹的過程。比如說,我們寫c語言程序的時候,都知道,如果把一個浮點數直接賦值給一個整數,就會出現類型不匹配,那麼C語言的編譯器是怎麼知道的呢?就是通過這一步的類型檢查。像C++語言這中支持多態函數的語言,這部分要處理的問題就更多更復雜了。大部編譯原理的教材在這部分都是講解一些比較好的處理策略而已。因為新的問題總是在發生,舊的辦法不見得足夠解決。
本來說,作為一個編譯器,起作用的部分就是用戶輸入的源程序到最終的代碼生成。但是在講解最終代碼生成的時候,又不得不講解機器運行環境等內容。因為如果你不知道機器是怎麼執行最終代碼的,那麼你當然無法知道如何生成合適的最終代碼。這部分內容我自我感覺其意義甚至超過了編譯原理本身。因為它會把一個計算機的程序的運行過程都通通排在你面前,你將來可能不會從事編譯器的開發工作,但是只要是和計算機軟體開發相關的領域,都會涉及到程序的執行過程。運行時環境的講解會讓你更清楚一個計算機程序是怎麼存儲,怎麼裝載,怎麼執行的。關於部分的內容,我強烈建議大家看看龍書上的講解,作者從最基本的存儲組織,存儲分配策略,非局部名字的訪問,參數傳遞,符號表到動態存儲分配(malloc,new)都作了十分詳細的說明。這些東西都是我們編寫平常程序的時候經常要做的事情,但是我們卻少去探求其內部是如何完成。
關於中間代碼生成,代碼生成,代碼優化部分的內容就實在不好說了。國內很多教材到了這部分都會很簡單地走馬觀花講過去,學生聽了也只是作為了解,不知道如何運用。不過這部分內容的東西如果要認真講,單獨開一學期的課程都講不完。在《編譯原理及實踐》的書上,對於這部分的講解就恰到好處。作者主要講解的還是一種以堆棧為基礎的指令代碼,十分通俗易懂,讓人看了後,很容易模仿,自己下來後就可以寫自己的代碼生成。當然,對於其它代碼生成技術,代碼優化技術的講解就十分簡單了。如果要仔細研究代碼生成技術,其實另外還有本叫做《》,那本書現在由機械工業出版社引進的,十分厚重,而且是英文原版。不過這本書我沒有把它列為推薦書給大家,畢竟能把龍書的內容搞清楚,在中國已經就算很不錯的高手了,到那個時候再看這本《》也不遲。代碼優化部分在大學本科教學中還是一個不太重要的部分,就是算是實踐過程中,相信大家也不太運用得到。畢竟,自己做的編譯器能正確生成執行代碼已經很不錯了,還談什麼優化呢?
編譯原理的課程畢竟還只是講解原理的課程,不是專門的編譯技術課程。這兩門課程是有很大的區別的。編譯技術更關注實際的編寫編譯器過程中運用到的技術,而原理的課
② 《編譯原理》猶如天書,怎麼學
話說編譯原理這種東西除了天才和真正潛心做學問的人,有人學懂過么?
要通過考試的話,自己照著書上的例子做個小的詞法分析跟語法分析的玩具玩玩就好了(可以報編譯錯誤的那種 ),語義分析別想了
還有本書叫《深入java虛擬機》,可以參考著看一下,看解釋型語言和編譯型語言的區別
③ 天書是什麼意思
1.帝王的詔書。 唐 王勃 《為原州趙長史請為亡父度人表》:「天書屢降,手勅仍存。」 宋 王安石 《送孫叔康赴御史府》詩:「天書下東南,趣召赴嚴闕。」 清 周亮工 《宋去損以予累客死都門哭送四詩兼貽令嗣峩長》之一:「 嶺 外天書一夜頒, 河 干令子泣潸潸。」
2.道家稱 元始天尊 所說之經,或託言天神所賜之書。《隋書·經籍志四》:「﹝ 元始天尊 所說之經﹞凡八字,盡道體之奧,謂之天書。字方一丈,八角垂芒,光輝照耀,驚心眩目,雖諸天仙,不能省視。」《宋史·真宗紀二》:「 大中祥符 元年春正月乙丑,有黃帛曳 左承天門 南鴟尾上……上召群臣拜迎於 朝元殿 ,啟封,號稱天書。」《水滸傳》第四二回:「娘娘法旨道:『 宋星主 ,傳汝三卷天書,汝可替天行道。』」 清 阮元 《小滄浪筆談·封泰山論》:「 秦始皇 、 漢武帝 之求長生, 光武帝 之用讖緯, 宋真宗 之得天書,皆以邪道壞古禮。」
3.比喻難認的文字或難懂的文章。《紅樓夢》第八六回:「﹝ 寳玉 ﹞看著又奇怪,又納悶,便說:『妹妹近日越發進了,看起天書來了!』」 瞿秋白 《「打倒帝國主義」的古典》:「彷佛嫌它太歐化,比天書還難懂。」
④ C語言程序設計看不懂
條條大路通羅馬,下面只是我的個人觀點,僅供參考。
我覺得安大計算機系的學生四年的學習計劃如下:
Y1: 學好高等數學,線代,概率;數理邏輯(可惜安大不單獨開),離散數學,不要說
這些東西沒用,說實在的,你比世傑電腦學校的學生就多知道這些。沒用是因為你
現在的檔次太低,現在」還不配「用;到時候你就發現,即使你這些課門門100,還得
大大加深這些課的內容。
學好一門語言,建議是C++(原因是它足夠難,否則怎麼對別人說你是CS呢?
java也是一個選擇,不過建議暫時不要受J2EE的誘惑),請把C++的書至少讀3 遍, C++比你想像的功能要多得多(結構化,OOP,泛型);
多寫程序,在這一年結束時,寫一個1000行左右的程序(用VC,可以作個CONSOLE APPLICATION)。這時你覺得你得看看數據結構什麼的了
Y2:
這一年最重要的是學好數據結構。天知道,為什麼數據結構課程放在大二下上,這樣作
的後果是你又遲了一年成為專業人士。自己看,當別人在大三上數據結構時,你已可以在總結一些經典演算法了(原來解決8皇後問題,我們用回朔方法;解決最長公共子序列問題,我們用動態規劃;huffman編碼我們用的是貪婪演算法.......)
這里還得談談VC,相信你對C++語言應該比較熟悉了,這一年VC也該有所進步。用MFC
就可以了。不只一個人跟我說VC難,我認為這得看你的基礎了,有C++的基礎,
多態,繼承.....,有sdk的基礎,知道一點就可以,為的是更好地理解MFC,有操作系統的基礎,進程,線程,消息傳遞......,唉,不過MFC被淘汰也就
是這幾年的問題了,沒關系,就當技術積累,影響不大。)
這一年下來你覺得你可以解決很多問題了,那就寫一個大點的軟體吧(2000行以上)。
程序規模大了以後,你會覺得分析很重要了,這樣你在看軟體工程方面的書時就
有所體會了。
Y3:在這一年實際上是關鍵的,你得問問自己,是對計算機科學,還是計算機工程更敢
興趣,盡管並不矛盾,但你得有所側重。
實際上,這一年你才真正進入計算機專業領域。資料庫,編譯原理,操作系統,想必
你也是如雷貫耳的了。我不知道為什麼這么重要的課程為什麼安大每們課只安排了一個學
期,而且編譯原理的實踐課程實際上只有幾個人真實的自己寫了程序。只有靠自己了。
我覺得OS應該以linux為例,資料太多了,而且社會上需求很大。
編譯原理,號稱計算機系最難的課程,其實,安大的編譯原理課程最難的部分還沒上呢
上的是屬於比較簡單的部分,當然也是最有用的部分(科大課件稱他們的編譯原理課
程要做到國內領先 。),作個pascal或c子集的編譯器,譯成中間語言就可以了或者
自己設計一套語言,這要看你的興趣了。
資料庫課程重要的是你得學會設計資料庫。這一年下來,你覺得你真的能作很多事了(事實上,你的確有了作很多事的基礎了)
Y4:
網路課程被安排在大四上,不知道還有沒有人有心思上,疑問?盡管很重要。實際
上如果你對網路感興趣的話,完全可以自己在大二,大三看看,學習一些網路方面的
東西,asp,jsp(要java基礎),基於winsock的編程,甚至是linux下的網路編程。
正如你看到的,大學四年還真是緊。忘了,還有軟體工程,不過那門課你知道
有就行了,因為上課的內容完全過時,且太理論!
其實不要希望四年能學會多少東西,即使你很用心,離需求也有差距,畢竟這一
行發展太快,不用浮躁,大好基礎。經過四年的學習,你可以對自己說,我已經進入
了計算機科學的大門,我比別人(非計算機專業)會更好更快的掌握計算機的新知識, 足矣!
大部分人是到了研究生階段點感嘆數學的重要(高等數學,離散學習)。
⑤ 是不是真有天書,你讀過最難懂的書是什麼
中華文化歷史悠久,在我國歷史上有很多的文化著作留下來,比如我們大多人都知道的《大學》《論語》《春秋》《周易》等等。根據古代歷史典籍記載,在我國歷史上有一本書從漢代開始就開始研究。到現在也沒有讀懂。所以後人將這本稱為天書。
這本書沒有人能夠讀懂的原因是因為他是用古雅語寫的,這種語言形式在春秋戰國時期已經流傳了。這也是孟子遍讀天下古籍,唯獨看不懂這本書的原因。裡面的文字和現在的漢字以及甲骨文都有顯著的區別。在當時這種文字也用了將近兩千年,後來也不知道因為什麼原因就消失了。因此這本書就成為了天下第一難懂之書。所以說後人就把《虞夏書》這本書稱為天書。
⑥ 【求助】編譯原理就像天書
找最近的學校的計算機老師問,或者周圍計算機系同學,問過一下收益匪淺的。編譯原理技巧性很強,書上的方法通常不是最好的。還有建議你的是一切以最終的歷年復試試卷為准,不要太浪費時間[qq:13]
⑦ 我是計算機專業的 大一剛開課程 聽C語言和聽天書一樣 老師提問的很簡單的問題都不會說 上課就像煎熬
C語言是比較晦澀難懂的。我大一的時候也是C語言,剛開始還好,後來因為生病幾節課沒上,就再也沒跟上了,不過後來證明然並卵。我大學幾年都是混過去的,最後校招到現在的公司實習培訓時,努力學了幾個月Java後來有個機會轉.net了,做到現在快兩年了,已經是項目中的主力開發了。說了那麼多,只想表明一句話「世上無難事,只怕有心人」,當你真正想去做好的時候,你自己就會自動去找各種辦法解決,當你只是為了敷衍了事時,再簡單的東西也會搞砸。
⑧ 學習c語言需要什麼基礎嗎 我現在買了本c語言的書,但是一點都看不懂,就像看天書一樣的,
首先:C語言入門相對比較簡單,但如果想成為一個優秀的C程序員,需要很艱苦的訓練,多讀代碼,多練習,多上機操作,多思考,學習是一件辛苦的事情,要放棄很多東西,要堅持下來才可以,可以說C語言是基礎,將來想學其他的C++,JAVA等,如果有C的基礎,還是比較好入門的.
C語言的用處比較廣泛,可以說任何精通計算機的人都掌握C語言了,我是本科計算機專業的,C被作為許多課程的先行課,沒有了C語言基礎,就不能學習數據結構,操作系統,編譯原理,計算機網路等核心課程,所以說,想學習計算機的話無論想在哪個方向發展(軟體,硬體,網路,應用,開發,設計等方向)都必須掌握C語言.
C Traps And Pitfalls 推薦讀,不過要有一定基礎。
如果你剛開始的話推薦C Primer Plus或者C In A Nutshell。
去書店買那種翻譯版的書,紅色皮的那種. 原著國外的.
如果可以直接看那種英文原版的(畢竟翻譯過來的有些詫異).
<21天學通C語言>(第六版)
Bradley L. Jones, Peler Aitken 著.
信達工作室 譯.
人民郵電出版社
這本書對初學者很好, 如果有點基礎那就更好了.
建議選擇譚浩強譚老師的書,簡單易學,理論與實踐結合的很好,而且如果能認真學的話,你會發現你的C語言基礎非常的實。
也不是說其他的書不好,但是有些書只是為了讓讀者入門,沒有前途呀。
先讀譚浩強的《C語言程序設計》,這是公認的中文入門級教材。但是書中的代碼風格不敢恭維。看完這本,推薦《21天學通C語言》,這本書比較好,個人感覺。看完這兩本,你就可以進階C++了。
C語言只要把基礎打好就好,你要是想精通的話,最好是精通C++,這樣比較有前途。但不要操之過急。
以下一段話是我給另一位初學編程的朋友建議的學習軌跡,你可以參考以下:
學習編程語言貴精不貴多,而且要循序漸進、有張有馳。
初學語言時,基本上都是從C語言入手。
一本譚浩強老師的《C語言程序設計》足夠。
不過在學習過程中請注意不要學習他老人家的編程風格!我不知道現在改版了沒有,反正我當年學這本書的時候,上面的代碼風格讓我極其崩潰。
良好的C語言代碼風格,可以參閱《21天學通C語言》等。
學C最多也就半年,感覺差不多了,做一個像樣的小項目,檢驗一下自己即可。然後就應該步入C++中。C++是一門值得深入研究的語言,仔細學進去你會發現它嗷嗷強大。其中也有許多經典的設計思想。入門級書籍推薦《C++大學自學教程》講的比較透徹,但很厚。進階級推薦《C++語言深入研究》等,就比較深奧了。高手級推薦《C++大師的沉思》等國外名著,講的很暈,呵呵。
Java是一定要學的,但如果不想在這方面發展,可以不學得那麼累。Java是發展最迅猛的語言之一,其技術更新之快,遠勝於我們學習的速度。學習Java的重點要放在學習她的思想上。學習面向對象思想,以及建築在其上的各種框架和架構的思想。學精C++之後再學Java,語法部分10天足夠,但思想部分就看你的悟性了。
追加建議:學過C++、Java之後,再回頭重溫C語言,研究一下用C語言如何實現面向對象的四大特性(抽象、封裝、繼承和多態)。這時你就會發現,哦,之前顯得如此神秘的東西原來是這樣的啊……
當以上三門語言你都經歷了一遍之後,就可以選擇自己所要進一步深造的方向了。那時候你已經心裡有數。而且這時的你學習任何一門其他程序設計語言都是手到擒來易如反掌。這就是基礎的作用。
<編程珠璣>-中國電力出版社
<程序設計實踐>-機械工程出版社
<實用c語言編程>-O'Rerly出版
<演算法導論>