第一篇:編譯原理課程論文(小編推薦)
編譯原理學習心得
11級計本2班
通過這一學期的學習,我們對于編譯原理有了深入的了解。編譯原理課程主要介紹的事編譯器構造的一般原理、基本設計方法和主要實現(xiàn)技術。編譯原理課程通過編譯器的各個組成部分來解釋高級語言編寫的源程序如何翻譯成計算機能夠執(zhí)行的機器語言。這個翻譯的過程涉及程序設計語言、機器結構、形式語言理論、類型論、算法和軟件工程等方面的知識。編譯原理的學習對我們有很大的幫助。首先:通過編譯原理的學習,有助于大家快速理解、定位和解決在程序編譯、測試與運行中出現(xiàn)的問題。另外,編譯原理的學習對熟悉編譯過程、掌握計算機高級語言的生成機制、理解具體程序的運行狀態(tài)起著關鍵作用。
在學習的過程中,很多同學認為我們今后的工作不會涉及到編譯原理的理論和技術,編譯原理沒有實際的用處,學習起來就非常的枯燥無味,因此對這門課沒有足夠的認識。其實這是對編譯原理的一種錯誤認識。該課程中的原理除了可以用于分析編譯器以外,還對諸如人工智能、并行處理技術等課程的學習具有指導作用。與此同時編譯原理課程可以幫助哦我我們更進一步地理解和綜合應用離散數(shù)學、高級語言、數(shù)據(jù)結構、匯編語言等專業(yè)基礎課程的知識。例如,編譯程序應用了多種數(shù)據(jù)結構,在詞法分析階段使用狀態(tài)轉換圖來識別各種單詞;在語法分析中使用語法樹等來進行語法分析;在存儲分配時使用棧式結構和堆式結構進行存儲空間的分配。本門課程學習對其它課程的學習和今后很多領域的理論研究具有深遠的意義。
我們學習本門課程需要抓住重點知識,并能夠理解和熟練運用。例如就編譯原理的語法分析這一章節(jié)。
語法分析包括自上而下和自下而上分析。自上而下分析著重掌握LL(1)文法,自下而上分析重點掌握算符優(yōu)先文法和LR(0)、SLR(1)文法。
語法分析部分就比較麻煩一點了?,F(xiàn)在一般有兩種語法分析算法,LL自頂向下算法和LR自底向上算法。LL算法還好說,到了LR算法的時候,困難就來了。很多自學編譯原理的都是遇到LR算法的理解成問題后就放棄了自學。其實這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫出來才算真正的會。像LR算法的語法分析器,一般都是用工具Yacc來生成,實踐中完全沒有比較自己來實現(xiàn)。對于LL算法中特殊的遞歸下降算法,因為其實踐十分簡單,那么就應該要求每個學生都能自己寫。當然,現(xiàn)在也有不少好的LL算法的語法分析器,不過要是換在非C平臺,比如Java,Delphi,你不能運用YACC工具了,那么你就只有自己來寫語法分析器。
等學到詞法分析和語法分析時候,你可能會出現(xiàn)這樣的疑問:“詞法分析和語法分析到底有什么?”就從編譯器的角度來講,編譯器需要把程序員寫的源程序轉換成一種方便處理的數(shù)據(jù)結構(抽象語法樹或語法樹),那么這個轉換的過程就是通過詞法分析和語法分析的。其實詞法分析并非一開始就被列入編譯器的必備部分,只是我們?yōu)榱撕喕Z法分析的過程,就把詞法分析這種繁瑣的工作單獨提取出來,就成了現(xiàn)在的詞法分析部分。除了編譯器部分,在其它地方,詞法分析和語法分析也是有用的。比如我們在DOS,Unix,Linux下輸入命令的時候,程序如何分析你輸入的命令形式,這也是簡單的應用??傊?,這兩部分的工作就是把不“規(guī)則”的文本信息轉換成一種比較好分析好處理的數(shù)據(jù)結構。那么為什
么編譯原理的教程都最終把要分析的源分析轉換成“樹”這種數(shù)據(jù)結構呢?數(shù)據(jù)結構中有Stack, Line,List?這么多數(shù)據(jù)結構,各自都有各自的特點。但是Tree這種結構有很強的遞歸性,也就是說我們可以把Tree的任何結點Node提取出來后,它依舊是一顆完整的Tree。這一點符合我們現(xiàn)在編譯原理分析的形式語言,比如我們在函數(shù)里面使用函樹,循環(huán)中使用循環(huán),條件中使用條件等等,那么就可以很直觀地表示在Tree這種數(shù)據(jù)結構上。同樣,我們在執(zhí)行形式語言的程序的時候也是如此的遞歸性。在編譯原理后面的代碼生成的部分,就會介紹一種堆棧式的中間代碼,我們可以根據(jù)分析出來的抽象語法樹,很容易,很機械地運用遞歸遍歷抽象語法樹就可以生成這種指令代碼。而這種代碼其實也被廣泛運用在其它的解釋型語言中。像現(xiàn)在流行的Java,.NET,其底層的字節(jié)碼bytecode,可以說就是這中基于堆棧的指令代碼的。
在學習文法時,對文法的組成,用法都較為明了,而在真正做題時卻感到十分吃力。例如給出了一個語言,要求寫出它的上下文無關文法,就感到十分棘手,所以今后在這方面要加大練習量,以熟練掌握。
而在之后的詞法分析和語法分析中,我感到在看基本原理時十分困難,通常要長時間鉆研才能夠有所了解,而一旦掌握了基本原理,做題時就感到十分順暢了。例如,在剛接觸到LR(0)文法時,我用了大量的時間去學習它的原理,掌握之后,在列LR(0)分析表和寫分析過程時,只要思路清晰,就會比較順暢,而且不會犯錯。
另外我覺得要想學好編譯原理這門課,一定要做到以下兩點,達到知識的融會貫通。對以后學習其他知識打下基礎,同時對以前的一些知識有更深的認識。
首先,整體把握一條主線,領會每個階段的精髓,再融會貫通。編譯器(編譯程序)可以分為詞法分析、語法分析、語義分析、中間代碼生成,代碼優(yōu)化和目標代碼生成這六個階段,每個階段還會伴有符號表管理和出錯管理。在第一章編譯器概述中就把編譯器化分成這六個階段,同時還簡要的描述了這六個階段各自的任務,這是貫穿整個課程的一個主線,整個課程就是按這六個階段組織進行的。所以一開始我們?nèi)绻軌虬盐兆∵@條主線,對課程有一個總體的把握,理解編譯的過程,然后學習起來也會感覺到比較輕松。當我們從整體上理解編譯器的結構之后,然后分章節(jié)對各個部分進行細致地閱讀理解。按照編譯過程的劃分,把課程分為六章內(nèi)容,每章都有它的精髓所在,只要掌握了每章的精髓,就能掌握編譯的整個過程。詞法分析的精髓主要是詞法分析的構造、有限自動機理論的應用;語法分析的精髓主要是語法分析的兩種方法——自上而下分析法和自下而上分析法;語義分析主要是屬性文法、語法制導定義以及翻譯方案;中間代碼主要描述了中間代碼常見的幾種表示形式、各種語法結構如何進行語法制導翻譯形成中間代碼;代碼優(yōu)化主要圍繞如何從時間和空間上進行優(yōu)化,盡可能提高執(zhí)行的效率展開,分別講述了局部優(yōu)化和循環(huán)優(yōu)化;目標代碼生成主要是目標代碼生成算法的實現(xiàn)及寄存器的分配。這六個部分相輔相成,互有聯(lián)系,掌握每個階段的精髓,各個擊破,這樣我們大家學習起來就會對整本書有個大概的了解,然后再針對性的坐題目,就會很好的學習到這本書。
其次我們可以多跟老師交流,有什么不懂的問題一定要及時提出來。課后如果還有不懂的問題同學們之間相互討論,爭取把每一個知識點都搞懂,這樣做起題目來才能得心應手。在上課的過程中,上面老師講解的充滿激情,下面有的同學聽得昏昏欲睡,隨著時間的積累,大家不理解的知識越來越多,就會慢慢失去學習的興趣。所以,我們一定要學會怎么學習,不放棄,遇到不懂問題要及
時解決。在課堂上可以采取互動的方法,有什么問題,我們一定要及時說出自己在學習的過程遇到的問題以及解決問題的方法。
還有一點大家比較容易忽略。那就是《編譯原理》對實踐的要求比較高,所以實驗課是培養(yǎng)大家實踐能力的重要環(huán)節(jié),是鞏固和驗證所學理論知識,培養(yǎng)大家分析問題、解決問題能力的重要環(huán)節(jié)。但是在學習的過程中,一部分無法完成編譯原理的實驗。即使告訴大家實驗的思路和算法,有的還是不知如何入手,整個實驗的效果很差。為了提高實驗效果,極大地促進大家對原理的理解,我們一定要認真完成經(jīng)典的實驗內(nèi)容。編譯技術中有很多經(jīng)典的算法,老師給我們的幾個實驗都是經(jīng)典的實驗。大家一定要做好這幾個實驗,這對我們對書中的一些知識的理解都有很好的認識。做好了這幾個實驗,一定可以達到一個新的高度。對具體的一些問題有更深更透徹的認識。
我覺得如果大家能夠很認真的做到以上幾點,一定可以學好編譯原理這門課。世上無難事,只怕有心人,只要我們大家都帶著一顆認真,努力的心,就算編譯原理這門課再難,我們也有理由相信我們每一個人都能夠學好。
第二篇:編譯原理論文
編譯原理心得體會
編譯原理是計算機專業(yè)的一門重要專業(yè)課,旨在介紹編譯程序構造的一般原理和基本方法,在計算機本科教學中占有十分重要的地位。
該課程理論性與實踐性都很強,我們在學習是普遍感到內(nèi)容非常抽象,不易理解,內(nèi)容多且繁瑣,難以完整、全面地掌握編譯原理的有關知識,更不用說靈活運用編譯原理知識從事相關設計或應用于其他領域。雖然只有少數(shù)人從事編譯方面的工作,但是這門課在理論、技術、方法上都對我們提供了系統(tǒng)而有效的訓練,有利于提高軟件人員的素質和能力。
在我們學習編譯原理以前,都認為編譯原理只能應用在寫程序語言的編譯器上,覺得用處不大,學習興趣不高。而在后來的學習中,我們逐漸認識到計算機專業(yè)的學生,除了要會編寫程序語言之外,還應該了解它是如何被計算機所識別,這才是真正并且透徹地學習軟件。另外,編譯器中每一個模塊的編寫,都能對我們的編程能力的提高有很大幫助。在今后若從事軟件工程,這門課程也能夠對編寫程序有所幫助。
為了能夠系統(tǒng)掌握這門專業(yè)課,我們把編譯原理分為以下幾個模塊:①語言和文法;②詞法分析;③語法分析;④語義分析和中間代碼生成;⑤代碼優(yōu)化和目標代碼生成。
在學習的開始,我們需要掌握什么是編譯,編譯分為哪些階段,編譯程序和解釋程序的區(qū)別等等。在做好了這些方面的準備后,開始了系統(tǒng)的學習。
語言和文法部分的知識包括文法基本概念及文法的二義性?;靖拍钣形姆ǘx、推導、句型、句子等等。二義性文法是通過畫語法樹的方法來證明。
詞法分析中的重點是有窮自動機DFA的生成以及DFA和正規(guī)式與正規(guī)文法的關系。還要熟練掌握NFA轉換為DFA的方法及DFA的化簡。
語法分析包括自上而下和自下而上分析。自上而下分析著重掌握LL(1)文法,自下而上分析重點掌握算符優(yōu)先文法和LR(0)、SLR(1)文法。
語義分析重點是其功能,中間代碼生成和語法制導翻譯定義與方法。
最后,優(yōu)化分為局部優(yōu)化和循環(huán)優(yōu)化,重點理解一些關鍵詞,如基本塊、流圖等,要學會自己畫出程序流圖。用DAG圖進行局部優(yōu)化是重點。
在學習文法時,對文法的組成,用法都較為明了,而在真正做題時卻感到十分吃力。例如給出了一個語言,要求寫出它的上下文無關文法,就感到十分棘手,所以今后在這方面要加大練習量,以熟練掌握。
而在之后的詞法分析和語法分析中,我感到在看基本原理時十分困難,通常要長時間鉆研才能夠有所了解,而一旦掌握了基本原理,做題時就感到十分順暢了。例如,在剛接觸到LR(0)文法時,我用了大量的時間去學習它的原理,掌握之后,在列LR(0)分析表和寫分析過程時,只要思路清晰,就會比較順暢,而且不會犯錯。
下面是我認為的比較有效的學習編譯原理的步驟:
1.先利用ANTLR之類的編譯器生成工具,做一個小程序(如上面提到的HTML文件轉化成純文本文件的程序),所需知識只是正則表達式的基本知識和生成工具本身的使用方法(可以看聯(lián)機幫助和網(wǎng)上教程(tutorial)來掌握).這樣做的好處是:
1)可以體會到編譯原理的實用性,提高學習興趣
2)入門容易,消除編譯原理學習的畏難情緒.3)獲得詞法分析器和語法分析器的感性認識,有利于加深對理論的理解.4)獲得編譯器自動生成工具(compiler compiler)的使用經(jīng)驗,提高解決實際問題的能力.(實際工作很多都不是手編而是利用工具的)
2.象ANTLR之類的工具是開源(open source)的,可研究其源碼,以便必要時自己手編分析程序.3.回過頭來看編譯原理教材.這時大概會發(fā)現(xiàn),很多理論很容易懂,剩下的只有上面說的幾個難點,多看幾遍,重點突破.4.結合教材所附源碼,進一步加深對教材的理解。以上就是我對這門課的心得體會。
第三篇:編譯原理課程-教學計劃
編譯原理教學大綱2001,9
周次課內(nèi)學時課內(nèi)安排(講授內(nèi)容)建議課外安排備注
12編譯原理概述閱讀PL/0程序文本
24介紹PL/0編譯程序閱讀PL/0程序文本
32詞法分析程序自動構造閱讀PL/0程序文本
(正規(guī)式,有窮自動機)
44(2)詞法分析程序自動構造練習題
Lex(Flex)介紹,布置PP1實踐題一PP1
52文法和語言練習題
64自頂向下語法分析練習題提交PP1LL(1)文法
72自底向上語法分析練習題
LR文法
84LR分析練習題
期中考試
92Yacc介紹,布置PP2實踐題一PP2
104習題課
語法分析方法比較提交PP2 112語法制導翻譯,布置PP3實踐題一PP3
124語法制導翻譯
運行時存儲組織提交PP3 132運行時存儲組織練習題144代碼優(yōu)化, 布置PP4實踐題一PP4
152代碼生成164實踐題目總結答辯
習題課
附1 實踐題目(從中選一)
實踐題一 Deacf編譯程序的設計和實現(xiàn).實踐題二Pl/0編譯程序擴充,用Lex和 Yacc實現(xiàn)一個小解釋器.實踐題三 java實現(xiàn)的Mini-Triangle編譯程序.(限少數(shù)同學選,在第四周作選題報告)附2 課程評分
1課堂小測驗,作業(yè)抽查 10%期中考試20%
3實踐題一 40% 實踐題二20% 實踐題三 50%
4期末考試 完成實踐題一 30% 完成實踐題二50% 完成實踐題三 20%
第四篇:編譯原理學習論文(推薦)
編譯原理學習論文
班級:09應用(2)班姓名:彭文陽學號:2009081215
大學課程為什么要開設編譯原理呢?這門課程關注的是編譯器方面的產(chǎn)生原理和技術問題,似乎和計算機的基礎領域不沾邊,可是編譯原理卻一直作為大學本科的必修課程,同時也成為了研究生入學考試的必考內(nèi)容。編譯原理及技術從本質上來講就是一個算法問題而已,當然由于這個問題十分復雜,其解決算法也相對復雜。我們學的數(shù)據(jù)結構與算法分析也是講算法的,不過講的基礎算法,換句話說講的是算法導論,而編譯原理這門課程講的就是比較專注解決一種的算法了。在20世紀50年代,編譯器的編寫一直被認為是十分困難的事情,第一Fortran的編譯器據(jù)說花了18年的時間才完成。在人們嘗試編寫編譯器的同時,誕生了許多跟編譯相關的理論和技術,而這些理論和技術比一個實際的編譯器本身價值更大。就猶如數(shù)學家們在解決著名的哥德巴赫猜想一樣,雖然沒有最終解決問題,但是其間誕生不少名著的相關數(shù)論。
推薦參考書
雖然編譯理論發(fā)展到今天,已經(jīng)有了比較成熟的部分,但是作為一個大學生來說,要自己寫出一個像Turboc C,Java那樣的編譯器來說還是太難了。不僅寫編譯器困難,學習編譯原理這門課程也比較困難。
正是因為編譯原理學習相對困難,那么就要求有好的教師和好的教材。教師方面不是我們能自己更改的,而在教材方面我們卻可以按自己的意愿來閱讀。我下面推薦幾本好的編譯原理的教材。我推薦的書籍都是國外的經(jīng)典教材,因為在國內(nèi)的教材中,確實還沒發(fā)現(xiàn)什么讓人滿意的。
第一本書的原名叫《Compilers Principles,Techniques,and Tools》,另外一個響亮的名字就是龍書。原因是這本書的封面上有條紅色的龍,也因為獗臼樵詒嘁朐?砘?×煊蛉肥堤?忻???所以很多國外的學者都直接取名為龍書。最近機械工業(yè)出版社已經(jīng)出版了此書的中文版,名字就叫《編譯原理》。該書出的比較早,大概是在85或86年編寫完成的,作者之一還是著名的貝爾實驗室的科學家。里面講解的核心編譯原理至今都沒有變過,所以一直到今天,它的價值都非凡。這本書最大的特點就是一開始就通過一個實際的小例子,把編譯原理的大致內(nèi)容羅列出來,讓很多編譯原理的初學者很快心里有了個底,也知道為什么會有這些理論,怎么運用這些理論。而這一點是我感覺國內(nèi)的教材缺乏的東西,所以國內(nèi)的教材都不是寫給愿意自學的讀者,總之讓人看了半天,卻不知道里面的東西有什么用。第二本書的原名叫《Modern Compiler Design》,中文名字叫做《現(xiàn)代編譯程序設計》。該書由人民郵電出版社所出。此書比較關注的是編譯原理的實踐,書中給出了不少的實際程序代碼,還有很多實際的編譯技術問題等等。此書另外一個特點就是其“現(xiàn)代”而字。在傳統(tǒng)的編譯原理教材中,你是不可能看到如同Java中的“垃圾回收”等算法的。因為Java這樣的解釋執(zhí)行語言是在近幾年才流行起來的東西。如果你想深入學習編譯原理的理論知識,那
么你肯定得看前面那本龍書,如果你想自己動手做一個先進的編譯器,那么你得看這本《現(xiàn)代編譯程序設計》。
第三本書就是很多國內(nèi)的編譯原理學者都推薦的那本《編譯原理及實踐》?;蛟S是這本書引入國內(nèi)比較早吧,我記得我是在高中就買了這本書,不過也是在前段時間才把整本書看完。此書作為入門教程也的確是個不錯的選擇。書中給出的編譯原理講解也相當細致,雖然不如前面的龍書那么深入,但是很多地方都是點到為止,作為大學本科教學已經(jīng)是十分深入了。該書的特點就是注重實踐,不過感覺還不如前面那本《現(xiàn)代編譯程序設計》的實踐味道更重。此書的重點還是在原理上的實踐,而非前面那本那樣的技術實踐。《編譯原理及實踐》在講解編譯原理的各個部分的同時,也在逐步實踐一個現(xiàn)代的編譯器Tiny C.等你把整本書看完,差不多自己也可以寫一個Tiny C了。作者還對Lex和Yacc這兩個常用的編譯相關的工具進行了很詳細的說明,這一點也是很難在國內(nèi)的教材中看到的。
推薦了這三本教材,都有英文版和中文版的。很多英文好的同學只喜歡看原版的書,不我的感覺是這三本書的翻譯都很不錯,沒有必要特別去買英文版的。理解理論的實質比理解表面的文字更為重要。
編譯原理的實質
前面已經(jīng)說過,學習編譯原理其實也就是學習算法而已,沒什么特別的。只不過這些算法的產(chǎn)生已經(jīng)形成了一套理論。下面我來看看編譯原理里面到底有什么高深的理論吧。
幾乎每本編譯原理的教材都是分成詞法分析,語法分析(LL算法,遞歸下降算法,LR算法),語義分析,運行時環(huán)境,中間代碼,代碼生成,代碼優(yōu)化這些部分。其實現(xiàn)在很多編譯原理的教材都是按照85,86出版的那本龍書來安排教學內(nèi)容的,所以那本龍書的內(nèi)容格式幾乎成了現(xiàn)在編譯原理教材的定式,包括國內(nèi)的教材也是如此。一般來說,大學里面的本科教學是不可能把上面的所有部分都認真講完的,而是比較偏重于前面幾個部分。像代碼優(yōu)化那部分東西,就像個無底洞一樣,如果要認真講,就是單獨開一個學期的課也不可能講得清楚。所以,一般對于本科生,對詞法分析和語法分析掌握要求就相對要高一點了。
詞法分析相對來說比較簡單??赡苁窃~法分析程序本身實現(xiàn)起來很簡單吧,很多沒有學過編譯原理的人也同樣可以寫出各種各樣的詞法分析程序。不過編譯原理在講解詞法分析的時候,重點把正則表達式和自動機原理加了進來,然后以一種十分標準的方式來講解詞法分析程序的產(chǎn)生。這樣的做法道理很明顯,就是要讓詞法分析從程序上升到理論的地步。
語法分析部分就比較麻煩一點了?,F(xiàn)在一般有兩種語法分析算法,LL自頂向下算法和LR自底向上算法。LL算法還好說,到了LR算法的時候,困難就來了。很多自學編譯原理的都是遇到LR算法的理解成問題后就放棄了自學。其實這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫出來才算真正的會。像LR算法的語法分析器,一般都是用工具Yacc來生成,實踐中完全沒有比較自己來實現(xiàn)。對于LL算法中特殊的遞歸下降算法,因為其實踐十分簡單,那么就應該要求每個學生都能自己寫。當然,現(xiàn)在也有不少
好的LL算法的語法分析器,不過要是換在非C平臺,比如Java,Delphi,你不能運用YACC工具了,那么你就只有自己來寫語法分析器。
等學到詞法分析和語法分析時候,你可能會出現(xiàn)這樣的疑問:“詞法分析和語法分析到底有什么?”就從編譯器的角度來講,編譯器需要把程序員寫的源程序轉換成一種方便處理的數(shù)據(jù)結構(抽象語法樹或語法樹),那么這個轉換的過程就是通過詞法分析和語法分析的。其實詞法分析并非一開始就被列入編譯器的必備部分,只是我們?yōu)榱撕喕Z法分析的過程,就把詞法分析這種繁瑣的工作單獨提取出來,就成了現(xiàn)在的詞法分析部分。除了編譯器部分,在其它地方,詞法分析和語法分析也是有用的。比如我們在DOS,Unix,Linux下輸入命令的時候,程序如何分析你輸入的命令形式,這也是簡單的應用。總之,這兩部分的工作就是把不“規(guī)則”的文本信息轉換成一種比較好分析好處理的數(shù)據(jù)結構。那么為什么編譯原理的教程都最終把要分析的源分析轉換成“樹”這種數(shù)據(jù)結構呢?數(shù)據(jù)結構中有Stack, Line,List…這么多數(shù)據(jù)結構,各自都有各自的特點。但是Tree這種結構有很強的遞歸性,也就是說我們可以把Tree的任何結點Node提取出來后,它依舊是一顆完整的Tree。這一點符合我們現(xiàn)在編譯原理分析的形式語言,比如我們在函數(shù)里面使用函樹,循環(huán)中使用循環(huán),條件中使用條件等等,那么就可以很直觀地表示在Tree這種數(shù)據(jù)結構上。同樣,我們在執(zhí)行形式語言的程序的時候也是如此的遞歸性。在編譯原理后面的代碼生成的部分,就會介紹一種堆棧式的中間代碼,我們可以根據(jù)分析出來的抽象語法樹,很容易,很機械地運用遞歸遍歷抽象語法樹就可以生成這種指令代碼。而這種代碼其實也被廣泛運用在其它的解釋型語言中。像現(xiàn)在流行的Java,.NET,其底層的字節(jié)碼bytecode,可以說就是這中基于堆棧的指令代碼的。
關于語義分析,語法制導翻譯,類型檢查等等部分,其實都是一種完善前面得到的抽象語法樹的過程。比如說,我們寫C語言程序的時候,都知道,如果把一個浮點數(shù)直接賦值給一個整數(shù),就會出現(xiàn)類型不匹配,那么C語言的編譯器是怎么知道的呢?就是通過這一步的類型檢查。像C++語言這中支持多態(tài)函數(shù)的語言,這部分要處理的問題就更多更復雜了。大部編譯原理的教材在這部分都是講解一些比較好的處理策略而已。因為新的問題總是在發(fā)生,舊的辦法不見得足夠解決。
本來說,作為一個編譯器,起作用的部分就是用戶輸入的源程序到最終的代碼生成。但是在講解最終代碼生成的時候,又不得不講解機器運行環(huán)境等內(nèi)容。因為如果你不知道機器是怎么執(zhí)行最終代碼的,那么你當然無法知道如何生成合適的最終代碼。這部分內(nèi)容我自我感覺其意義甚至超過了編譯原理本身。因為它會把一個計算機的程序的運行過程都通通排在你面前,你將來可能不會從事編譯器的開發(fā)工作,但是只要是和計算機軟件開發(fā)相關的領域,都會涉及到程序的執(zhí)行過程。運行時環(huán)境的講解會讓你更清楚一個計算機程序是怎么存儲,怎么裝載,怎么執(zhí)行的。關于部分的內(nèi)容,我強烈建議大家看看龍書上的講解,作者從最基本的存儲組織,存儲分配策略,非局部名字的訪問,參數(shù)傳遞,符號表到動態(tài)存儲分配(malloc,new)都作了十分詳細的說明。這些東西都是我們編寫平常程序的時候經(jīng)常要做的事情,但是我們卻少去探求其內(nèi)部是如何完成。
關于中間代碼生成,代碼生成,代碼優(yōu)化部分的內(nèi)容就實在不好說了。國內(nèi)很多教材到了這部分都會很簡單地走馬觀花講過去,學生聽了也只是作為了解,不知道如何運用。不過這部分內(nèi)容的東西如果要認真講,單獨開一學期的課程都講不完。在《編譯原理及實踐》的書上,對于這部分的講解就恰到好處。作者主要講解的還是一種以堆棧為基礎的指令代碼,十分通俗易懂,讓人看了后,很容易模仿,自己下來后就可以寫自己的代碼生成。當然,對于其它代碼生成技術,代碼優(yōu)化技術的講解就十分簡單了。如果要仔細研究代碼生成技術,其實另外還有本叫做《Advance Compiler Desgin and Implement》,那本書現(xiàn)在由機械工業(yè)出版社引進的,十分厚重,而且是英文原版。不過這本書我沒有把它列為推薦書給大家,畢竟能把龍書的內(nèi)容搞清楚,在中國已經(jīng)就算很不錯的高手了,到那個時候再看這本《Advance Compiler Desgin and Implement》也不遲。代碼優(yōu)化部分在大學本科教學中還是一個不太重要的部分,就是算是實踐過程中,相信大家也不太運用得到。畢竟,自己做的編譯器能正確生成執(zhí)行代碼已經(jīng)很不錯了,還談什么優(yōu)化呢?
關于實踐
編譯原理的課程畢竟還只是講解原理的課程,不是專門的編譯技術課程。這兩門課程是有很大的區(qū)別的。編譯技術更關注實際的編寫編譯器過程中運用到的技術,而原理的課關注講解其基本理論。但是計算機科學本身就是一門實踐性很強的課程,如果能夠學以致用,那才叫真正的學會。李陽在講解瘋狂英語的時候就說到,只要當你會實際中運用一個單詞一個詞組的時候你才能叫學會了這個單詞或者詞組,而不是只是知道了它的拼寫和意思。其實任何學習都是一樣的,如果缺少了實踐的結合,你不能算學會。
編譯原理的課程主要就是講解編譯器產(chǎn)生的理論和原理,那么很簡單,自己寫個編譯器就是最好的實踐過程了。不過你得小心,編譯系統(tǒng)可能是所有軟件系統(tǒng)中最復雜的系統(tǒng)之一,不然為什么大學里面還會把編譯器的編寫開成一門叫做編譯原理的課程來講?我很佩服那些學了操作系統(tǒng)原理就開始自己寫操作系統(tǒng),學了編譯原理就開始自己寫編譯器的人們,確實,在中國,敢這么做的學生太少了。且不管你這樣做能不能做成功,至少有了這個嘗試,會讓你的程序設計,系統(tǒng)規(guī)劃安排的功底增進不少。我下面給出一些關于實踐過程中可能會遇到的困難,希望能夠在你陷入困境的前幫你一把。
1.Lex和Yacc.這兩工具是作為詞法分析很語法分析的工具。如果你自己寫一個編譯器,我十分不建議你連詞法分析這種事情都親手來寫。Lex和Yacc應該是作為每本編譯原理的教材的必備內(nèi)容,可是在國內(nèi)的教材中缺很少看到。這兩個工具是Unix系統(tǒng)下的小東西,如果你要在Windows中運用,那么你最好去下在cygwin這個軟件。它是個在Windows下模擬Unix的東東,里面就包含了flex.exe和bison.exe(yacc)這兩個工具.這兩個工具使用起來還挺麻煩的(其實unix 下的很多十分有用的工具都是這樣), 不過在《編譯原理與實踐》這本書上對于這兩個工具的講解十分詳細,還列舉了不少實際的例子。
2.做解釋型語言比做生成機器代碼的編譯器簡單。雖然說,做解釋型的編譯器,像Java那樣的,你還得自己去寫解釋器,不過這樣你就不必去查找機器代碼的資料了。如果你做生
成的最終機器代碼編譯器可能會遇到問題還有就是寄存器為基礎的代碼生成方法。前面說過,如果你生成的是以堆棧為基礎的代碼,那么其代碼生成過程十分簡單,需要考慮的東西也不多,如果你考慮最終的機器代碼生成的話,你必須考慮機器的寄存器如何分配等麻煩的問題。
3.考慮用別人已經(jīng)生成的語法文件,盡量不要自己動手寫詞法文件和語法文件.以前一個朋友曾經(jīng)說過,寫出一個好的程序語言的語法定義,就幾乎完成了一個編譯器的一半.確實是這樣,語法文件的編寫是個很難的事情.現(xiàn)在網(wǎng)上到處都可以找到比如C語言,C++,Java, Tiny C,Minus C等語言的詞法文件和語法文件,你完全可以自己下下來來用.在《編譯原理及實踐》的書中,作者給出了一個Tiny C的全部代碼.我自我感覺作者的這個編譯器做得很不錯,相對于其它php,perl等語言的源代碼來說,簡單得多,容易看懂,而且很清晰地展現(xiàn)了一個完成的編譯系統(tǒng)的實現(xiàn)過程.其源代碼可以在作者的網(wǎng)站上下載.
第五篇:編譯原理課程和助教工作總結
編譯原理課程和助教工作總結
時間如流水般,轉眼,一學期將至,每個人為了能交上一份滿意的答卷,無時無刻不在傾注著汗水,揮灑著熱淚。掩卷長思,細細品味,這學期的點點滴滴不禁又浮上心頭,現(xiàn)在讓我們一起回顧一下,希望可以對今后的教學工作有所幫助。
編譯原理是我們北京師范大學信息科學與技術學院計算機專業(yè)本科生的專業(yè)必修課,它旨在介紹編譯程序構造的一般原理和基本方法,其內(nèi)容主要包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優(yōu)化和目標代碼生成等。這門課程關注的是編譯器方面的產(chǎn)生原理和技術問題,似乎和計算機的基礎領域不沾邊,但是編譯原理課程是所有計算機專業(yè)學生應該習得的一門重要課程,因為雖然在將來并不是所有人都會從事編譯方面的工作,但是通過編譯原理的學習之后,可從許多不同的角度來觀察編譯器的結構,編譯器的物理結構、操作的順序等等,會涉及到數(shù)據(jù)結構、計算機組成原理等課程,所以同學們在理論、技術和方法上都能得到系統(tǒng)而有效的訓練,而且有利于將來希望從事軟件開發(fā)的學生的相關素質和能力的進一步提高,更能夠讓每個學生更清楚的了解和熟悉一段程序從源代碼到可執(zhí)行文件之間具體的轉換過程,這樣能夠更好的理解代碼的編譯和計算機內(nèi)部的工作原理,對學生以后計算機相關的學習乃至工作從業(yè)都會有非常大的幫助。
編譯原理這門課程是計算機專業(yè)課程中偏難的一門課,不管是在平時的課堂教學上,還是在上機實驗的過程中,學生都會產(chǎn)生很多困惑之處,在這些方面我們的編譯原理助教就承擔了相當重要的工作和任務:
每周課堂隨堂聽課,跟進教學進度,并且上課之前做好復習工作,對每節(jié)課同學們可能會產(chǎn)生的問題提前做好歸納,以便更好的在課余時間跟同學們討論,給同學們提供答疑解惑的機會;
能動手編寫代碼完成變異原理實驗是本課程技能培養(yǎng)的重要一環(huán),在每周的上機實驗時,助教幫助同學們進行分組,以小組合作的方式來完成每次的實驗任務,依照課程進度循序漸進的給同學們分派布置實驗任務,在實驗課上跟同學們隨時交流,一同調(diào)試代碼,一對一的解答實驗疑惑等,并且協(xié)助同學們理解實驗原理和內(nèi)容,輔助同學們能夠順利完成上機實驗,通過上機實驗的手動操作,同學們也可以更直接、更具體的理解編譯程序代碼過程中一些具體的原理和方法;實驗課我選取的是基于C++或者是基于flex和bison的實驗,助教會主動和實驗課本的作者老師聯(lián)系溝通,獲得更多實驗相關的資料,比如書上給出代碼的電子版和用例測試等。
助教在課后會主動收集同學們課堂上課或者實驗過程中遇到的問題向我反映,這樣可以及時發(fā)現(xiàn)同學們在課堂中理解較為模糊甚至有偏差的地方,并在課堂或者實驗課上進行一個集中的講解,更利于同學們的學習;
每次課結束之后,我會布置課后作業(yè)來讓同學們對課堂教學內(nèi)容進行鞏固和查漏補缺,助教認真批改同學們的課后作業(yè)、所交的實驗報告和運行的代碼,做好每位同學的評分與登記,對課后作業(yè)、實驗報告和代碼中關鍵性的錯誤做出標記,并要求學生改正。登記課后成績時,按10分制來決定,登記實驗成績時按照20分制來決定。在每次批改作業(yè)結束后,助教會及時整理,匯總學生的成績和作業(yè)實驗中出現(xiàn)的問題,助教通過批改課后作業(yè)和實驗來了解同學們真實的學習情況,從而能夠更好的輔助教學工作的進行。
平時為了同學們能獲得更好的學習體驗,會進行一些與國外教授的視頻課程或者相關活動等,助教會組織同學們進行視頻授課前的預習工作,同大家一起討論上課形式,提出可能遇到的問題等等,在課前會負責批教室,布置桌椅場地,設置視頻授課環(huán)境,調(diào)試攝像頭、話筒和音響等相關的設備,為進行正常的視頻授課或其他活動做準備。
對自己的要求:
一、師德方面:加強修養(yǎng),塑造“師德”,我始終認為作為一名教師應把“師德”放在一個極其重要的位置上,因為這是教師的立身之本?!皩W高為師,身正為范”,這個道理古今皆然。從踏上講臺的第一天,我就時刻嚴格要求自己,力爭做一個有崇高師德的人,為每一個學生“傳道授業(yè)解惑”。
二、認真?zhèn)湔n,不但備學生而且備教材備教法,根據(jù)教材內(nèi)容及學生的實際,設計課的類型,擬定采用的教學方法,并對教學過程的程序及時間安排都作了詳細的安排,認真寫好教案。每一課都做到“有備而來”,每堂課都在課前做好充分的準備,并制作各種有利于吸引學生注意力的有趣教具,課后及時對該課作出總結,并認真搜集每課書的知識要點,歸納總結。
三、增強上課技能,提高教學質量,使講解清晰化,條理化,準確化,生動化,做到線索清晰,言簡意賅,深入淺出。在課堂上特別注意調(diào)動學生的積極性,讓學生多動手,從而加深理解掌握知識。加強師生交流,充分體現(xiàn)學生的主動作用,讓學生學得容易,學得輕松,學得愉快;注意精講精練,在課堂上老師講得盡量少,學生動口動手動腦盡量多;同時在每一堂課上都充分考慮每一個層次的學生學習需求和學習能力,讓各個層次的學生都得到提高。
四、認真批改作業(yè):布置作業(yè)做到精讀精練。有針對性,有層次性。同時對學生的作業(yè)批改及時、認真,分析并記錄學生的作業(yè)情況,將他們在作業(yè)過程中出現(xiàn)的問題作出分類總結,進行透切的評講,并針對有關情況及時改進教學方法,做到有的放矢。對學生:
“不積跬步,無以致千里;不積小流,無以成江?!?,學生要從點點滴滴做起,一步一個腳印,一份耕耘,一份收獲。學習要靠你們自己,踏踏實實做事,所謂“行百里路半九十”,學習要鍥而不舍,奮進永遠是核心,讓努力充實自己,厚積而薄發(fā),達到“書香引蝶宜養(yǎng)蘭,胸中點墨繪新顏”的水平。