崔光宇
摘 要:編譯原理是計算機(jī)專業(yè)的主干課程,主要是為了使學(xué)生了解高級程序設(shè)計語言源程序翻譯成計算機(jī)能處理的目標(biāo)代碼的整個過程,在整個專業(yè)教學(xué)體系中占有著重要的地位。文章分析了編譯原理教學(xué)過程的現(xiàn)狀以及存在的一些問題,進(jìn)行了一些研究,最主要的是針對關(guān)鍵知識點設(shè)計實驗,然后進(jìn)一步將編譯原理的各個部分整合為一個簡單的編譯器,把理論和實踐結(jié)合起來,加深學(xué)生對各部分知識的理解,同時也能提高學(xué)生設(shè)計大型系統(tǒng)的能力。
關(guān)鍵詞:編譯原理;課程實踐;教學(xué)創(chuàng)新研究
編譯器產(chǎn)生于20世紀(jì)60年代,在計算機(jī)學(xué)科技術(shù)發(fā)展中起到非常重要的作用,是計算機(jī)不可缺少的工具。掌握編譯器的原理對于計算機(jī)學(xué)習(xí)人員是最重要的基礎(chǔ)知識。在高校教學(xué)中,編譯原理主要是為了使學(xué)生了解高級語言源程序翻譯成計算機(jī)能處理的目標(biāo)代碼的整個過程,主要包括詞法分析、語法分析、語義分析、中間代碼生成、中間代碼優(yōu)化以及目標(biāo)代碼生成這6大部分。通過本課的學(xué)習(xí),學(xué)生可以系統(tǒng)掌握編譯的基本原理和基本技術(shù),對之前學(xué)習(xí)過的程序語言的設(shè)計與和實現(xiàn)有更好的理解,提高實踐能力。
編譯原理課程是計算機(jī)專業(yè)最難的課程之一,原因如下:(1)理論性很強,基本原理比較抽象,算法描述主要使用形式化語言,比如,有窮自動機(jī)、上下文無關(guān)文法等,與以往的學(xué)習(xí)有很大的差別,學(xué)生很難理解算法背后的精髓。(2)教學(xué)方式較為單一,因為理論知識過多,大部分學(xué)校為了保證教學(xué)進(jìn)度,時常以灌輸式為主,課堂上主要是編譯系統(tǒng)原理為主,忽視了具體實例的講解。(3)在實踐方面,編譯的算法較為復(fù)雜,對學(xué)生的編程能力以及邏輯思維能力都有很高的要求。因此,如何使用適當(dāng)?shù)姆椒ㄌ岣哒n程的教學(xué)效果,是當(dāng)前編譯原理教學(xué)中需要探討的重要問題。
1 研究現(xiàn)狀以及存在的問題
1.1 國內(nèi)外研究現(xiàn)狀
國外大學(xué)從20世紀(jì)60年代開始開設(shè)編譯課程,較為經(jīng)典的編譯原理教程有Aho等[1]編著的《Compilers: Principles, Techniques and Tools》(中文名:《編譯:原理,技術(shù)與工具》)與Appel等[2]編著的《Modern Compiler Implementation In Java/C++/ML》(中文名:《現(xiàn)代編譯原理—C語言描述》),這兩本書在編譯原理領(lǐng)域分別被稱為“龍書”“虎書”。“龍書”出現(xiàn)于1986年,第2版刪除了語法分析的算符優(yōu)先分析法、語法翻譯中遞歸計算方法等過時的技術(shù),增加了面向?qū)ο蟮木幾g、類型檢查等比較新新技術(shù)?!盎敝邪珻版本、Java版本,在“龍書”知識點基礎(chǔ)之上,增加了循環(huán)優(yōu)化等內(nèi)容。
近年來,國內(nèi)學(xué)校在編譯原理教學(xué)方面也積累了大量的經(jīng)驗,上海交通大學(xué)張冬茉等[3]提出了現(xiàn)階段進(jìn)行大型編譯原理課程設(shè)計的教學(xué)模式和方法,使學(xué)生能夠通過實現(xiàn)一個實用的編譯系統(tǒng),提高對編譯原理的認(rèn)識。合肥師范學(xué)院祖弦等[4]針對核心知識點,設(shè)計實驗教學(xué)案例,探討在實驗案例驅(qū)動下的編譯原理課程教學(xué)創(chuàng)新方案。
1.2 存在的問題
1.2.1 學(xué)生對于課程的認(rèn)識模糊
大部分學(xué)生對于編譯原理的認(rèn)識在于,認(rèn)為學(xué)習(xí)編譯原理的目的,是構(gòu)建一個完整的編譯器。然而大部分大學(xué)生在畢業(yè)后,制作編譯器的可能性很小,學(xué)生很難提高學(xué)習(xí)興趣。
1.2.2 編譯原理理論抽象,算法比較復(fù)雜
相較于以往學(xué)習(xí)的課程,編譯原理課程對于學(xué)生而言十分的抽象,比如有窮自動機(jī)等,學(xué)生理解不易,同時,課程中有很多復(fù)雜的算法,對于大部分大學(xué)生來說都很難掌握。
1.2.3 程序設(shè)計要求比較高
課程設(shè)計部分要求學(xué)生使用學(xué)過的C,C++,C#,Java等語言實現(xiàn),由于算法本身比較復(fù)雜,對學(xué)生編程能力有較高的要求,然而大部分學(xué)生在之前的學(xué)習(xí)中并沒有很好地掌握以上編程語言,使得課程設(shè)計更加困難。
2 教學(xué)創(chuàng)新措施
2.1 明確學(xué)生學(xué)習(xí)編譯原理的作用
雖然很少有人從事編譯方面的工作,但是學(xué)習(xí)編譯的整個過程對于學(xué)生學(xué)習(xí)計算機(jī)科學(xué)的理論、技術(shù)和方法都是很有效地提高,而且編譯原理的很多原理、算法不僅局限于編譯本身。學(xué)好編譯原理的一些算法和原理,對計算機(jī)很多問題的解決都能夠起到很好的作用。此外,完整地編寫一個編譯程序,為學(xué)生提供了很好的編寫大型程序的實例,非常有利于學(xué)生以后對于大型程序的編寫。
同時,在大三課程中設(shè)置編譯原理,其學(xué)習(xí)中融合了多門以往的課程內(nèi)容,比如高級語言、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)、匯編語言等,這使得學(xué)生能更好地理解以往學(xué)習(xí)內(nèi)容的實際應(yīng)用,還能更好地提高學(xué)生的程序設(shè)計能力。
2.2 教學(xué)方法的創(chuàng)新
編譯原理課程理論性很強,實踐性也很強,是兩者相結(jié)合的課程。理論部分知識枯燥、抽象、難學(xué)。所以在講理論時可以將理論、算法部分采用實例驅(qū)動的方法,將抽象的知識結(jié)合到一個個實際問題中去。在解決問題過程中,介紹基本原理和算法,這樣學(xué)生可以很好地理解原理和算法在實際問題中的作用,提高學(xué)生的分析問題、解決問題的能力。
2.3 編譯原理實驗環(huán)節(jié)的設(shè)計
實驗是培養(yǎng)學(xué)生應(yīng)用能力最直接的手段,鑒于學(xué)生的編程能力,增加適當(dāng)難度的實驗,加強學(xué)生對重要知識點的認(rèn)識和理解。實驗總體分為兩部分:一是對編譯原理課程中的關(guān)鍵方法的實驗,二是整體的設(shè)計一個簡單的編譯器。
2.3.1 詞法分析器的設(shè)計
詞法分析器實驗:制作一個讀單詞過程,源程序保存在文本文件中,讀取該文件,識別出各個具有獨立意義的單詞,即基本保留字、標(biāo)識符、常數(shù)、運算符、分界符5大類。依次輸出各個單詞的內(nèi)部單詞種別及單詞符號自身值,遇到錯誤時可顯示“Error”,然后跳過錯誤部分繼續(xù)顯示。
2.3.2 語法分析器的設(shè)計
語法分析器實驗:設(shè)計、開發(fā)一個高級語言的LL(1)語法分析程序,實現(xiàn)對源程序的語法檢查和結(jié)構(gòu)分析,加深學(xué)生對頂向下語法分析、First集、Follow集、Select集、判斷LL(1)文法的方法、文法等價變換、LL(1)分析表的構(gòu)造、對某一輸入串的分析過程的理解。endprint
2.3.3 語義檢查和中間代碼生成的設(shè)計
語法檢查和中間代碼生成實驗:設(shè)計、開發(fā)一個高級語言的語義檢查和中間代碼生成程序,加深對語法制導(dǎo)翻譯技術(shù)、類型確定、類型檢查、常見可執(zhí)行語句(如賦值語句、條件語句、循環(huán)語句)翻譯技術(shù)的理解。
2.3.4 代碼優(yōu)化的設(shè)計
代碼優(yōu)化實驗:設(shè)計、開發(fā)一個高級語言的代碼優(yōu)化程序,包括簡單的局部優(yōu)化、循環(huán)優(yōu)化和全局優(yōu)化,加深學(xué)生對代碼優(yōu)化重要性的認(rèn)識。
2.3.5 目標(biāo)代碼生成的設(shè)計
目標(biāo)代碼生成實驗:目標(biāo)代碼生成是把源程序的中間代碼轉(zhuǎn)換成等價的目標(biāo)代碼,在這里,設(shè)計、開發(fā)一個簡單的代碼生成器,能將中間代碼(四元式形式)轉(zhuǎn)換成目標(biāo)代碼。設(shè)計過程中,引進(jìn)目標(biāo)指令與四元式對照表,便于轉(zhuǎn)換。
2.3.6 編譯器的設(shè)計
以上5組實驗對于編譯過程中的6大部分重點方法進(jìn)行了實踐,由于比較分散,大部分學(xué)生不能很好地理解每個部分是如何在整個編譯系統(tǒng)中達(dá)到協(xié)調(diào)工作的。經(jīng)過一個學(xué)期的學(xué)習(xí),開設(shè)一周左右的集中課程設(shè)計。目的是為了設(shè)計一個相對完整的編譯器。題目較為簡單,學(xué)生可以根據(jù)學(xué)生自身情況自行設(shè)計一個適合自己難度的做法,基礎(chǔ)較差的同學(xué),可以針對題目設(shè)計一些最為基礎(chǔ)的算法,而基礎(chǔ)較好的同學(xué)可以將編譯中多種算法融入編譯器中,最終生成一個簡單的編譯器。通過這個設(shè)計,學(xué)生能夠系統(tǒng)地理解編譯的整個過程。
3 結(jié)語
在編譯原理課程教學(xué)過程中,針對現(xiàn)存的一些問題,本文進(jìn)行了一些創(chuàng)新研究。最為重要的措施是提出了一套實驗教學(xué)方法,很好地提高了學(xué)生學(xué)習(xí)興趣,更好地讓學(xué)生理解和掌握了課程重要算法,并通過制作一個編譯器,把編譯原理的所有內(nèi)容達(dá)到一個融會貫通的目的,培養(yǎng)了學(xué)生編程能力,達(dá)到了提高教學(xué)質(zhì)量的目的。
[參考文獻(xiàn)]
[1]AHO A V,SETHI R,ULLMAN J D.Compilers:principles, techniques and tools[M].New York:Additions Wesley,1986.
[2]APPEL A W,JEOS P.Modern compiler implementation in Java/C++/ML[M].New York:Cambridge,1997.
[3]張冬茉,方習(xí)文.編譯原理課程設(shè)計的教學(xué)實踐和改革[J].實驗室研究與探索,2012(11):134-137.
[4]祖弦,朱強,謝飛.實驗案例驅(qū)動的編譯原理教學(xué)改革探討[J].合肥師范學(xué)院學(xué)報,2017(3):74-76.
Abstract:Compiler principle is the main course of computer science, primarily to enable students to understand the entire process of source code of high-level programming language translated into object code which computer can handle, it occupies an important position in the whole teaching system. This article analyzes the current situation and problems in teaching compiler principle, explores the teaching contents and method. The most important thing is to design experiments for key knowledge points, and then integrated the various parts into a simple compiler, combined theory with practice, deepened students understanding of the various parts of knowledge, also improve the ability to design large systems.
Key words:compiler principle; curriculum practice; research on teaching innovationendprint