摘要:結合編譯原理課程教學工作,從課程特點、教學內容的合理取舍、語法和語義分析等難點內容的講授方式、實驗內容的設計等方面進行深入探討,對教學過程進行總結,講述如何提高教學質量。
關鍵詞:編譯原理;課程內容;實驗環節
文章編號:1672-5913(2013)18-0066-03
中圖分類號:G642
0 引言
編譯原理是計算機專業本科生的重要核心課程,通常開設在大學3年級。編譯器是計算機3大系統軟件之一,其構造原理和技術是計算機科學技術領域的重要組成部分。雖然絕大多數計算機專業學生未來不可能去構造或維護一個主流程序設計語言的編譯器,但與編譯原理相關的模型、理論和算法可以用在多種應用領域,將對研究開發產生有益的影響。學習該課程可以培養學生抽象思維、獨立解決復雜問題、編程和調試等涉及多門專業課程知識的綜合應用能力。
編譯原理課程內容抽象、理論性強、形式化方法不易理解,對學生編程實踐有較高的要求。對于教師而言,如何在有限的學時內優化教學內容,合理安排實驗環節,是值得探討的問題。
1 課程特點
編譯領域里的經典教材作者Alfred V.Aho認為編寫編譯器的原理和技術還可以用于編譯器設計之外的眾多領域,這些原理和技術通常會在一個計算機科學家的職業生涯中多次被用到。這句話給出了編譯原理課程的教學定位——兼具理論與實踐兩方面的高要求。
編譯器構造各階段的工作均有其抽象理論基礎,涉及多種數學模型,詞法分析階段涉及正則表達式與有窮狀態自動機理論;語法分析階段涉及上下文無關文法;語義分析階段涉及屬性文法、類型系統;而樹形結構是表示程序語法結構以及源程序到中間代碼翻譯的重要模型。編譯器中的算法研究同樣重要,必須考慮算法的功能、通用性,其中語法分析階段的算法最為典型,依次引入了一系列算法。而編譯器開發的實踐性強,需要學生實際動手實現一個規模較大的編譯器,這本身是一個較復雜的軟件工程項目,必須考慮子模塊劃分、模塊之間信息傳遞、算法效率、編譯器構造自動工具等多方面因素。
編譯原理融合多門專業課程,包括來自于計算機科學不同領域的思想,如高級語言程序設計、形式語言與自動機理論、數據結構中樹及圖形算法;操作系統中存儲分配方式、人工智能中的貪婪算法、啟發式搜索技術;匯編指令系統等。編譯原理和高級語言程序設計聯系緊密,學好該門課程有利于學生對程序設計語言的理解,可以迅速掌握新的語言工具,在遇到新的程序語言時,學生不會因為沒有學過某一門語言而無從人手,這對學生今后從事軟件開發工作有重要價值。編譯原理課程蘊含著計算機學科中解決問題的思路和方法。學習編譯原理課程,不僅要學習如何構造編譯器,還要學習解決復雜和開放性問題的一般方法,從中接受的思維訓練將會在今后的學習、工作中逐漸體現其價值。
2 合理安排課程內容,突出重點,注重方法
廈門大學計算機科學系的編譯原理課程歷年采用經典編譯教材“編譯原理、技術與工具”,其中講解的核心編譯原理是教學內容的重要部分,包括詞法分析、語法分析、語義分析、中間代碼生成以及運行時環境、優化和代碼生成方法的基本技術,教材中對編譯前端的技術進行了詳細的闡述,但在一個學期60~64學時課堂講授中,往往無法詳盡地介紹所有內容,需要突出重點,對某些章節適當選擇。
例如,運行時環境中有關源程序語言相關問題的討論、非局部命名的訪問、參數傳遞等高級程序語言設計可略講,向學生列舉這些技術在哪些相關課程、書籍或文獻中找到參考,拓寬學生思路,培養其自學能力。代碼生成、代碼優化等編譯器后端技術限于學時數,往往涉及甚少,匆匆帶過。而這一部分內容對于編譯器構造十分重要,關系到生成代碼的質量,也是現代編譯技術的研究重點。在教學中可介紹代碼優化的主要來源、幾種經典的優化方法,優化的主要數據結構和實現技術,讓學生對這部分知識有所了解,便于將來深入學習。
又如,語法分析方法是編譯教學的重點,詳細介紹自頂向下分析和自底向上分析,LR分析中有LR(0)、SLR、LR(1)、LALR不同方法,若拘泥于教材逐一講授,學生較難接受,沒有頭緒。教師注重講授方法,在講解過程中不斷提出問題,尋求解決技術及其背后的原理。在語法分析講授中先介紹遞歸子程序法,可以用該方法編寫某些語法的語法分析器,但這必須對于每個文法手工編寫相應的編譯程序,教師提出是否可以找到非遞歸的自動生成語法分析器的方法問題,由此引出LL(1)分析方法。進一步提出LL(1)分析方法適應的文法是有限定的,是否有更普遍適用的分析方法問題,由此引出自底向上的LR分析方法,從SLR、LR(1)到LALR方法,每一種分析方法的引入相互關聯。這一方法能夠保證語法分析這一要點有清晰的脈絡貫穿,讓學生能把握這一主線。
語法制導定義及翻譯方案的設計是教學的重點和難點,也是學生學習中反映困難最大的內容。因為它沒有普適的一般方法,本質上是一種事件驅動的程序設計,這對于3、4年級的本科生較難掌握。如何把握課程難點的講授,值得深入探討。這一部分內容教師采用“歸納法”,在講解過程中圍繞語義描述和計算問題,結合具體實例尋求解決技術,闡述語法制導定義和翻譯的作用,強調這些技術將運用于解決類型分析和中間代碼生成的語義問題。可以將語義規則求值方法歸納為4點:
(1)由下向上計算S屬性定義:用帶屬性值的語法分析棧實現;
(2)由上向下計算L屬性定義:消除左遞歸后引入繼承屬性,擴充遞歸的語法分析器,可以實現預測翻譯器;
(3)由下向上計算繼承屬性:用加標記非終結符的方法,使得嵌入產生式右部的語義動作全部出現在產生式末尾,從而能在歸約之前執行語義動作;
(4)遍歷分析樹的翻譯方法,上述3種翻譯方法均和語法分析同時進行,但不是所有的SDD都能在語法分析同時完成,給出一般化的求值方法,先建立帶語義動作的語法分析樹,后遍歷執行語義動作,要求屬性依賴關系圖無環。
這一講解方法能更好地幫助學生理解抽象的問題,提高分析和綜合能力。
3 精心設計實踐環節
編譯原理是實踐性很強的課程,要真正理解編譯系統,單純依靠課堂講解理論知識是不夠的。實驗課程是培養學生實踐能力,鞏固和驗證所學理論知識,培養學生分析問題、解決問題能力的重要環節。通過實驗環節,使學生對編譯程序各功能部分間的接口有更好地理解,對算法的實現細節更明了。
在理想的情況下,完成一個完整的編譯系統構造,從詞法分析到目標代碼生成,直至匯編程序的執行,這有助于真正理解整個編譯過程,以及系統的運行過程。但在實際教學過程中,限于課時安排,實驗課和課堂講授同步進行,通常只能完成到中間代碼生成階段。編譯程序構造是復雜的程序開發,不可能在課堂教學中把所有細節講清楚,學生往往難以人手,在有限的時間內,實驗的效果不好。為了達到好的實驗效果,促進學生對編譯原理的理解,教師從以下幾個方面開展實驗環節教學實踐:
(1)注重自動工具的使用。利用kex/Yacc編譯器自動生成工具,先實現簡單的程序(如算術表達式的轉換/求值、HTML文件轉化成純文本文件、C源程序格式化轉化),所需知識限于正則表達式和自動生成工具本身的使用方法,對語義分析知識要求較少,可以提供相關的資料和網上相關教程,學生易于入手。目的是使學生體會到編譯原理的實用性,提高學習興趣,并獲得編譯器自動生成工具的使用經驗,提高解決實際問題的能力。
(2)分階段進行實驗。根據課程的特點和大綱的要求,可以設置4個階段的實驗內容,詞法分析器的設計實現、由上向下遞歸下降分析器的設計實現、利用工具生成的自底向上語法分析器、語義分析和中間代碼生成器的設計實現。每個階段需要利用之前得到的實驗成果,逐步完成編譯器系統的構造,通過明確的階段劃分,接口的定義,提高編譯原理實驗的完成質量。
(3)提供編譯器源代碼。編譯器構造是一個具有相當規模和相當復雜度的系統,對于本科學生獨立動手編寫小型語言的編譯器是有難度的。為了幫助學生掌握,結合一個小型語言編譯器構造的完整實例,提供編譯器構造的源代碼,要求學生對源代碼進行分析、擴充和改造,有助于學生的理解和掌握編譯原理的構造技術。例如Alfred Aho著的“編譯原理(第2版)”和“編譯原理(本科教學版)”附錄均給出了一個用Java語言實現的完整的編譯器前端,包括:源語言的文法描述、詞法分析器、語法分析器、符號表和類型、表達式的中間代碼、布xGT1aYGzCCzvU6NlgsCgNw==爾表達式的跳轉代碼、控制流語句的中間代碼,實現源程序到等價中間代碼的轉換。Kenneth C,Louden編著的“編譯原理與實踐”以Tiny語言編譯程序作為范例,結合各章內容講解Tiny語言編譯程序中的相關部分的實現方法。
4 對課程發展的思考
為培養高素質的計算機專業人才,重視軟件開發能力的培養至關重要。在編譯原理課程中強調理論知識的綜合應用和編程實踐能力的訓練,要求學生針對特定語言(如C語言的子集),從文法出發,設計一個編譯器構造方案,并以此為基礎開發滿足要求的編譯器,將其看作軟件開發的綜合訓練的重要一環。
編譯原理課程的實踐是在理論基礎知識的指導下進行。學生在學習基本理論后進行實驗系統的設計與實現;教師在掌握系統總體構成和基本原理、方法的基礎上提出實驗的基本要求。鼓勵學生選擇適當的方法進行系統設計,包括選擇自動化生成方法。為實現相應效果,要求學生在每個實驗之前應完成設計、描述解決方法并給出算法、編寫出源程序、給出測試實例,實驗完成后要求提交。學生對編譯課程內容積極投入,絕大多數學生都能夠在有限時間內獨立完成詞法分析和語法分析的實驗,較優秀的學生能夠獨立完成中間代碼生成的實驗。
在教學過程中也發現了一些不足,編譯原理的教學和實驗對后端工作不夠深入,尤其是實驗,往往到中間代碼生成階段已經接近學期末,目標代碼(匯編代碼)生成、寄存器分配、優化等沒有充分時間進行,對綜合運用C語言、計算機組成原理、匯編等知識鍛煉不夠。
5 結語
正所謂“教學相長”,提高編譯原理課程教學質量,需要教學雙方的共同努力,互相促進。對學生而言,要提高自身學習積極性,敢于提出問題、解決問題;對教師而言,在講授知識的同時,要注重學生能力的培養,激發學生的學習興趣,充實教學內容,提升教學質量,在教學實踐中不斷思考、探索、實踐和總結。
參考文獻:
[1]Aho A,Sethi R'Ullman J D.編譯原理[M],趙建華,譯,2版。北京:機械工業出版社,2009
[2]張昱,陳意云,鄭啟龍,編譯原理課程的教學方法和教材建設[J],中國大學教育,2005(7):61-62
[3]Aho A,Sethi R,Ullman J D.編譯原理[M],趙建華,譯,本科教學版,北京:機械工業出版社,2009
[4]Louden K C.編譯原理與實踐[M],馮博琴,馮嵐,譯,北京:機械工業出版社,2001:373-380
(編輯:趙廓)