周 蘇
新的教育形勢對教學改革提出了很多要求,其中一些要求集中體現到了教學課時的安排上:學生就業難,學校要開設職業規劃教育課程;學生就業能力差,需要增加實訓實驗和實踐課時;專業技術發展迅猛,需要開設相應的新課以使教育教學跟上時代的步伐,如此等等。于是,一些被部分人群認為“沒用”和“用處不大”的課程或課時數被減少,或干脆被某個理由主導(例如:學生學不好,老師教著也困難)而取消。一些學校計算機專業的傳統主課“匯編語言”(或“匯編語言程序設計”)就受了這樣的遭遇。
1關于匯編語言的簡單回顧
匯編語言(Assembly Language,作為課程,又常稱作“匯編語言程序設計”,它是面向機器的程序設計語言,也是能夠利用計算機所有硬件特性并能直接控制硬件的一種功能很強的計算機語言。在匯編語言中,用助記符代替操作碼,用地址符或標號代替地址碼,這樣用符號代替機器語言的二進制碼,就把機器語言變成了匯編語言。因此,匯編語言亦稱為符號語言。
作為一門計算機語言,使用匯編語言編寫的程序(原文件),機器不能直接識別。對應于高級語言的編譯器,“匯編語言”也需要一個“匯編器”來把匯編語言原文件匯編成機器可執行的代碼。這種將匯編語言翻譯成機器語言,起翻譯作用的程序又叫匯編程序。匯編程序是系統軟件中語言處理系統軟件。匯編語言編譯器把匯編程序翻譯成機器語言的過程稱為匯編。
高級的匯編器如MASM、TASM等,為編寫匯編程序提供了很多類似于高級語言的特征,比如結構化、抽象等。在這樣的環境中編寫的匯編程序,有很大一部分是面向匯編器的偽指令,已經類同于高級語言。如今,匯編環境已經如此高級,即使全部用匯編語言來編寫Windows應用程序也是可行的。但是,匯編語言的長處還在于編寫高效且需要對機器硬件精確控制的程序。
匯編語言比機器語言易于讀寫、調試和修改,同時具有機器語言的全部優點。但在編寫復雜程序時,相對于高級語言則代碼量較大,而且匯編語言依賴于具體的處理器體系結構,不能通用,因此不能直接在不同處理器體系結構之間進行移植。
“匯編語言”的主要特點是:
(1) 面向機器的低級語言,通常是為特定的計算機或系列計算機專門設計的。
(2) 保持了機器語言的優點,具有直接和簡捷的特點。
(3) 可有效地訪問、控制計算機的各種硬件設備,如磁盤、存儲器、CPU、I/O端口等。
(4) 目標代碼簡短,占用內存少,執行速度快,是一種高效的程序設計語言。
匯編語言經常與高級程序設計語言配合使用,其主要應用包括:
(1) 70%以上的系統軟件是用匯編語言編寫的。
(2) 許多快速處理、位處理、訪問硬件設備等高效程序是用匯編語言編寫的。
(3) 一些高級繪圖程序、視頻游戲程序是用匯編語言編寫的。
但人們經常認為匯編語言的應用范圍很小而忽視它的重要性。其實,匯編語言是我們理解整個計算機系統的最佳起點和最有效途徑之一,對每一個希望深入學習和掌握計算機科學與技術的人來說都是非常重要的,甚至是不能不學習的語言。
2 學習匯編語言的專業意義
長期以來,“匯編語言”課程一直是培養學生了解和直接使用計算機硬件資源的語言,一直是學習和理解其他高級程序設計語言的基礎,在專業建設中也是“計算機組成原理”、“微機原理與接口技術”、“操作系統”、“接口與通信技術”和“計算機控制技術”等許多課程的前導課程,準備必要的基礎知識。“匯編語言”在計算機與相關學科的課程設置中起著承上啟下的作用,它對訓練學生掌握程序設計技術,熟悉上機操作和程序調試技術都有重要作用。與其他大多數的計算機語言一般被用于應用軟件程序設計不同,在實際應用中,匯編語言通常被用在底層硬件操作和高要求的程序優化的場合。對匯編語言知識的應用需求主要體現在:與硬件有關的嵌入式系統的底層設計、操作系統的核心部分設計、實時控制系統的軟件設計、接口電路的初始化程序、外部設備的底層驅動程序以及復雜算法的優化等。
隨著現代軟件系統越來越龐大復雜,大量經過封裝的高級語言如C/C++,Pascal/Object Pascal也應運而生。這些新的語言使得程序員在開發過程中能夠更簡單、更有效率,使軟件人員得以應付快速的軟件開發要求。而匯編語言由于其復雜性使得適用領域逐步減小,但這并不意味著匯編已無用武之地。由于匯編語言更接近于機器語言,能夠直接對硬件進行操作,生成的程序與其他語言相比具有更高的運行速度,占用更小的內存,因此,在一些對時效性要求很高的程序、許多大型程序的內核模塊以及工業控制方面得到大量應用。
通過學習和使用匯編語言,能夠感知、體會、理解機器的邏輯功能,向上為理解各種軟件系統的原理打下技術理論基礎;向下為掌握硬件系統的原理打下實踐應用基礎。即:向上理解軟件,向下感知硬件。現實生活中雖然有眾多編程語言可供選擇,但學習匯編,學生才能更好地深入了解計算機運行原理,為今后的計算機研究與應用打下良好的基礎。“匯編語言”課程,依然應該是高校計算機及其相關專業學生的必修課。
說匯編語言是“低級”語言,并不意味著匯編語言會被更高級語言所淘汰,相反,這里的“低級”應該當“基礎”講,匯編語言仍然是程序員必須了解的語言,在某些計算機技術應用的行業與領域,匯編語言是必不可少的。
由熟練的程序員使用匯編語言編寫的程序,其運行效率與性能比其他語言寫的程序會是成倍的優秀,但代價是需要更長的時間來優化。因此,對比現在已經市場化的軟件行業,加上高級語言的優秀與跨平臺,軟件企業不可能讓一個團隊使用匯編語言來編寫所有的東西,多花上幾倍甚至幾十倍的時間,這還不如使用其他語言來完成,只要求最終結果不比匯編語言編寫的差太多,這是市場經濟下的必然結果。
但是,至今為止,還沒有哪個程序員敢斷定匯編語言是不需要學的,一個不懂匯編語言的程序員,通常被認為只是三流的程序員。同時,技術精湛的匯編程序員,已經脫離軟件開發而擠身于工業電子編程中。電子工程師的主要開發語言就是匯編,使用C語言的只占極少部分。在一些工業公司,一個核心的電子工程師比其他任何職員待遇都高,一般電子工程師待遇則可能是程序員的十倍以上。這種情況是因為現在學習匯編的人雖然也不少,但是真正能學到精通的卻不多。匯編語言難學、難用、適用范圍小,雖然簡單,但過于靈活。學過高級語言后再去學習匯編,比一開始學匯編要難得多,但學過匯編之后再去學習高級語言卻很容易,正所謂簡從繁易,繁從簡難。
3從內容到方法的教學改革
雖然優點多多,但匯編語言確實是一種層次非常低的語言,說它簡單方便,都是相對于機器語言而言的。匯編語言的缺點也很明顯:
(1) 編寫的代碼難懂,不好維護。
(2) 很容易產生Bug,難于調試。
(3) 只能針對特定的體系結構和處理器進行優化。
(4) 開發效率很低,時間長且單調。
在如今的教學實踐中,“匯編語言”課程確實存在著學生缺乏學習興趣,老師開展教學困難的普遍問題,原因是多方面的。其中既有技術進步使我們有了更多更好的選擇,但也有學生群體的變化、人們的志向與追求、教育教學方法的發展等積極和消極的因素。
盡管如此,專業建設、教學改革中也需要尊重和堅持其中的基本原則。一個學科的知識的基本組成也是學科發展中人類智慧的結晶,隨意的加減是不負責任的,也是不符合專業精神的。
盡管與發展初期相比,計算機開發和應用技術已經有了根本性的變化,我們有了各種高級語言,有了網絡應用開發的許多編程工具,很多程序甚至可以自動生成,但機器語言、匯編語言和高級語言的程序設計語言體系仍然是計算機技術的基礎,也是計算機技術的重要知識體系之一。對于計算機及其相關專業的學生以及喜歡計算機的一般學生和讀者來說,匯編語言程序設計肯定是需要掌握的重要的專業基礎知識之一。不能了解和熟悉匯編語言知識不僅將導致學生知識結構的缺憾,也可能導致學生認知水平的降低、開發手段的缺乏。在一些應用中,匯編語言甚至是其開發工具的唯一選擇。
通過學習匯編語言,學生可以了解到如何有效地設計數據結構,讓計算機處理得更快并使用更少的存儲空間;同時,學習匯編語言可以讓學生熟悉計算機內部運行機制,并有效地提高調試能力。經驗表明,調試一個非結構化程序的困難程度,要比調試一個結構化程序的難度高很多,因為“結構化”是以犧牲運行效率來提高可讀性與可調試性的,這對于完成一般軟件工程的編碼階段是非常必要的。然而,在一些地方,比如,硬件驅動程序、操作系統底層,或者程序中經常需要執行的代碼,結構化程序設計的這些優點有時就會被它的低效率所抹煞。另外,如果想真正地控制自己的程序,只知道源代碼級的調試是遠遠不夠的。
那么,一方面是確實存在著弱點和困難,另一方面又是不可或缺的知識體系的重要成分,解決問題的方法是什么呢?
首先,不能砍!我認為,“匯編語言”作為一門計算機專業的重要基礎知識和開發工作,簡單地一砍了之是不能容忍的;但可以根據專業的需求,根據學校的不同培養目標,在教學內容的組織上有針對性地進行組合,有針對性的提出考核要求,例如淺的可以是“了解”、“熟悉”,深的可以是“掌握”,甚至,還可以在高年級開設要求“熟練掌握”的專業選修課程——畢竟,今天計算機應用市場中以硬件或軟硬件兼施為主要特色的崗位也為學生就業提供了豐富的機會。
其次,深入開展匯編語言課程的教學改革,在教學內容和教學方法上做深入研究與實踐,是解決問題的有效途徑。“匯編語言”課程本身具有的理論抽象性和鮮明的應用性,決定了我們必須充分重視這門課程的實踐環節。
4 教學內容的分層次設計
教育部計算機科學與技術專業教學指導委員會在其發布的“中國計算機本科專業發展戰略研究報告”中指出:大多數院校都有比較完善的教學大綱、教學計劃和進度表、教學檔案等,實踐著一套有效的管理規范,但同時教學內容的研究則需要加強。報告進一步指出:
(1) 有些學校計算機專業的教學內容設計存在明顯的盲目性,還有些學校在培養人才定位上有明顯偏差。盡管CC1991開創了一種對計算機科學教育的創造性的、理性的思考,但它并不應該成為我國所有大學計算機專業教學實踐的共同追求的目標。
(2) 作為一種比較普遍的規律或者現象,學生就業通常會有較強的地域性:一個企業通常在周邊地區招收較多員工,一個學校的畢業生大都就業在學校周邊地區的單位。因此,學校周邊地區社會發展的情況對計算機專業的教學內容的設計應該是很有參考意義的。
……
由于大多數大專院校一般都設置有計算機科學技術及其相關專業,我們至少可以認為:根據所在院校的辦學類型不同、培養目標不同、所在地及其周邊地區社會需求的不同,這些計算機專業的教學內容應該有所不同,這些計算機專業對于“匯編語言”這門課程的教學內容也應該是有所不同的。對于那些非研究型院校的相關專業,對“匯編語言”的教學可以集中在適度的理論知識和充分的操作實踐上,通過實驗與實踐,了解匯編語言程序設計的基本概念和知識,激發對相關理論知識的學習興趣,理解和掌握匯編語言程序設計的基本方法。
匯編語言涉及的技術領域寬泛,要讓學生真正理解匯編語言的基礎理論知識,具備將匯編語言技術應用于社會實踐的能力,積極加強匯編語言程序設計課程的實驗環節是至關重要的。
5把實驗作為課程的主要教學手段
“匯編語言”課程一向都有上機實驗的教學要求,但教學主體是課堂教學,無論是實驗設計還是實驗強度都遠遠不夠,帶有強烈的“驗證性”色彩。然而,單憑課堂教學和一般作業,要真正領會匯編語言課程所介紹的概念、原理、方法和技巧等,是很困難的。經驗表明,學習尤其是真正體會和掌握匯編語言程序設計的最好方式是對它進行充分的實踐。把實驗作為學習匯編語言的主導方法,為學生提供一個掌握匯編語言全新的學習方法,可以由此來體驗匯編語言的知識及其應用技巧。當然,通過實驗,也一定能夠很好地提高學生的匯編語言程序設計能力。
根據以上思考,我們在實驗內容的選擇、實驗步驟的設計和實驗文檔的組織等諸方面都做了精心的考慮和安排,嘗試為“匯編語言程序設計”課程編寫了《匯編語言程序設計實驗教程》教材。該實驗教材依據課程教學大綱,充分理解課程的大多數主教材,遵循課程教學的規律和節奏,體現了實驗的可操作性,幫助學生切實把握本課程的知識內涵和理論與實踐的水平。
顯然,學生在“匯編語言”等課程中產生的學習困難,首先來自于他們對所學知識缺乏必要的感性認識,而我們在教學中把根據學科理論知識精心設計的實驗實踐環節與學科理論教學相融合,抓實驗實踐教學、促進學科理論知識學習,較好地解決了學生的認知困難,符合特定的學生對象,取得了很好的教學效果。
6后記
其實,“匯編語言”課程所存在的問題在計算機專業課程中有一定的代表性,例如計算機原理、操作系統原理、計算機網絡等。但專業建設和課程建設不能單純為學生興趣和教師水平所左右,應該堅持以培養學生綜合素質和提高學生就業能力為原則。
本文關于“匯編語言”課程的建設思路和教改實踐,對許多其他專業課程的教學改革具有積極的借鑒意義。
參考文獻:
[1] 馬力妮,趙剛,夏紅科.“匯編語言程序設計”課程的教學內容與實踐方法的探討[J]. 計算機教育,2009(10):106-107.
[2] 金海溶,周蘇. 用實驗方法改革匯編語言程序設計的教學[J]. 計算機教育,2007(1):34-37.
[3] 周蘇,金海溶. 操作系統原理的教改思路與實驗創新[C]//第二屆大學計算機課程報告論壇論文集.北京:高等教育出版社, 2006:191-195.
[4] 周蘇,王文. 大學計算機專業基礎課程實驗教學的改革與創新[C]//首屆大學計算機課程報告論壇(西安,2005)論文集. 北京:高等教育出版社,2005:194-198.
[5] 劉均,周蘇,金海溶,等. 匯編語言程序設計實驗教程[M]. 北京:科學出版社,2006.