崔光宇
摘 要:文章介紹了“編譯原理”在計(jì)算機(jī)專業(yè)中的重要地位,分析了學(xué)生學(xué)習(xí)該課程過(guò)程中存在的難點(diǎn)。提出了對(duì)“編譯原理”課程實(shí)驗(yàn)教學(xué)建設(shè)的一些想法和建議,并分析了這些變化對(duì)學(xué)生產(chǎn)生的影響。
關(guān)鍵詞:編譯原理;實(shí)驗(yàn)教學(xué);建設(shè)
“編譯原理”是計(jì)算機(jī)專業(yè)非常重要的一門專業(yè)課,在計(jì)算機(jī)教學(xué)中有著舉足輕重的地位。同時(shí),編譯系統(tǒng)是整個(gè)計(jì)算機(jī)系統(tǒng)中極其重要的系統(tǒng)軟件,它的作用是把計(jì)算機(jī)高級(jí)語(yǔ)言最終翻譯成等價(jià)的計(jì)算機(jī)指令,從而保證高級(jí)程序設(shè)計(jì)語(yǔ)言順利運(yùn)行。所以,“編譯原理”是計(jì)算機(jī)科學(xué)中基本研究?jī)?nèi)容之一。
“編譯原理”課程主要介紹了編譯的基本原理、技術(shù)以及實(shí)現(xiàn)的方法。主要包括詞法分析、語(yǔ)法分析、語(yǔ)義分析、中間代碼生成、代碼優(yōu)化、目標(biāo)代碼生成等六大部分。通過(guò)以上學(xué)習(xí),使學(xué)生系統(tǒng)掌握設(shè)計(jì)一般編譯器的原理和方法,也能夠同時(shí)加深學(xué)生對(duì)高級(jí)語(yǔ)言的認(rèn)識(shí),提高學(xué)生的綜合編程水平和算法設(shè)計(jì)能力。
“編譯原理”是計(jì)算機(jī)專業(yè)中最難的一門專業(yè)課之一,在理論上要求學(xué)生掌握形式語(yǔ)言和自動(dòng)機(jī)等比較抽象的概念,在技術(shù)上要求學(xué)生能熟練利用各種方法設(shè)計(jì)程序,因此對(duì)學(xué)生的各方面水平要求比較高,對(duì)學(xué)生來(lái)說(shuō)具有很大的挑戰(zhàn)性。
1 “編譯原理”課程教學(xué)現(xiàn)狀
“編譯原理”課程目前在教學(xué)中出現(xiàn)的問(wèn)題主要有以下幾方面。
(1)編譯課程內(nèi)容抽象,采用以往灌輸式的教學(xué)模式,教學(xué)方法單一,無(wú)法讓學(xué)生提起興趣?!熬幾g原理”課程中的概念和算法大都是以符號(hào)、自動(dòng)機(jī)、屬性文法等抽象度很高的形式描述,光看教材會(huì)難免覺(jué)得枯燥無(wú)味。如果教師還是用以往的方式灌輸式教學(xué),那么因?yàn)樯鲜龅脑?,在整個(gè)教學(xué)中,學(xué)生學(xué)習(xí)知識(shí)很被動(dòng),學(xué)習(xí)知識(shí)缺乏動(dòng)力,造成課難學(xué)的印象。
(2)學(xué)生學(xué)習(xí)過(guò)程中常常會(huì)認(rèn)為編譯在開(kāi)發(fā)軟件過(guò)程中應(yīng)用不多,因此也很難提起學(xué)生的主動(dòng)性。“編譯原理”這門課程包含的知識(shí)和算法,都有很高的難度。與此同時(shí),學(xué)生覺(jué)得教材中的理論知識(shí)和算法應(yīng)用性不強(qiáng)。編譯原理中很多算法,比如LL和LR語(yǔ)法分析算法,代碼優(yōu)化技術(shù)等,只有在編譯開(kāi)發(fā)中能用到,而學(xué)生也不會(huì)從事這方面的研發(fā),加上實(shí)現(xiàn)難度過(guò)大,會(huì)給學(xué)生造成難學(xué)的印象。
(3)學(xué)生之前學(xué)習(xí)高級(jí)語(yǔ)言程序設(shè)計(jì),數(shù)據(jù)結(jié)構(gòu)等課程掌握程度不好,也會(huì)影響學(xué)生的學(xué)習(xí)情況?!熬幾g原理”是大三的課程,它的先修課程一般在大一大二學(xué)習(xí),如果學(xué)生之前就沒(méi)有很好的學(xué)習(xí)相關(guān)知識(shí),就會(huì)感到學(xué)習(xí)非常困難,比如數(shù)據(jù)結(jié)構(gòu)中的“棧”,如果不了解,就會(huì)直接影響語(yǔ)法分析的理解和上機(jī)操作。
(4)課時(shí)有限,有時(shí)剛上完課,學(xué)期就結(jié)束了。由于高校的改革,很多課程都遭到壓縮,給教學(xué)帶來(lái)了一定的難度。很多高校在實(shí)驗(yàn)課上進(jìn)行了壓縮,僅僅學(xué)習(xí)編譯的理論和算法,沒(méi)有相應(yīng)的實(shí)踐,使得學(xué)生無(wú)法將理論具體、形象化,就難以更好地理解運(yùn)用,更難說(shuō)全面融會(huì)貫通整個(gè)編譯器。
以上問(wèn)題的焦點(diǎn)在于,本身編譯就已經(jīng)很抽象了,學(xué)生晦澀難懂,如果再?zèng)]有相應(yīng)的實(shí)驗(yàn)做支撐,難免會(huì)讓學(xué)生有難學(xué)的印象,從而進(jìn)一步影響編譯課程的教學(xué)質(zhì)量。因此,在理論學(xué)習(xí)的同時(shí),如何在有限的時(shí)間做好相關(guān)的實(shí)驗(yàn)教學(xué),使得整個(gè)教學(xué)過(guò)程鮮活起來(lái),讓學(xué)生真正認(rèn)識(shí)到編譯是計(jì)算機(jī)的重要課程,必須學(xué)好,對(duì)以后算法設(shè)計(jì),程序設(shè)計(jì)都會(huì)帶來(lái)巨大幫助,是教學(xué)中必須面對(duì)并解決的問(wèn)題。
近年來(lái),國(guó)內(nèi)學(xué)校在“編譯原理”教學(xué)方面也積累了大量的經(jīng)驗(yàn),上海交通大學(xué)張冬茉等[1]提出了現(xiàn)階段進(jìn)行大型“編譯原理”課程設(shè)計(jì)的教學(xué)模式和方法,使學(xué)生能夠通過(guò)實(shí)現(xiàn)一個(gè)實(shí)用的編譯系統(tǒng),提高對(duì)編譯原理的認(rèn)識(shí)。合肥師范學(xué)院祖弦等[2]針對(duì)每部分的核心知識(shí)點(diǎn),設(shè)計(jì)實(shí)驗(yàn)教學(xué)實(shí)例,探討在實(shí)驗(yàn)案例驅(qū)動(dòng)下的“編譯原理”課程教學(xué)創(chuàng)新方案。
2 實(shí)驗(yàn)教學(xué)建設(shè)
“編譯原理”課程理論性很強(qiáng),實(shí)踐性更強(qiáng),是兩者相結(jié)合的課程。理論部分抽象、難懂。所以,在理綸學(xué)習(xí)過(guò)程中,適當(dāng)?shù)卮┎鍖?shí)驗(yàn),可以加強(qiáng)學(xué)生對(duì)重要知識(shí)點(diǎn)的認(rèn)識(shí)和理解,同時(shí)也可以很好地培養(yǎng)學(xué)生的編程能力。實(shí)驗(yàn)總體分為兩部分:(1)對(duì)“編譯原理”中每一部分重要方法做相應(yīng)的實(shí)驗(yàn)。(2)最終整合這些部分,成為一個(gè)簡(jiǎn)單的編譯器。
2.1 詞法分析器
使用DOS環(huán)境輸入字符串序列(以‘#作為結(jié)束標(biāo)志)作為源程序,調(diào)用詞法掃描程序?qū)⒆址远M的形式進(jìn)行輸出(若有不屬于語(yǔ)言單詞的符號(hào)出現(xiàn),則做出錯(cuò)處理),詞法掃描程序包括了對(duì)源程序的預(yù)處理(忽略無(wú)用空格、回車符,換行符等空白符),以及對(duì)單詞的識(shí)別和分類,以形成(單詞種別,單詞自身的值)形式的二元組,并將用戶自定義變量信息存入程序變量信息表中。
2.2 語(yǔ)法分析
使用自上而下的遞歸下降分析法,從文法開(kāi)始符號(hào)出發(fā),根據(jù)文法規(guī)則正向推導(dǎo)出給定的句子。根據(jù)遞歸下降的分析函數(shù)編寫規(guī)則來(lái)編寫相應(yīng)函數(shù),在各個(gè)函數(shù)分析過(guò)程中調(diào)用詞法分析程序中掃描程序,發(fā)出“取下一個(gè)單詞”的命令,從而取得下一個(gè)單詞符號(hào)作語(yǔ)法分析。
2.3 語(yǔ)義分析和中間代碼生成
在語(yǔ)義分析和中間代碼生成的階段,采用語(yǔ)法制導(dǎo)翻譯方法,用屬性文法作為工具來(lái)描述程序設(shè)計(jì)語(yǔ)言的語(yǔ)義。首先審查詞法分析得到的每個(gè)語(yǔ)法結(jié)構(gòu)的靜態(tài)語(yǔ)義,如果靜態(tài)語(yǔ)義正確再生成中間代碼(課設(shè)中預(yù)采用四元式)。
2.4 代碼優(yōu)化
代碼優(yōu)化部分,設(shè)計(jì)開(kāi)發(fā)一個(gè)代碼優(yōu)化程序,將上一步出現(xiàn)的四元式,進(jìn)行包括局部、循環(huán)和全局等優(yōu)化,學(xué)生將優(yōu)化后的四元式和優(yōu)化前的作比較,了解優(yōu)化在編譯中的重要作用。
2.5 目標(biāo)代碼生成
目標(biāo)代碼生成是編譯的最后一個(gè)階段,根據(jù)符號(hào)表等信息,將中間代碼轉(zhuǎn)化成為等價(jià)的目標(biāo)代碼。為了減少訪問(wèn)計(jì)算機(jī)內(nèi)存的次數(shù),應(yīng)盡可能把基本塊內(nèi)仍然要被引用的變量放到寄存器中,而把基本塊內(nèi)不再使用的變量所占的寄存器釋放。為了隨時(shí)掌握寄存器使用情況和變量的存放情況,以便生成合適的目標(biāo)代碼,可以建立寄存器描述表以及變量地址描述表。
2.6 簡(jiǎn)單編譯器的設(shè)計(jì)
以上5組實(shí)驗(yàn)對(duì)于編譯過(guò)程中的六大部分重點(diǎn)方法進(jìn)行了實(shí)驗(yàn),由于內(nèi)容較為分散,大部分學(xué)生不能很好地了解編譯器每個(gè)部分是怎么在整個(gè)編譯系統(tǒng)中達(dá)到協(xié)調(diào)工作的。經(jīng)過(guò)一個(gè)學(xué)期的學(xué)習(xí),除了在平時(shí)上課過(guò)程中設(shè)計(jì)對(duì)于每一部分重要知識(shí)點(diǎn)的單獨(dú)編程,還將開(kāi)設(shè)四學(xué)時(shí)的集中課程設(shè)計(jì)。目的是為了設(shè)計(jì)一個(gè)比較完整的的編譯器。題目較為開(kāi)放(見(jiàn)圖1),是將一個(gè)高級(jí)語(yǔ)言的一個(gè)語(yǔ)句翻譯成最終的目標(biāo)代碼的過(guò)程,學(xué)生可以根據(jù)學(xué)生自身情況自行設(shè)計(jì)一個(gè)適合自己程度的做法:基礎(chǔ)較差的同學(xué),可以針對(duì)題目設(shè)計(jì)一些較為基礎(chǔ)的算法,而基礎(chǔ)較好的同學(xué)可以將編譯中諸多算法融入編譯器中,最終生成一個(gè)較為復(fù)雜的編譯器。通過(guò)這個(gè)設(shè)計(jì),能夠使學(xué)生系統(tǒng)地理解編譯的整個(gè)過(guò)程。由于現(xiàn)在大部分計(jì)算機(jī)系同學(xué)都配有電腦,加上本身編譯課程時(shí)間比較緊張,這次課程設(shè)計(jì)的大部分內(nèi)容學(xué)生可以自行實(shí)踐并上交實(shí)驗(yàn)報(bào)告。
在做以上實(shí)驗(yàn)過(guò)程中,可以適當(dāng)?shù)刈龇纸M,讓組內(nèi)同學(xué)進(jìn)行實(shí)驗(yàn)內(nèi)容討論,研究出實(shí)驗(yàn)設(shè)計(jì)方案,并設(shè)計(jì)程序,以小組為單位上交實(shí)驗(yàn)報(bào)告,提高學(xué)生團(tuán)隊(duì)協(xié)作能力。
3 結(jié)語(yǔ)
在“編譯原理”實(shí)驗(yàn)教學(xué)中,對(duì)這門課程實(shí)驗(yàn)內(nèi)容以及形式做了以上改革,收到了一定的成效。這次改革最為主要的是讓學(xué)生把編譯器各個(gè)部分的實(shí)驗(yàn)整合為一個(gè)編譯器,把編譯所學(xué)的內(nèi)容能夠融會(huì)貫通,更好地學(xué)習(xí)了“編譯原理”這門課程,同時(shí)在一定程度上培養(yǎng)了學(xué)生編程能力以及團(tuán)隊(duì)協(xié)作能力。
[參考文獻(xiàn)]
[1]張冬茉,方習(xí)文.編譯原理課程設(shè)計(jì)的教學(xué)實(shí)踐和改革[J].實(shí)驗(yàn)室研究與探索,2012(11):134-137.
[2]祖弦,朱強(qiáng),謝飛.實(shí)驗(yàn)案例驅(qū)動(dòng)的編譯原理教學(xué)改革探討[J].合肥師范學(xué)院學(xué)報(bào),2017(3):74-76.