編譯原理入門圖解
Ⅰ 為什麼要學習編譯原理(轉)
大學課程為什麼要開設編譯原理呢?這門課程關注的是編譯器方面的產生原理和技術問題,似乎和計算機的基礎領域不沾邊,可是編譯原理卻一直作為大學本科的必修課程,同時也成為了研究生入學考試的必考內容。編譯原理及技術從本質上來講就是一個演算法問題而已,當然由於這個問題十分復雜,其解決演算法也相對復雜。我們學的數據結構與演算法分析也是講演算法的,不過講的基礎演算法,換句話說講的是演算法導論,而編譯原理這門課程講的就是比較專註解決一種的演算法了。在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、C++、python、php、C等,需要確定方向,從基礎學起,建議零基礎學編程的小夥伴從C語言開始學起,C語言入門比較簡單,會提升自信心。
二:自學編程入門一定要階段性的看到成果,這個「成果」並不是在「黑匣子」裡面實現,要在用戶展現界面呈現,很容易提升信心。

三:視頻和圖書同步查閱,網上的是魚龍混珠,建議找一些免費的學編程入門的初級視頻進行學習,最好是成套視頻,如果條件允許也可以購買一套編程入門的視頻資料。
四:計算機編程入門一定要理論和實踐相結合只有這樣才能真正學好
五:如果你有會編程的好朋友,多請教請教他,能讓他帶帶你就是最好不過的了。
Ⅲ 零基礎想入門編程需要先學什麼
零基礎想入門編程需要先學什麼
零基礎想入門編程需要先學數學、英語,在數學和英語基礎上學計算機基礎操作,會計算機操作之後,再學編程。
可以先學 Pascal。 Pascal 是一門很好的教學語言。然後對過程式編程有些了解以後可以學習數據結構,C 和 C++。 然後可以學一下 Java 或 C#。 當然我的建議只是幫助你能夠了解過程式和面向對象的編程。至於要進入IT業,方向和門類很多,所以學什麼更好不能一概而論。
如果希望能夠進入計算機系,拿一個「科班出身」的學位,從Pascal學起不錯,可以把Structured programming的基礎打好。但是大部分人,從Visusal Basic學起更能夠速成,並增加自信。
大計算機科學的底子:c ,c++,離散數學,數據結構,資料庫,軟體工程,(可參考MIT Open Courseware)。業余者自修:Visual Basic, Scripting,Frontpage, Flash。
C++是C的延伸,所以兩者有很大的重疊部分,分不清很正常。我覺得C是基礎。用C能夠熟練地寫程序以後,再逐漸接觸C++的程序設計理念可能更好一些。
「學習一門語言的最好方法是用它來編程序」。
最後,不能只學語言。許多大學生認為學最新的計算機語言、技術、標準是最好的鋪路方法,因為許多公司招聘時要求這些方面的經驗。這些新技術雖然該學,但是學習計算機基礎課程更重要,因為計算機語言和開發平台日新月異,但是萬變不離其宗的就是那些基礎課程:數據結構、演算法、編譯原理、計算機組成、關系型資料庫原理等。有位同學生動地在「開復學生網」上把這些基礎課程比擬為內功,把新的語言、技術、標准比擬為外功。只追尋時髦的學生最後只懂招式,沒有功力,是不可能成為高手的。
零基礎編程入門自學先學什麼
先學會畫流程圖和規劃程序, 才去想怎麼做程序, yEd 是個不錯的流程圖軟體, FreeMind 則是一個不錯心智圖軟體, 可以試試。
-
如果你的英文還可以, 找英文的教材來學, 去外國的 forum 討教 (如 StackOverflow), 你會有更好的領悟, 會有更多人可以幫到你. 你會學到更好的編程思維, 最重要是, 學會 "問對問題"。
2. 首先要有編程的思路. 你總要知道 "你到底想做甚麼", "為甚麼要做甚麼", "你要做甚麼". 一旦缺少其一, 你的行為便沒有意思, 你的思路 和理解也會中斷, 你會變得很迷失。
3. 你要明白編程的 4步曲 Input -> Process -> Output, 另加 Storage。
4. 得有一些 OO (物件導向) 的概念, 如 Object(Class), Attribute (Properties), Method; Inheritance(繼承), Polymorphy *** (多形繼承), Encapsulation(封裝).,就很容易掌握教程里的思路。
編程入門零基礎應該先學什麼比較好?
我以前也想這個問題想了很久~
後來學了一些VB和C語言之後,發現,還是先學C語言的好~
VB,怎麼說呢,不知道是不是我學錯了,反正我學的是VB6.0這個工具,是工具,不是語言,對入門沒什麼幫助,頂多就激發一些興趣咯(不過學1個來月VB也不是說是浪費時間,只是沒多大幫助)~
C語言比較好,那時候很多人都說先學C語言,但是我還是學了VB6.0,學了一個月~後來再學回C語言,發現,還是先學C語言好~
想學習編程,零基礎,入門需要學習什麼
現在大部分語言是面向對象思想的編程語言啊,想要學習編程還是最好先了解面向對象的思想啊。我感覺面向對象的思想最好的是Java。
編程零基礎入門。
學習譚浩強的《c語言程序設計》我就是靠它入門的,邊看書便動手照著做上面的例題,慢慢的你自然就會了,多讀書上程序。。。祝你早日成功
編程入門 零基礎
建議先學c 再學windows程序設計(windows方向)或是unix環境高級編程(unix方向),如果說網路編程的話java語言不錯,如果想今後進行windowsMFC 建議學C++。c/c++工具visual studio,java工具eclipse。
零基礎先學游戲編程 請問應該先學什麼基礎課
感覺直接學編程語言就行 抽時間可以看看編譯原理 很多事自己就能想通
零基礎學編程,怎樣入門
答:HTML——如果你還不懂的話。市面上有一大堆的封面精美,宣傳得天花亂墜的 糟糕的 HTML書籍,不幸的是很少有好的。我最喜歡的是 HTML: The Definitive Guide。
但 HTML 不完全是一種編程語言。當你准備開始編程時,我推薦從 Python起步。 你會聽到一大群人推薦 Perl,並且 Perl 依然比 Python 流行得多,但是 難學得多且(以我之見)設計得不是很好。
C 確實重要,但它要比 Python 或 Perl 難多了。不要嘗試先學 C。
Windows用戶不要滿足於 Visual Basic。 它會教給你壞習慣,而且它不可以移植,只能在Windows下運行。避免它。
Ⅳ 編譯原理是不是超級復雜
談不上超級復雜,屬於本科就能入門的技術。
當然如果專研下去的話,很多博士和教授也在研究這方面的課題。
難度的話,應該是比高數和大學物理簡單一點的,比起普通的編程課課要難。應該和嵌入式開發入門難度差不多的感覺。
Ⅳ 《兩周自製腳本語言》pdf下載在線閱讀,求百度網盤雲資源
《兩周自製腳本語言》([日]千葉 滋)電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:
書名:兩周自製腳本語言
作者:[日]千葉 滋
譯者:陳筱煙
豆瓣評分:8.0
出版社:人民郵電出版社
出版年份:2014-6
頁數:300
內容簡介:
《兩周自製腳本語言》是一本優秀的編譯原理入門讀物。全書穿插了大量輕松風趣的對話,讀者可以隨書中的人物一起從最簡單的語言解釋器開始,逐步添加新功能,最終完成一個支持函數、數組、對象等高級功能的語言編譯器。本書與眾不同的實現方式不僅大幅簡化了語言處理器的復雜度,還有助於拓展讀者的視野。
《兩周自製腳本語言》適合對編譯原理及語言處理器設計有興趣的讀者以及正在學習相關課程的大中專院校學生。同時,已經學習過相關知識、有一定經驗的開發者,也一定能從本書新穎的實現方式中受益良多。
作者簡介:
作者簡介:
千葉滋
東京工業大學研究生院信息技術理工系研究科教授,兼任東京大學研究生院信息技術理工系研究科教授。著有《面向切面入門——從Java語言・面向對象步入AspectJ語言程序設計》《簡明Java程序設計——Great Ideas for Java Programming》《GUI庫機制——軟體設計案例研習》等。
譯者簡介:
陳筱煙
畢業於復旦大學計算機科學與技術系,主要研究方向為跨設備人機交互理論。從大學時期開始接觸Java、JavaScript程序開發,目前對Web應用及智能手機應用開發有濃厚興趣,並參與Android開發文檔翻譯項目。業余開發的移動應用在Google Play商店中已有數十萬次下載。譯作有《JavaScript編程全解》《App,這樣設計才好賣》等。

