程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 冒號和他的學生們(連載17)——語言討論

冒號和他的學生們(連載17)——語言討論

編輯:關於JAVA

17.語言討論

因了解而喜愛,因無知而憎惡                    ——題記

教室裡,學員們正熱火朝天地討論著流行的編程語言。冒號推門而入,沸水鍋被澆了一瓢冷水,立刻平靜下來。

冒號笑吟吟地看著大家:“怎麼不討論了?”

眾人齊道:“該您了!”

“首先需要聲明的是,本課評論編程語言,乃是應眾位之邀,實非本意。”冒號嚴肅起來,“因為這種評論,不可避免地會帶上個人色彩,容易產生誤導。正所謂,通禅悟道者拈花不語,坐井觀天者蛙鳴鼓噪。”

眾人迅速自動對號:看來我們就是一群蛤蟆。

“這樣一來,我的處境就很尴尬了。”冒號自嘲著。

有人在幸災樂禍地偷笑。

“也罷,即使作蛙鳴,至少也要先跳出井來。”冒號毅然決然地加入了蛤蟆的行列,“要談,就旗幟鮮明地談,該贊歎的就贊歎,該鄙視的就鄙視。說些你好我好大家好之類不痛不癢的話,倒不如不說。”

歎號一拍大腿:“好,這樣才夠痛快!”

冒號啟開話題:“如果說編程范式是一種文化,那麼編程語言更像是一種宗教——盡管它本不該是。每種語言都有大批忠實的信徒,隨時可能與其他的信徒發生宗教戰爭。”

逗號深有同感:“周圍和網上關於語言的爭論從來不絕於耳,志不同道不合者動辄惡語相向。”

冒號有些忿忿然:“這些信徒或准信徒們認為他們所崇拜的語言鶴立雞群,遠比其他語言高明得多,恨不得成為全天下程序員的通用語言。對其他語言的使用者,或居高臨下地同情,或不屑一顧地譏諷。無知與偏見總是相輔相成的,他們中的絕大多數頂多熟悉一兩種語言,其他的或淺嘗辄止、或道聽途說,卻敢妄評優劣,豈不可笑之極?”

引號點頭稱是:“是啊,沒有深入的了解,怎會有深入的比較。只是真正掌握好一門語言已殊為不易,同時掌握幾種就更難。學完一種語言再看另一種,總覺得別扭。”

“這就是第一堂課所說的‘學會’與‘會學’的差距。”冒號挑明,“每種語言都有天然設計上的不同,當你用得很別扭時,恰恰說明沒有真懂。正如刀法以劈為主,槍法以扎為主,你若反其道而行之,刀扎槍劈,怎不別扭?如果愣拿雙節棍當單節棍使,恐怕沒砸到別人先砸暈自己了。可見不是兵器問題,而是招法問題。”

下面隱約傳來周傑倫《雙節棍》的調子。

問號注意到:“似乎不只是初學者,大師們也會對一些語言提出過尖銳的批評。”

冒號引用道:“C++的發明者Bjarne Stroustrup說過這樣一句話,語言只有兩種:一種怨聲載道,一種無人問津。”

眾笑。

句號有所體會:“一種語言如果用者甚眾,自有其可取之處。沒有一種語言是完美的,愛之深者尚苛之切,何況其余者乎?”

冒號忽然問:“你們知道對一種語言最大的批判是什麼嗎?”

眾人紛紛搖頭。

“那就是發明一種與此語言有類似功用的新語言。”冒號語速放緩,“Stroustrup認為Simula太慢、BCPL又太底層,於是發明了C++;Gosling覺得C++用得不爽,於是發明了Java;微軟惱恨Java,於是請Hejlsberg發明了C#;Matsumoto用了兩年多的C++仍不順手,於是發明了Ruby。如此這般,不一而足。”

歎號無奈地說:“那是牛人的批評方法,常人怎能辦到?”

“沒有能力發明語言,就老老實實地用別人的吧。”冒號酷酷地說,“對待一門語言的態度應該是:與其抱怨爭執,不如揚長避短。”

引號順勢道:“按這種說法,編程語言的發展史就是一種批判史咯?”

冒號祭起辯證法:“從另一個角度看,發明一種語言也是對先前語言的一種最高的贊美。C++之於C,Java之於C++,C#之於Java,都是後者對前者的一種承認,哪怕是不情願的承認。批判與贊美,繼承與發展,謂之揚棄。”

