編譯原理小論文

編譯原理小論文

  編譯原理是計算機專業的一門重要專業課,旨在介紹編譯程式構造的一般原理和基本方法。那麼編譯原理小論文要怎麼寫呢?不妨來參考一下小編帶來的編譯原理小論文樣本。希望大家喜歡哦!

  編譯原理小論文

  摘要:本文探討了在計算機軟體技術快速發展的情況下,高校計算機類專業編譯原理課程的改革問題。提出了編譯原理課程教學模型從過程式向物件式的轉變、編譯程式的面向物件構造(包括編譯演算法的描述)等問題,以及由此帶來的教學內容的調整和課程實驗的設計問題。

  關鍵詞:編譯程式;教學改革;物件式程式設計;Java

  1 引言

  編譯原理課程是高校計算機類專業的重要基礎和骨幹課程。編譯原理對計算機專業的學生的重要性與高等數學對理科學生的重要性幾乎可以相提並論。同時,由於這門課程涉及其他多門課程的知識,使得它成為大學階段中最難學的課程之一。

  從表面上看,編譯程式是將高階語言源程式翻譯成低階語言程式,但編譯程式構造的基本原理和技術也廣泛應用於一般軟體的設計和實現,其中的設計思想、演算法、思維方式和技術都可能會對學生今後的職業發展產生比較大的影響。

  當今,程式設計已經基本上從傳統的過程式轉向物件式,並且正在從物件式轉向元件型。這其實是程式設計範型的變遷,是在計算機技術背景下認識世界的觀點的變化:過程式將完成事務看成是一系列的步驟,而物件式卻將世界看成是由一系列物件組成的,這些物件之間互動合作完成特定的事務。從過程式到物件式,有著質的變化,而非一般的修改和完善,由此帶來了語言(演算法描述工具)的變化。程式語言影響思維,面向物件的思維方法又促進了程式語言的發展。

  目前,程式設計的一些後繼課程,如資料結構等都進行了同步跟進,出現了諸如用C++或Java描述的資料結構教材。但編譯原理課程卻沒有及時跟進,上述改變基本上沒有反映到編譯原理課程中。這門課程近20年來基本上沒有大的變化,教學內容仍然是基於過程式語言展開的,編譯演算法和模型描述是用PASCAL語言或者C語言。雖然個別教材加入了少量關於物件式語言編譯技術的內容,那也是稍加點綴而已,作用不大。這就造成了一種奇怪的現象:物件式語言已經成了高校計算機教學的主流語言,社會上大量使用的也是物件式語言,而我們的編譯原理教學仍然沿襲舊的一套。這種“狀態”嚴重地脫離了計算機技術的發展和社會的實際需要,因此需要進行“調態”,其根本做法是“轉型”,即將本課程的討論物件從過程式語言轉到物件式語言。

  國外近年關於編譯原理方面的新教材已經有了重要改變,不再連篇累牘地討論那些已經過時的內容,增加了許多新的內容。其中一個重大改變是出現了用物件式語言描述編譯演算法和教學模型的編譯原理教材,如:用Java語言描述的編譯原理教材,且其教學模型為MiniJava。

  這種改變也涉及到課程上機實踐。眾所周知,編譯原理課程的學術性和實踐性都很強:學術性是這門課程的`生命所在,實踐性是這門課程的活力所在。因而本課程的上機實踐也要作同步調整。

  2 課程內容圍繞物件式語言展開

  研究程式設計語言的語法描述需要有文法理論的支援,老教材中文法、詞法分析和語法分析部分內容基本上不需要作什麼變動。詞法分析主要依賴有窮狀態自動機理論,語法分析主要講述LL方法和LR方法,其他方法略做介紹即可,無需展開討論。LL方法和LR方法含蓋了許多分析技術,理論性和應用性都很強,完全可以代表主流技術。

  重要的就是研究物件和教學模型的改變。首先,研究物件將從過程式程式設計語言轉到物件式程式設計語言(當然還可以兼顧過程式),例如Java、C++等,圍繞實現這類語言的編譯實現技術展開討論。物件式程式設計語言的要素是封裝、繼承、多型性,在編譯實現時都必須仔細考慮。其次,涉及到物件式程式設計語言編譯程式教學的模型選擇問題。目前傳統的教材選擇的教學模型有PL/0、Tini C等。實踐證明,圍繞某個模型展開編譯設計技術的討論,效果是比較好的。課程研究物件和教學模型的改變涉及到調整的章節主要有語法分析、語義分析、程式碼生成、符號表管理、存貯分配等方面。

  一旦我們討論的模型發生變化,這些章節的內容就要作很大調整。如物件式語言的作用域規則、語言動態特性、模組化封裝(類)、類的繼承、多型性的實現等,都需要具體的技術來實現,這些都要反映在教材和教學中。

  就課程中關於程式碼生成內容來看,目前Java編譯程式生成Java虛擬機器(JVM)程式碼,C#生成MSIL虛擬機器程式碼。這兩個虛擬機器作為教學模型來說可能比較複雜了一些,在教學中可以選定一個簡單的子集;或者在PL/0虛擬機器上適當增加一些指令程式碼,以便於程式碼生成、存貯分配等部分的講解。

  實踐證明,作為教學模型,在教材上提供一個小型語言的編譯程式供學生分析和研究,非常有利於加深對基本原理的理解和掌握。這個小型編譯程式可以比較小但應該能夠說明一些基本問題,例如傳統的編譯原理課程中選擇PL/0編譯程式作為教學模型,就收到了比較好的教學效果。在物件式程式設計語言編譯原理課程中選擇Object—pl/0或者MiniJava作為教學模型是比較恰當的。前者是在傳統的PL/0語言上增加類,補充封裝、繼承、多型性之語言成分得到的;後者是對Java語言進行適當簡化得到的,其主要語法描述 。

  編譯原理課程可以圍繞此模型展開討論。國外已經有這類教材出現,並且不少大學已經開始使用。

  3 用物件式語言描述編譯演算法和教學模型

  本課程中各類編譯演算法都應該伴隨著教學模型的變化,改用物件式語言來描述,如用Java語言描述或者用C++語言描述。其中一個重大的變化是教學模型如MiniJava或Object—pl/0要用物件式語言實現,也就是提出了教學模型的面向物件構造問題,這就比較好地將討論物件和描述討論物件的語言統一起來了。國外有的教材就選擇了用Java描述MiniJava編譯程式。

  編譯程式是一個重要的中大型軟體,傳統的編譯程式大都是用PASCAL、C等語言描述的(參見圖2)。像編譯程式這樣的中大型程式如何用類這個工具來進行分解,其實是對學生的物件式程式設計能力的一個重要檢驗。學習用物件式語言來描述編譯程式,學生可能會受到一次嚴格的物件式語言程式設計訓練,編譯程式如何用類這個工具進行分解,這些類(物件)如何合作完成編譯任務,都需要較好的物件式程式設計基礎。圖3是一個程式設計語言文法的面向物件表示。

  傳統的編譯程式構造主要存在如下一些問題:

  (1)傳統編譯程式試圖透過將編譯程式根據功能模組分解,而使整個編譯程式的複雜性降低。這種方法雖然在一定程度上簡化了編譯過程。但為了處理大型、複雜且多變的編譯程式,僅僅將它按照功能分解成詞法分析、語法分析、語義處理和程式碼生成幾個階段是遠遠不夠的。

  (2)傳統的編譯程式構造中,編譯的每個階段依然是大型、複雜的,且每個階段內部依然存在複雜的聯絡,這對編譯程式的可維護性沒有實際上的改變,反而造成維護困難。

  (3)雖然傳統的編譯程式構造有著豐富的理論基礎,也有一些工具諸如Lex、Yacc等,但對一個具體的編譯程式的構造仍然要從最基本的描述開始。傳統的編譯程式構造的功能分解方法缺乏支援複用的良好機制。

  總之,過程式程式設計正規化存在的問題在編譯程式設計中廣泛存在。而用物件式程式設計語言來描述編譯程式,則物件式程式設計正規化帶來的好處基本上都能夠得到。具體主要表現在:

  (1)編譯程式效率高。由於面向物件的編譯程式構造採用的是語法樹構造法,可以得到上下文相關資訊,並根據上下文進行語法樹的最佳化,所以生成的程式碼效率高。

  (2)複用方便。由於語法類和具體的語法結構一一對應,所以在複用語法結構時,可以直接得到能被複用的語法類,不需要經過查詢過程。

  (3)修改方便。由於面向物件方法中的封裝和多型等技術的實現,語義處理方法中所用到的資料都是區域性資料,因此要做語義修改時,只要繼承相應的語法類,並且過載相應的語義處理方法即可,需修改的內容較之傳統方法要少。

  (4)有利於構造編譯程式類庫,使得編譯程式的構造能夠大量複用已有的類,這是更高層次上的複用。

  4 課程實驗的設計

  計算機學科是一門技術學科,它雖然有一定的科學的成分,但工程技術的成分更多一些,因此需要加強動手能力的培養。編譯原理課程除了注重它的原理性,還必須注重其實踐性。學習這門課程時,學生對編譯的理解往往只停留在書本的概念上,而不知道怎樣把編譯理論應用到實際的編譯程式設計的實踐中。另外,有些學校只將教學內容鎖定在文法、詞法分析(有窮狀態自動機)、語法分析(LL、LR文法)上,以應付學生考研的需要。這些做法使得學生很難掌握這門課程的精髓。

  編譯系統可能是所有軟體系統中最複雜的系統之一,透過本課程實踐環節的教學,還可以幫助學生掌握一些大、中型軟體設計的技術和技巧,提高學生面向物件軟體開發的綜合能力。

  傳統的編譯原理課程往往要求學生自己實現一個詞法分析程式;實現一個基於遞迴子程式遞迴下降分析程式或基於預測分析表的語法分析程式;為某虛擬機器(例如PL/0虛擬機器)生成程式碼;對教學模型(例如PL/0)進行擴充,寫出完整的編譯程式等。且在此過程中學生可以藉助詞法分析自動生成程式Lex和語法分析自動生成程式Yacc進行有關實驗。我們要求學生透過對教學模型的分析,能夠在機器上動手實現一個小的編譯系統,以加深對編譯整個過程的一致性、連貫性、整體性的理解。

  一旦我們的討論物件改變為物件式語言,則其編譯程式語法和詞法分析的自動生成不能再採用Lex、Yacc這類工具了,需要改用JavaCC(Java Compiler Compiler)或SableCC等,它們都能生成Java語言程式碼;或者使用Jikespg(Jikes paser gernerator),它生成C++程式碼。

  我們初步制定了本課程的實踐環節,它主要分四個層次:

  (1)藉助JavaCC或SableCC等工具讓學生自動生成小語言的詞法分析和語法分析程式。這個實驗的目的是教會學生關於詞法分析和語法分析的自動生成,同時弄清這些工具生成出來的程式碼的程式結構,特別是面向物件的類結構。

  (2)為上面生成的語法樹新增語義動作,完成生成程式碼的工作。這個實驗的目的是讓學生理解如何在抽象語法樹上新增語義動作,理解為虛擬機器生成程式碼的知識。

  (3)擴充套件教學模型,如MiniJava,為其增加一些語言成分,如有關語句等,然後為其構造完整的編譯程式。這一實驗讓學生把握編譯的總體,弄清各部分之間的關係。

  (4)逐步構造面向物件的編譯程式類庫,使得“編寫”編譯程式逐步走向“組裝”編譯程式。

  5 結束語

  對計算機人才的層次結構、知識、能力與素質等方面的要求在很大程度上取決於計算機市場。我們需要與時俱進,適時考慮相應教學體系和內容的改變。依賴過程範性的編譯原理課程勢必要被依賴物件範性的編譯原理課程所取代,這是軟體技術發展和社會實際應用的需要。但建立本課程新的課程信念、課程價值、課程技術等尚需時日,需要不斷探索和創新。

  編譯原理課程的改革不僅需要教師付出大量辛勤勞動,及時跟進技術的發展,還需要好的教材、好的課程實驗設計。《物件式程式設計語言編譯原理》便是我們按照上述思路來編寫的教材。

  參考文獻

  [1] 中國計算機本科專業發展戰略研究報告[J]。中國大學教學,2005,5:7—10。

  [2]Andrew W。Apple。現代編譯器的Java實現[M]。北京:電子工業出版社,2004。

  [3]Dick Grune etc。Modern Compiler Design[M]。JOHN WILEY&SONS,LTD,2002。

  [4] 胡學聯。開設軟體新技術課程的實踐探索[J]。黃河科技大學學報,2004 ,2。

  [5] 胡學聯等。物件式程式設計語言編譯原理[M]。

最近訪問