盧信文 武志學(xué)
摘要:程序設(shè)計(jì)語(yǔ)言的初學(xué)者往往對(duì)第一門語(yǔ)言感覺(jué)異常困難,這表現(xiàn)在拿到問(wèn)題不知如何下手分析,從而無(wú)法動(dòng)手編寫代碼上。這也是各個(gè)高校計(jì)算機(jī)專業(yè)在入門程序設(shè)計(jì)語(yǔ)言教學(xué)上的一道門檻。通過(guò)選擇幾種主流編程語(yǔ)言開(kāi)展對(duì)比教學(xué)實(shí)驗(yàn)、進(jìn)行問(wèn)卷調(diào)查和開(kāi)展教學(xué)研討會(huì)的形式,去探討如何在入門語(yǔ)言的教學(xué)中直接開(kāi)展主流的面向?qū)ο蟮某绦蛟O(shè)計(jì)方法。同時(shí),在程序語(yǔ)言之外,幫助學(xué)生建立起從分析、設(shè)計(jì)到實(shí)現(xiàn)的整體程序設(shè)計(jì)框架意識(shí)。將程序教學(xué)語(yǔ)言和教學(xué)方式結(jié)合起來(lái),解決程序設(shè)計(jì)入門教學(xué)的本質(zhì)問(wèn)題。
關(guān)鍵詞:程序設(shè)計(jì);入門語(yǔ)言;教學(xué)改革;邏輯能力;面向?qū)ο?/p>
中圖分類號(hào):G424 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)04-0101-03
Abstract: It is very difficult for the beginners of a programming language to analyze and write the code. This is also the biggest problem of the computer specialty of the universities to carry out the teaching. By choosing to carry out several mainstream programming language teaching comparative experiments, carrying out in the form of questionnaires and teaching seminars, to discuss how to carry out the program design methods of teaching introductory language directly mainstream object-oriented. Meanwhile, in addition to programming languages ??to help students build from the analysis, design and overall program design framework to achieve consciousness. The combined program of instruction and teaching methods together to resolve the nature of teaching introductory programming problem.
Key words: programming language; Introductory language; teaching method; ogical capability; object-oriented
目前國(guó)內(nèi)高校計(jì)算機(jī)相關(guān)專業(yè)程序設(shè)計(jì)入門教學(xué)語(yǔ)言普遍采用C語(yǔ)言,雖然C語(yǔ)言可面向硬件編程,在嵌入式開(kāi)發(fā)方面發(fā)揮著重要作用,但存在以下嚴(yán)重不足:
1) C語(yǔ)言是面向過(guò)程的語(yǔ)言,邏輯簡(jiǎn)單的項(xiàng)目還看不出多少問(wèn)題,一旦項(xiàng)目邏輯很復(fù)雜,當(dāng)需要對(duì)某些邏輯進(jìn)行修改的時(shí)候,這種面向過(guò)程的語(yǔ)言就會(huì)使事情變得異常麻煩。因?yàn)镃是在面向?qū)ο蠓椒餍兄伴_(kāi)發(fā)的,這大大降低了C語(yǔ)言復(fù)雜設(shè)計(jì)的可能性。
2) 由于C語(yǔ)言是面向過(guò)程的語(yǔ)言,因此不提供數(shù)據(jù)封裝的功能,這一點(diǎn)使得C在數(shù)據(jù)的安全性上有很大缺陷。
3) C語(yǔ)言對(duì)語(yǔ)法的限制不太嚴(yán)格,這就使得編程出錯(cuò)的概率要高一些,其它語(yǔ)言編譯時(shí)就能發(fā)現(xiàn)的錯(cuò)誤,C語(yǔ)言的編譯器卻可能發(fā)現(xiàn)不了,因此,從應(yīng)用的角度,C語(yǔ)言比其他高級(jí)語(yǔ)言較難掌握。
4) C語(yǔ)言的指針是它學(xué)習(xí)的一個(gè)難點(diǎn),也是一個(gè)優(yōu)勢(shì),因?yàn)橛辛酥羔?,可以直接訪問(wèn)物理地址,也就可以對(duì)硬件進(jìn)行一些操作,但是,這樣的操作在安全性方面就有了缺陷。
5) 類型檢查機(jī)制相對(duì)較弱、缺少支持代碼重用的語(yǔ)言結(jié)構(gòu)。
面向?qū)ο蟮某绦蛟O(shè)計(jì)思想自上個(gè)世紀(jì)80年代以來(lái),經(jīng)歷了近40年的發(fā)展,目前已經(jīng)非常成熟,在軟件工程領(lǐng)域和程序設(shè)計(jì)領(lǐng)域已經(jīng)非常普及。目前計(jì)算機(jī)軟件技術(shù)的主要應(yīng)用領(lǐng)域是Web應(yīng)用開(kāi)發(fā),作為底層開(kāi)發(fā)語(yǔ)言的C語(yǔ)言,已不再適合作為入門教學(xué)語(yǔ)言。作為計(jì)算機(jī)教育工作者,我們有責(zé)任深入研究,尋找最佳的入門語(yǔ)言和教學(xué)方法。
1 主流編程語(yǔ)言的比較
對(duì)于剛進(jìn)入大學(xué)的學(xué)生來(lái)說(shuō),選擇哪種程序語(yǔ)言作為他們的入門教學(xué)語(yǔ)言,是目前各個(gè)高校都在思考的問(wèn)題。針對(duì)這個(gè)問(wèn)題,我們將四種主流的編程語(yǔ)言-C,C++,JAVA和C#進(jìn)行了比較,同時(shí)展開(kāi)了對(duì)比教學(xué),希望能找到最適合學(xué)生進(jìn)行入門學(xué)習(xí)的程序語(yǔ)言。
1.1 C語(yǔ)言和C++的比較
C語(yǔ)言應(yīng)該算是比較底層的語(yǔ)言,同時(shí)也是一個(gè)面向過(guò)程的語(yǔ)言。C語(yǔ)言只有40個(gè)關(guān)鍵詞,9種控制語(yǔ)句,對(duì)于初學(xué)者來(lái)說(shuō),C語(yǔ)言沒(méi)有過(guò)多的抽象概念需要理解,因此學(xué)習(xí)起來(lái)感覺(jué)會(huì)很簡(jiǎn)單。初學(xué)者往往還沒(méi)有建立起整體的程序設(shè)計(jì)思想,編寫程序總是想到哪兒寫到哪兒,C語(yǔ)言作為結(jié)構(gòu)化的語(yǔ)言,為他們學(xué)習(xí)編程提供了方便。C語(yǔ)言應(yīng)該說(shuō)沒(méi)有什么真正的難點(diǎn),可能最讓初學(xué)者頭疼的就是指針,而指針又是理解計(jì)算機(jī)底層結(jié)構(gòu)精髓的關(guān)鍵。因?yàn)橛辛酥羔?,可以允許對(duì)硬件進(jìn)行操作,但是指針操作也帶來(lái)了安全問(wèn)題。由于C語(yǔ)言是面向過(guò)程的語(yǔ)言,因此不提供數(shù)據(jù)封裝的功能,這一點(diǎn)使得C語(yǔ)言在數(shù)據(jù)的安全性上有很大的缺陷,同時(shí)由于C語(yǔ)言對(duì)語(yǔ)法的限制不太嚴(yán)格,會(huì)使得編譯出錯(cuò)的概率升高,對(duì)于初學(xué)者來(lái)說(shuō),常常會(huì)發(fā)生出現(xiàn)錯(cuò)誤卻不知道哪里出錯(cuò)的現(xiàn)象,從實(shí)際應(yīng)用的角度來(lái)看,C語(yǔ)言比其他高級(jí)語(yǔ)言更難掌握,因此目前很少再用C語(yǔ)言寫應(yīng)用程序。
接下來(lái)看看C++。C++是從C語(yǔ)言發(fā)展起來(lái)的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。C++不僅和C語(yǔ)言一樣具有高效、可移植的特征,同時(shí)還支持包括面向?qū)ο蟪绦蛟O(shè)計(jì)、數(shù)據(jù)抽象、過(guò)程化程序設(shè)計(jì)、泛型程序設(shè)計(jì)在內(nèi)的多種程序設(shè)計(jì)風(fēng)格。C++沒(méi)有復(fù)雜的編程環(huán)境,也沒(méi)有不使用會(huì)帶來(lái)額外開(kāi)銷的問(wèn)題。C++的很多特性并沒(méi)有直接添加到語(yǔ)言里去,而是以類庫(kù)的形式存在,這樣可以保證語(yǔ)言的簡(jiǎn)潔和運(yùn)行的高效。C++引入了面向?qū)ο蟮母拍?,使得開(kāi)發(fā)人機(jī)交互類型的應(yīng)用程序更為簡(jiǎn)單、快捷。很多優(yōu)秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。不過(guò)C++在一定程度上來(lái)講,并不是純粹的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,它在提出了面向?qū)ο蟮奶卣鞯耐瑫r(shí),還具有面向過(guò)程的特性,同時(shí),C++的語(yǔ)法相比較于C語(yǔ)言,復(fù)雜很多,這讓初學(xué)者感覺(jué)很難理解,因此學(xué)習(xí)起來(lái)困難重重。C++的擴(kuò)展性很好,這個(gè)語(yǔ)言使用的基本要素就是模擬語(yǔ)言,也就是可以創(chuàng)造語(yǔ)言,所以很適合編寫類庫(kù)。但是很多事物都是有正反兩面,C++的擴(kuò)展性能好的這個(gè)優(yōu)點(diǎn),又會(huì)導(dǎo)致初學(xué)者很難上手,或者說(shuō)很難入門,因?yàn)槭裁炊家约喝?,?duì)于初學(xué)者來(lái)說(shuō),難度比較大。寫完程序以后,就面臨著編譯,C++的編譯系統(tǒng)受到C++的復(fù)雜性的影響,也變得過(guò)于復(fù)雜,尤其是要把預(yù)處理和語(yǔ)法分析放在一起的時(shí)候,這種復(fù)雜程度變得更明顯。很多程序即使能夠被編譯,其實(shí)本身也存在了大量的問(wèn)題,而這些問(wèn)題大多難于被發(fā)現(xiàn)。由于語(yǔ)法上的復(fù)雜、概念上的復(fù)雜和編譯上的復(fù)雜,使得C++對(duì)于初學(xué)者來(lái)說(shuō),如同一座大山,想翻過(guò)卻感覺(jué)力不從心。
在對(duì)比班進(jìn)行了的C語(yǔ)言和C++的對(duì)比教學(xué)后,發(fā)現(xiàn)C語(yǔ)言由于語(yǔ)言簡(jiǎn)潔而容易讓學(xué)生理解,但是C語(yǔ)言特有的指針是學(xué)生理解的難點(diǎn),同時(shí),C語(yǔ)言是面向過(guò)程的語(yǔ)言,使得學(xué)生在后續(xù)面向?qū)ο蟮膶W(xué)習(xí)中理解難度增大。C++語(yǔ)言融合了面向?qū)ο蟮木幊趟枷牒虲語(yǔ)言的指針,使得學(xué)生學(xué)習(xí)起來(lái)的難度增大,大部分學(xué)生表示C++的概念很難理解。
1.2 JAVA和C#的比較
JAVA是SUN公司在1995年推出的具有跨平臺(tái)特性的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。與JAVA程序設(shè)計(jì)語(yǔ)言一起推出的還有JAVA平臺(tái),包括了JavaSE、JavaEE和JavaMEJava。JAVA是到目前為止跨平臺(tái)做得最好的語(yǔ)言,由JAVA編寫的程序可以不經(jīng)過(guò)任何修改就能移植到另一個(gè)平臺(tái)上使用。由于JAVA具有這樣高效、安全、通用和平臺(tái)移植的特性,使得其廣泛地應(yīng)用于個(gè)人應(yīng)用程序開(kāi)發(fā)、大型數(shù)據(jù)平臺(tái)、游戲開(kāi)發(fā)、超級(jí)計(jì)算機(jī)、移動(dòng)應(yīng)用開(kāi)發(fā)和企業(yè)級(jí)web應(yīng)用開(kāi)發(fā),同時(shí)它還擁有最大的開(kāi)發(fā)者專業(yè)社群。特別是在移動(dòng)應(yīng)用開(kāi)發(fā)方面的優(yōu)勢(shì),使得JAVA在當(dāng)前全球云計(jì)算和移動(dòng)互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,更具備了顯著的優(yōu)勢(shì)和廣闊的前景。從語(yǔ)法結(jié)構(gòu)上來(lái)看,Java語(yǔ)言的語(yǔ)法與C語(yǔ)言和C++語(yǔ)言很接近,但是它又是一個(gè)純的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,它沿用了C++的一些核心的面向?qū)ο蟮募夹g(shù),丟棄了C++ 中那些很少使用的、很難理解的特性,這樣對(duì)于初學(xué)者來(lái)說(shuō),要更容易接受。指針作為C的特征,有它的優(yōu)勢(shì),也帶來(lái)了安全問(wèn)題。C++雖然改進(jìn)了指針應(yīng)用,但由于本身的復(fù)雜性,還是難以讓初學(xué)者接受。而Java語(yǔ)言徹底丟棄了指針概念,在安全性上邁出了一大步,同時(shí),JAVA還提供了自動(dòng)的垃圾收集機(jī)制,使得程序員不必為內(nèi)存管理而擔(dān)憂。不過(guò)JAVA的編譯器不同于一般的語(yǔ)言編譯器,它是將代碼編譯成二進(jìn)制的字節(jié)碼,然后由不同的平臺(tái)上的虛擬機(jī)來(lái)解釋并執(zhí)行這些字節(jié)碼,這種編譯機(jī)制,實(shí)現(xiàn)了JAVA語(yǔ)言的跨平臺(tái)性,但也在一定程度上降低了JAVA運(yùn)行的效率。
.NET平臺(tái)是微軟公司推出的構(gòu)建windows窗體程序和web應(yīng)用程序的應(yīng)用平臺(tái),C#語(yǔ)言則是微軟公司為這個(gè)平臺(tái)量身打造的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。C#的語(yǔ)法定義同樣也是從C語(yǔ)言和C++那里繼承而來(lái)的,這一點(diǎn)同JAVA很類似。C#提出了中間代碼的概念,在.NET上用不同語(yǔ)言編寫的程序在編譯時(shí),都不是直接轉(zhuǎn)換成機(jī)器語(yǔ)言,而是編譯成微軟中間代碼,這樣也就實(shí)現(xiàn)了.NET平臺(tái)的跨語(yǔ)言性。同時(shí),C#的類庫(kù)也是一個(gè)不容忽視的組件,C#的類庫(kù)是一個(gè)綜合性的面向?qū)ο蟮目芍赜妙愋图?,里面封裝了很多方法和屬性,開(kāi)發(fā)者可以很方便地直接拿過(guò)來(lái)用,這一點(diǎn)對(duì)于初學(xué)者來(lái)說(shuō),至關(guān)重要。
在對(duì)比班進(jìn)行了C#語(yǔ)言和JAVA語(yǔ)言的對(duì)比教學(xué)后,發(fā)現(xiàn)由于兩種語(yǔ)言從基礎(chǔ)知識(shí)上來(lái)講差不多,學(xué)生對(duì)基本知識(shí)的理解比較清楚,但是由于JAVA特有的編譯環(huán)境和配置環(huán)境,使學(xué)生在學(xué)習(xí)基礎(chǔ)知識(shí)的基礎(chǔ)上還要掌握其他的知識(shí)點(diǎn),對(duì)于初學(xué)者來(lái)說(shuō),難度比較大。而C#的編譯環(huán)境很適合初學(xué)者使用,同時(shí),.NET提供的類庫(kù)也在學(xué)生學(xué)習(xí)界面設(shè)計(jì)時(shí)提供了不少幫助,使得界面設(shè)計(jì)變成一件容易的事情。
2 教學(xué)方法的研究
通過(guò)問(wèn)卷調(diào)查和開(kāi)展學(xué)生教學(xué)研討會(huì)的方式,我們了解到新生在學(xué)習(xí)程序設(shè)計(jì)語(yǔ)言里,感覺(jué)最難的是如何理順問(wèn)題中的邏輯。每當(dāng)他們面對(duì)一個(gè)問(wèn)題,常常無(wú)從下手,不知道如何分析,不知道問(wèn)題中的邏輯在哪里,這些問(wèn)題恰恰是在任何程序語(yǔ)言本身以外的。這些問(wèn)題不涉及語(yǔ)法、不涉及概念,僅僅反映的是學(xué)生的邏輯思維能力和分析問(wèn)題的能力。
所謂程序設(shè)計(jì),就是給出解決特定問(wèn)題程序的過(guò)程。這個(gè)過(guò)程包括分析、設(shè)計(jì)、編碼、測(cè)試、排錯(cuò)等不同階段。在拿到一個(gè)實(shí)際問(wèn)題之后,應(yīng)對(duì)問(wèn)題的性質(zhì)與要求進(jìn)行深入分析,從而確定求解問(wèn)題的數(shù)學(xué)模型或方法,接下來(lái)進(jìn)行算法設(shè)計(jì),并畫出流程圖。有了算法流程圖,最后才是寫代碼實(shí)現(xiàn)。也就是說(shuō),在整個(gè)程序設(shè)計(jì)流程里面,用編程語(yǔ)言寫代碼其實(shí)是在最后的,代碼的實(shí)現(xiàn)僅僅是將人們思考分析出來(lái)的流程圖轉(zhuǎn)變成機(jī)器能讀懂的語(yǔ)言罷了。
目前來(lái)看,學(xué)生們比較缺乏的就是分析問(wèn)題內(nèi)在的邏輯。觀察學(xué)生平時(shí)的學(xué)習(xí)狀況,我們發(fā)現(xiàn)95%的學(xué)生在拿到實(shí)驗(yàn)任務(wù)后,做的第一件事情就是打開(kāi)開(kāi)發(fā)平臺(tái),然后開(kāi)始想代碼怎么寫。通常在1個(gè)半小時(shí)的實(shí)驗(yàn)時(shí)間里,如果沒(méi)有老師要求,大部分學(xué)生會(huì)一直坐在那里對(duì)著電腦屏幕思考代碼怎么寫,極少有人拿出紙和筆來(lái),分析一下這個(gè)任務(wù)的邏輯流程是怎樣的,要用到哪些知識(shí)點(diǎn),把整個(gè)流程圖畫出來(lái)以后再動(dòng)手寫代碼。如果在學(xué)習(xí)程序語(yǔ)言一開(kāi)始就沒(méi)有讓學(xué)生建立起先分析設(shè)計(jì),再實(shí)現(xiàn)代碼的意識(shí),那么要真正理解程序設(shè)計(jì),或者說(shuō)要真正入程序設(shè)計(jì)這個(gè)門就要難很多。
一般來(lái)說(shuō),程序設(shè)計(jì)有5個(gè)能力層面,會(huì)、熟練、分析總結(jié)、全面規(guī)劃和運(yùn)籌帷幄,那么對(duì)于教育工作者來(lái)說(shuō),應(yīng)該引導(dǎo)學(xué)生從“會(huì)”升級(jí)到“熟練”。何為“會(huì)”?“會(huì)”,就是對(duì)知識(shí)點(diǎn)的一般性的、孤立的掌握,也就是還處于僅僅掌握工具的階段。學(xué)生在學(xué)完一門程序設(shè)計(jì)語(yǔ)言并做了相關(guān)的一些實(shí)驗(yàn)以后,可以說(shuō)會(huì)某某語(yǔ)言。這時(shí),只要有詳細(xì)的設(shè)計(jì),他們就可以把設(shè)計(jì)變成代碼。何為詳細(xì)的設(shè)計(jì),也就是要把整個(gè)問(wèn)題的流程圖、細(xì)節(jié)實(shí)現(xiàn)部分統(tǒng)統(tǒng)告訴他們。在這一個(gè)層面,其實(shí)學(xué)生并沒(méi)有建立整體程序設(shè)計(jì)框架,他們做的只是實(shí)現(xiàn)部分。而“熟練”,則意味著能夠快速而有效地完成既定設(shè)計(jì),在這個(gè)層面上,學(xué)生的分析能力、判斷能力都會(huì)有一個(gè)提升,從實(shí)現(xiàn)者變成設(shè)計(jì)者。
3 結(jié)論
當(dāng)前計(jì)算機(jī)軟件工程專業(yè)的程序入門教學(xué)應(yīng)順應(yīng)行業(yè)發(fā)展的趨勢(shì),選擇面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言。在面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中,C++由于融合了面向?qū)ο蟮母拍詈虲語(yǔ)言的指針,使得新生學(xué)習(xí)起來(lái)更加困難和難于理解,而JAVA雖然在設(shè)計(jì)思想和語(yǔ)法結(jié)構(gòu)上和C#很相似,但由于JAVA要搭配環(huán)境,以及使用各種jar包,使得入手涵蓋的知識(shí)點(diǎn)稍微廣了些。C#作為.NET平臺(tái)的標(biāo)識(shí)性語(yǔ)言,為開(kāi)發(fā)者提供了80多種控件,使得界面的設(shè)計(jì)變得異常簡(jiǎn)單,這樣便于將學(xué)生入門學(xué)習(xí)的重點(diǎn)轉(zhuǎn)移到代碼的分析和編寫上去,而不用過(guò)多去考慮界面如何實(shí)現(xiàn),因此采用C#作為程序入門語(yǔ)言既符合當(dāng)前web應(yīng)用為主流的行業(yè)趨勢(shì),又便于學(xué)生掌握相關(guān)基礎(chǔ)知識(shí)。
同時(shí),我們?cè)诔绦蛘Z(yǔ)言之外,還應(yīng)加強(qiáng)學(xué)生分析問(wèn)題、建立邏輯流程的概念。要讓學(xué)生養(yǎng)成在面對(duì)問(wèn)題時(shí),不是首先去考慮代碼如何實(shí)現(xiàn),而是通過(guò)畫框圖、流程圖等方法分析和建立問(wèn)題模型,要真正為學(xué)生建立起程序設(shè)計(jì)整體框架,從分析到實(shí)現(xiàn),從畫流程圖到編寫代碼,提高學(xué)生的邏輯思維能力,只有邏輯思維能力得到了提高,學(xué)生才能自己分析問(wèn)題,找到問(wèn)題的邏輯所在,從而完成程序設(shè)計(jì)的整個(gè)流程。
參考文獻(xiàn):
[1] 孫利輝.C語(yǔ)言指針教學(xué)難點(diǎn)探討[J].電腦知識(shí)與技術(shù),2006(17).
[2] 宋振方.以管理者的視角突破C++指針教學(xué)難點(diǎn)[J].現(xiàn)代計(jì)算機(jī),2011(3).
[3] 亓建蕓.關(guān)于提高Java語(yǔ)言教學(xué)質(zhì)量的研究與實(shí)踐[J].中國(guó)教育技術(shù)裝備,2011(24).
[4] 胡能發(fā).面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言C#教學(xué)研究[J].長(zhǎng)江大學(xué)學(xué)報(bào),2009(1).