侯書東,常家琦,劉 恒
(安徽工業(yè)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,安徽 馬鞍山 243002)
編譯原理作為計(jì)算機(jī)類專業(yè)的傳統(tǒng)核心課程,對(duì)學(xué)生專業(yè)系統(tǒng)能力的培養(yǎng)具有重要意義。編譯原理課程的重要性在于:編譯器的開發(fā)是計(jì)算機(jī)軟件開發(fā)的一個(gè)綜合;解決問題的思想方法有利于計(jì)算思維的培養(yǎng),對(duì)于計(jì)算機(jī)專業(yè)素養(yǎng)形成十分必要[1]。
計(jì)算機(jī)類專業(yè)本科生學(xué)習(xí)本專業(yè)的第一門語言課程是C語言。C語言由于其類型不安全性,容易出現(xiàn)一些難以捉摸的錯(cuò)誤,使得學(xué)生難以定位和解決問題。如果能讓學(xué)生根據(jù)編譯器提供的提示信息,精確定位程序中的錯(cuò)誤類型和位置,把編譯原理中所學(xué)用于實(shí)際C語言編程需求,這既完成了課程的教學(xué)內(nèi)容,也提升了學(xué)生的軟件編程和系統(tǒng)分析的能力。
從普通高等院校的編譯原理教學(xué)實(shí)際出發(fā),其課程覆蓋范圍一般僅限于編譯器的前端,即詞法分析、語法分析和語法制導(dǎo)翻譯等內(nèi)容[2]。這其中包括大量抽象且邏輯復(fù)雜的理論知識(shí)點(diǎn),如形式語言理論、正規(guī)式、有限自動(dòng)機(jī)、上下文無關(guān)文法、屬性文法和語法制導(dǎo)翻譯等。傳統(tǒng)的教學(xué)方式強(qiáng)調(diào)知識(shí)點(diǎn)的灌輸,讓學(xué)生解決孤立的單一問題,缺乏各知識(shí)點(diǎn)之間的關(guān)聯(lián)。這種“只見樹木,不見森林”的教學(xué)方式會(huì)極大地削弱學(xué)生的學(xué)習(xí)積極性,導(dǎo)致整體效果不佳。
理論教學(xué)的重要性不言而喻,然而面對(duì)當(dāng)前社會(huì)“碎片化學(xué)習(xí)”,要確保授課效果的高質(zhì)量,需要對(duì)課堂內(nèi)容的選擇和教學(xué)方式的安排進(jìn)行精心設(shè)計(jì)。尤為重要的是激發(fā)學(xué)生的學(xué)習(xí)熱情,實(shí)現(xiàn)從被動(dòng)接受到主動(dòng)學(xué)習(xí)過程的角色轉(zhuǎn)換。
理論知識(shí)的來源一般都有其確定的問題背景。脫離實(shí)際問題來進(jìn)行理論教學(xué),對(duì)學(xué)生實(shí)際能力的提升沒有益處。編譯原理課程中的大量理論知識(shí),存在一種銜接遞進(jìn)的關(guān)系,每個(gè)知識(shí)點(diǎn)的引入和拓展,都是對(duì)于現(xiàn)實(shí)遇到問題的解決路徑再現(xiàn)。因此,整個(gè)授課過程就在重現(xiàn)這種解決方案演變的變化歷程。而實(shí)現(xiàn)這一目標(biāo)的關(guān)鍵之處,是教師從之前的“站到講臺(tái)前”變到現(xiàn)在的“坐在學(xué)生中”。這一變化絕不僅僅是簡(jiǎn)單地將所有問題留給學(xué)生,從“講授”變成“答疑”,而是從問題設(shè)計(jì)、思考啟迪、討論引導(dǎo)到過程管理等各方面都對(duì)教師提高了要求。特別是現(xiàn)代高級(jí)語言發(fā)展日新月異,各種新問題層出不窮,如何在面對(duì)開放性的未知問題時(shí),從系統(tǒng)和整體的角度給出學(xué)生解決問題的方式方法,而不是給出具體每個(gè)問題的回答[3],這是對(duì)教師能力的一種新考驗(yàn)。
計(jì)算機(jī)類專業(yè)課程教學(xué)的目的,歸根結(jié)底是以培養(yǎng)和提升學(xué)生們現(xiàn)實(shí)動(dòng)手能力為主題?!翱荚嚫叻帧眱H是手段,“實(shí)踐高手”才是目的。通過精心設(shè)計(jì)的問題場(chǎng)景,激發(fā)學(xué)生的學(xué)習(xí)興趣,逐步引導(dǎo)討論內(nèi)容,得到初步解決方案,再層層優(yōu)化,最后比較與經(jīng)典方法的優(yōu)劣之處。這樣的理論與實(shí)踐交叉的教學(xué)方式,可以讓學(xué)生從根源上理解并掌握理論技術(shù)的來龍去脈,避免繁雜的死記硬背以及理論與實(shí)踐脫節(jié),在實(shí)踐中學(xué)習(xí)和總結(jié)規(guī)律。
在編譯原理課程教學(xué)里,以詞法分析為例闡述如何從正規(guī)式構(gòu)造等價(jià)自動(dòng)機(jī)的內(nèi)容必不可少。在先修的高級(jí)語言課程中,學(xué)生只需知道如何運(yùn)用正規(guī)式。而在本課程學(xué)習(xí)中,則需進(jìn)一步掌握正規(guī)式的實(shí)現(xiàn)原理。正規(guī)式的實(shí)現(xiàn)方式主要有非確定有限自動(dòng)機(jī)(NFA)和確定有限自動(dòng)機(jī)(DFA)兩種引擎方式。在教學(xué)過程中,常規(guī)流程都是給定正規(guī)式,構(gòu)造其NFA,在此基礎(chǔ)上轉(zhuǎn)化為DFA,最后進(jìn)行最簡(jiǎn)化處理。這在無形中向?qū)W生暗示了DFA才是詞法分析實(shí)現(xiàn)的最終手段,其實(shí)不然,兩種引擎方式各有其優(yōu)缺點(diǎn)和應(yīng)用場(chǎng)景。DFA是文本主導(dǎo),執(zhí)行速度快,可以確保匹配最長(zhǎng)的可能字符串,滿足結(jié)果一致性。NFA是表達(dá)式主導(dǎo),需要反復(fù)的吃、吐字符,存在著大量的回溯過程,速度慢。但是其特性豐富,可以捕獲子表達(dá)式匹配和匹配的反向引用。子表達(dá)式編寫方式不同,對(duì)于DFA是無差異的,但是對(duì)NFA的控制方式是不同的。如果能從編碼實(shí)現(xiàn)的角度考慮這兩種方式的異同,啟迪學(xué)生的獨(dú)立思考能力,其教學(xué)效果要明顯優(yōu)于枯燥的理論知識(shí)傳授。
以編譯原理課程教學(xué)中語法分析中的算符優(yōu)先分析為例,在討論終結(jié)符之間的優(yōu)先關(guān)系時(shí),與傳統(tǒng)認(rèn)知是有一定區(qū)別的。此處有必要回顧“離散數(shù)學(xué)”中對(duì)于“關(guān)系”的定義。回顧恒等關(guān)系的定義,需要同時(shí)滿足自反性、對(duì)稱性和傳遞性。顯然,算符之間的優(yōu)先關(guān)系是可以不滿足這三種性質(zhì)的。以四則運(yùn)算為例,存在+>+,即加號(hào)的優(yōu)先級(jí)是大于加號(hào)的,不滿足自反性。同時(shí),由于(=),而不存在)=(,所以不滿足對(duì)稱性。另外,同時(shí)存在+<(、(<+和+>+同時(shí)成立,不符合傳遞性的性質(zhì)。這中間的區(qū)別就在于不僅需要考慮待比較的兩個(gè)算符,算符出現(xiàn)的先后順序也至關(guān)重要。至此,算符之間的優(yōu)先級(jí),與自然數(shù)的大小比較、或者與線程調(diào)度中的優(yōu)先級(jí)等概念中的區(qū)別之處自然顯現(xiàn)。這也引出了后續(xù)算符優(yōu)先函數(shù)的方便與不足之處。這種先后課程之間知識(shí)點(diǎn)的貫通,既加深了對(duì)已有知識(shí)的理解,同時(shí)也更新了知識(shí)圖譜。
編譯原理課程教學(xué)理想情況,學(xué)生應(yīng)該能夠獨(dú)立自主完成小型編譯系統(tǒng)的構(gòu)造。實(shí)際教學(xué)中,學(xué)生只需吃透關(guān)鍵的幾條原理知識(shí),如NFA的確定化,LL(1)文法中FIRST和FOLLOW集合的構(gòu)造,LR(1)文法中識(shí)別活前綴DFA構(gòu)造等,基本上已經(jīng)滿足了課程考試要求。然而,僅靠理論學(xué)習(xí)對(duì)實(shí)現(xiàn)一個(gè)基礎(chǔ)編譯器來說是遠(yuǎn)遠(yuǎn)不足的。相比較于學(xué)生對(duì)理論知識(shí)的接受程度,學(xué)生自主動(dòng)手完成編譯系統(tǒng)的能力缺乏就更為明顯。如何面對(duì)全體學(xué)生,制定出一套適用的實(shí)踐方案,是課程實(shí)際效用的關(guān)鍵。
對(duì)于編譯原理課程復(fù)雜實(shí)現(xiàn)機(jī)理可以在后續(xù)過程中逐步展開,串聯(lián)起數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)、組成原理等一系列關(guān)聯(lián)課程,讓其學(xué)而有物。對(duì)于學(xué)有余力的學(xué)生,可以提高要求,讓其完成類C編譯器。對(duì)于確實(shí)難以獨(dú)立完成的,最基本的要求是可以復(fù)現(xiàn)課程演示的四則運(yùn)算。要求不同,體現(xiàn)在設(shè)計(jì)語言的復(fù)雜度不同。囿于師資力量薄弱,對(duì)于編譯器的設(shè)計(jì)要求以前端為主,關(guān)于目標(biāo)代碼生成了解即可,不做具體要求。
以布爾表達(dá)式的翻譯模式為例,通過語法制導(dǎo)翻譯內(nèi)容的學(xué)習(xí),對(duì)于條件表達(dá)式中的短路規(guī)則的設(shè)計(jì)初衷已了然于胸。然而如何最小化跳轉(zhuǎn)語句的出現(xiàn),掌握回填技術(shù)的使用,乃至初涉獨(dú)立于機(jī)器的優(yōu)化過程,對(duì)于編譯器實(shí)現(xiàn)質(zhì)量的優(yōu)劣影響至遠(yuǎn)。僅僅明白基本原理的應(yīng)用,缺乏對(duì)軟件實(shí)現(xiàn)細(xì)節(jié)的敏感度和執(zhí)行效率的考量,很難滿足實(shí)用性的要求。特別是在面對(duì)“流量決定一切”的時(shí)代,用戶體驗(yàn)對(duì)于產(chǎn)品品質(zhì)的要求日益挑剔,任何細(xì)節(jié)之處的忽略都可能面臨致命的打擊。不求功能的復(fù)雜全面,但求體驗(yàn)的流暢舒適,在系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)的全過程中,將用戶需求作為第一位,對(duì)于端正學(xué)生的學(xué)習(xí)和工作態(tài)度,是一次很好的鍛煉機(jī)會(huì)。
通過精心設(shè)計(jì)的問題引導(dǎo)與自動(dòng)化編譯工具,逐步展開編譯器設(shè)計(jì)的主要內(nèi)容,教學(xué)既不失課程的專業(yè)性要求又吸引了學(xué)生的興趣點(diǎn),能有效提升學(xué)生的綜合實(shí)踐能力。在后續(xù)教學(xué)改革中,借助慕課、反轉(zhuǎn)等多樣教學(xué)形式,增加課堂討論、啟發(fā)、互動(dòng)的過程,最大限度地激發(fā)學(xué)生的學(xué)習(xí)熱情,仍需不斷地探索和嘗試。