Ⅵ C語言編譯原理是什麼
編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。
Ⅶ 操作系統,匯編語言,編譯原理,這三門課程學習步驟是什麼 以及原因,求詳細解釋,非常感謝。
匯編語言、編譯原理、操作系統吧
1.首先編譯原理肯定要在匯編之後學的,你不會匯編編什麼譯
2.匯編語言肯定講的是實模式的內容,學完了實模式對計算機內程序有個基本概念了,研究保護模式的時候就要涉及到操作系統了
3.至於編譯原理我沒學過,姑且認為應該也是實模式的內容吧,所以放到操作系統之前學習
Ⅷ 電腦小白一個,求推薦學習電腦的書籍。最基本的操作我都不會好落伍
如果是學習電腦編程可以通過以下書籍學習;
C/C++
1、《C程序設計語言》 入門推薦
2、《C Primer Plus》 入門推薦
3、《C和指針》
4、《C陷阱與缺陷》
5、《C++ Primer》入門推薦
為了更深入地理解程序原理,建議再學一下匯編語言
《現代x86匯編語言程序設計》
Linux
《UINX環境高級編程》 後台開發必讀
《鳥哥的Linux私房菜》 Linux運維推薦入門系列
《Linux內核設計與實現》
網路
《TCP/IP詳解卷1:協議》
Java
《Java編程語言》 入門推薦
《Java編程思想》
Python
《Python核心編程》(第2版),第3版難度加大,內容變更較多,用2版入門足夠。
資料庫
《Mysql技術內幕》,目前企業所用後台大多是linux+mysql,所以主要學習下mysql就足夠了。
如果對網站開發有興趣可以一並看下《php和mysql web開發》
系統原理
《深入理解計算機系統》強烈推薦,搞懂這本就基本能閱讀大部分計算機相關著作
計算機組成原理
《編碼:隱匿在計算機軟硬體背後的語言》
windows編程,估計你們會有windows編程的課程,如果有學下面這兩本就足夠了
《Windows程序設計》charles petzold(著)
《Windows核心編程》
編譯原理
龍書《編譯原理》,如果看不懂,推薦下面一本《編譯系統透視:圖解編譯原理》。
數據結構與演算法
《數據結構與演算法分析——C語言描述》,也有一本是C++語言描述。
《演算法導論》
編程主要靠實踐,多電腦敲代碼,最好以開發某款軟體為目標去多寫代碼,學完基礎課程,建議也學習下伺服器安全方面的知識。
上面不少書在網上有電子版,可以先下載看看,不清晰的再買實體書,或者圖書館去借
其它一些進階與提升的書,可以多逛逛圖書館。
Ⅸ 哪裡可以下載《編譯原理》電子書
你需要開發環境,可以用集成的,也可以獨立的。
windows下的話,一般用集成開發環境(IDE)。
微軟的visual studio應該說最好了。我用2005版的,資料相對多一些。2008版的是為vista做的。你可以用那個體驗版/學生版的,功能少一些,但對初學者來說足矣,免費。專業版和團隊版的功能多、收費,網上有序列號。
devcpp是個相對很小的集成開發環境。程序簡單的話,用它也可以。
linux下可以用命令行下的gcc,gdb,也有anjuta,netbeans,eclipse等IDE。
當然,你最好再下載C++的電子書如:
Visual C++ 2005 入門經典
C++面向對象程序設計基礎教程
C++參考大全第四版
C++高級編程