眾人心想,語言課又改哲學課了。

冒號續道:“對於編程語言還有一種論調:語言只是一種工具,哪種都差不多。”

逗號接茬:“是啊,經常在論壇上看到一些高手這麼說。”

“一群偽高手,是工具就差不多?能拿錘子當刀使嗎?”冒號嗤之以鼻,“過分拔高一種語言與抹煞語言之間的差別是兩種極端,皆為秕言謬說。圖靈獎獲得者Alan Perlis曾說:如果一種語言不能影響你對編程的看法,那麼就不值得去了解。試想,一種沒有獨特魅力的語言如何吸引程序員趨之若骛?了解這些獨特之處對於編程往往至關重要,如果沿襲以前語言的做法,會顯得不倫不類甚至可能鑄成大錯。”

問號要求:“能具體點嗎?”

冒號舉例:“有人說,學C++要先學C;還有人說,學會了C,C++就不在話下了。”

歎號一驚:“難道不是嗎?”

冒號解釋:“其實C++的真正來源是Simula而不是C,向下兼容C只是因為C效率高、普及廣。換句話說,C++與C形同而神異。學會了C當然對C++有一定幫助,但若不能理解C++的OOP思想,那麼C的背景反而是一種障礙。”

逗號想當然:“C++與Java都是OO語言,差別該不大了吧?”

冒號再次否定:“一個純粹的C++程序員用Java編程,會非常不習慣沒有指針運算、沒有內存控制、沒有運算符重載、沒有自由函數等等。一個純粹的Java程序員用C++編程,會極度不適應相對貧乏的標准庫;會困惑於指針、引用、數組、字符串還有頭文件等的用法;會毫不吝惜地在堆(heap)上創建新對象,並且從來不去釋放它們。這些概念或用法都是貫穿整個程序始終的,差別能不大嗎?”

歎號聽罷歎曰:“做一個好的程序員還真不容易。”

“如果容易,我們開這個班做什麼?”冒號笑道,“提一個問題,程序員最不能離開的應用軟件是什麼?”

逗號順嘴道:“當然是IDE了。”

引號糾正:“應該是編輯器,有些程序員用vi甚至記事本來寫程序。”

冒號插一句:“有人還在命令行下寫程序。”

歎號眼瞪得溜圓:“怎麼可能?”

冒號眉毛一挑:“當然可能,一些簡單的程序完全可以在命令行下完成,然後重定向(redirect)到一個文件中或直接編譯執行。這種情況雖有些極端,對於那些沒有IDE就沒法編程的人來說更是不可思議,但至少說明離開編輯器還是有可能的。”

句號突然明白了:“是編譯器!”

“不錯,編譯器或解釋器。”冒號作了一點修正。

問號有點茫然:“為什麼談這個呢?”

“因為編譯器或解釋器是語言實現的標志。”冒號提高了聲調,“我想借此強調:對於一個程序員來說,語言為本,余者為末。許多人偏偏本末倒置,常常為在IDE、框架、設計工具等中挖掘到某一新功能而欣喜不已,或者津津樂道於各種語言的優劣高下,卻對正在使用的語言中大量的寶藏視而不見。這些人若有幸拜關公為師,他們最艷羨的一定他的赤兔馬和青龍偃月刀,或許還會抹紅臉蓄長須什麼的,就是不太願學他的蓋世武功。”

引號質疑:“您似乎有些唯語言論,設計思想不是更重要嗎?”

冒號補充道:“我所談的語言,當然不是孤立的語法和用法,也包括語言背後的編程范式和設計思想。”

問號仍有疑惑:“語言真那麼重要嗎?IDE的一些集成工具可以輔助生成許多代碼,或許到了某一天,拖拖鼠標、畫個UML類圖之類的,程序就大功告成了。”

冒號哈哈一笑:“這不就是元編程嗎?元編程也是用語言實現的。且不說你描繪的美景是否可能,即便實現了,程序員的任務也是用更高級的語言做更高級的編程——還是離不開語言。別忘了,技術含金量是與工資含金量成正比的,你永遠需要比別人多一門扎實的功夫。程序員這門職業,你選擇,你擔當。好了,閒話少說,下面我們該討論一些具體的語言了。”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved