明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

OOP的未來

[摘要]把寶押在Java上?或是堅持C++不動搖?還是考慮考慮C#?你是否猶豫不決?那么不妨先聽 聽下面這些專家的說法,對于面向?qū)ο蟪绦蛟O計語言的現(xiàn)狀和未來作一番了解。 科技進展一日千里,產(chǎn)品生產(chǎn)周期則越來越短,不少程序員已經(jīng)完全沒有時間掌握第二種 語言。不論一個程序員的技術(shù)能力是否被考慮,...

       把寶押在Java上?或是堅持C++不動搖?還是考慮考慮C#?你是否猶豫不決?那么不妨先聽 聽下面這些專家的說法,對于面向?qū)ο蟪绦蛟O計語言的現(xiàn)狀和未來作一番了解。 
       科技進展一日千里,產(chǎn)品生產(chǎn)周期則越來越短,不少程序員已經(jīng)完全沒有時間掌握第二種 語言。不論一個程序員的技術(shù)能力是否被考慮,對于他來說,將來能夠參與什么類型的項 目,加盟什么樣的公司,在很大程度上,將取決于今天選擇哪種程序設計語言。為了幫助 大家清晰地了解C++和Java這兩個最流行的OOP語言現(xiàn)在和將來的有關(guān)情況,我們采訪了C+ +語言的設計者Bjarne Stroustrup,以及Sun公司著名工程師Tim Lindholm。下面是他們的 觀點,內(nèi)容涉及程序設計的未來、語言之間的比較、OOP語言的發(fā)展與革新之取舍以及程序設計標準。

未來
在未來三年,程序員編寫代碼的方式會發(fā)生那些變化?

Stroustrup: 在C++中,假如沒有合適的庫在背后支撐,完成任何重要的工作都可能是很復 雜的。而一旦有了合適的庫,任何東西都可以被我們操控于股掌之間。因此,構(gòu)造和使用 程序庫的重要性與日俱增。這也暗示我們,泛型程序設計(generic programming)將會越來越多地被運用。只有通過GP,我們才能確保庫的通用性和高效率。我還預期在分布式計算 和“組件(components)”應用領(lǐng)域會出現(xiàn)喜人的增長。就大部分程序員而言,通過使用 方便適用的程序庫,這些開發(fā)工作會變得簡單明了。 現(xiàn)在有一個趨勢,編譯器廠商試圖把其特有的“對象模型”和圖形界面(GUI)細節(jié)推銷給用 戶。比如微軟的COM和Inprise的類屬性“properties”。對于用戶來說,這既不要,也不情愿。我所希望看到的程序庫,應該是用標準C++打造,界面靈活,值得信賴的程序庫。 通常,這些界面應該是平臺無的。C++的表達能力極強,即使不使用大量的宏,也應該足 以達成這一要求。就算有些地方無法百分之百的遵守這一原則,也應該將對于平臺和廠家 的依賴性限制起來。這個目標的完成情況,可以反映軟件工具產(chǎn)業(yè)對于應用程序開發(fā)行業(yè) 的關(guān)注程度。我懷疑目前對于那些獨立的、跨平臺廠商來說,并不存在相應的市場。如果能夠建立這樣的市場,也許能夠促進廠商們?yōu)榭蛻糇龀觥罢嬲杏玫摹逼贰?

Lindholm: 對于編寫代碼的開發(fā)者來說,主要的驅(qū)動力量仍將是兩個:網(wǎng)絡和分布式—— 也就是設計和開發(fā)非單機軟件的需求。大部分的應用程序?qū)⒉粫枪铝懔愕剡\行在單一設備上,而是運用了類似EJB和JSP之類技術(shù)的,平臺無關(guān)的分布式程序。程序員們將不得不 面對分布式計算的重重險阻。這將對許多程序員所依賴的設計模式、技術(shù)和直覺構(gòu)成嚴峻 的挑戰(zhàn)。這是選擇編程語言之前必須認識到的,盡管不同語言的設計特性可能促進或者阻礙這一轉(zhuǎn)化。在網(wǎng)絡應用的增長中,一個很重要的部分是小型移動設備和特殊Internet設備的爆炸性增長。這些設備各有各的操作系統(tǒng),或者只在某種特定的設備領(lǐng)域內(nèi)有共同的操作系統(tǒng)。我們現(xiàn)在還可以一一列舉出這些設備——家庭接入設備、蜂窩電話、電子報紙、PDA、自動網(wǎng)絡設備等等。但是這些設備領(lǐng)域的數(shù)量和深入程度將會很快變得難以估量。我們都知道這個市場大得驚人,PC的興起與之相比不過小菜一碟。因此在這些設備的應用程序市場上,競爭將會相當殘酷。獲勝的重要手段之一,就是盡快進入市場。開發(fā)人員需要優(yōu)秀的工具,迅速高效地撰寫和調(diào)試他們的軟件。平臺無關(guān)性也是制勝秘訣之一,它使得程序員能夠開發(fā)出支持多種設備平臺的軟件。我預期的另一個變化是,我們對于代碼(Java)和數(shù)據(jù)(XML)協(xié)同型應用程序的開發(fā)能力將會不斷提高。這種協(xié)同是開發(fā)強大應用程序的核心目標之一。我們從XML的迅速流行和ebXML 規(guī)范的進展中,已經(jīng)看到了這個趨勢。ebXML是一個針對電子商務和國際貿(mào)易的,基于XML 的開放式基礎構(gòu)架,由聯(lián)合國貿(mào)易促進和電子商務中心(UN/CEFACT)與結(jié)構(gòu)性信息標準推進組織(OASIS)共同開發(fā)。

我們能否期望出現(xiàn)一個真正的面向組件(component-oriented)的語言?它的創(chuàng)造者會是誰 呢?

Stroustrup: 我懷疑,這個領(lǐng)域中之所以缺乏成果,正是因為人們——主要是那些非程序 員們——對“組件”這個意義含糊的字眼寄予了太多的期望。這些人士夢想,有朝一日, 組件會以某種方式把程序員趕出歷史舞臺。以后那些稱職的“設計員”只需利用預先調(diào)整好的組件,把鼠標拖一拖放一放,就把系統(tǒng)組合出來。對于軟件工具廠商來說,這種想法還有另一層意義,他們認為,到時候只有他們才保留有必要的技術(shù),有能力編寫這樣的組件。這種想法有一個最基本的謬誤:這種組件很難獲得廣泛歡迎。一個單獨的組件或框架(fra mework),如果能夠滿足一個應用程序或者一個產(chǎn)業(yè)領(lǐng)域?qū)λ岢龅拇蟛糠忠蟮脑,對于其制造者來說就是劃算的產(chǎn)品,而且技術(shù)上也不是很困難?墒窃摦a(chǎn)業(yè)內(nèi)的幾個競爭者很快就會發(fā)現(xiàn),如果所有人都采用這些組件,那么彼此之間的產(chǎn)品就會變得天下大同,沒什么區(qū)別,他們將淪為簡單的辦事員,主要利潤都將鉆進那些組件/框架供應商的腰包里!小“組件”很有用,不過產(chǎn)生不了預期的杠桿效應。中型的、更通用的組件非常有用,但是構(gòu)造時需要非同尋常的彈性。在C++中,我們綜合運用不同共享形式的類(classhierarchies),以及使用template s精心打造的接口,在這方面取得了一定的進展。我期待在這個領(lǐng)域取得一些有趣和有用的成果,不過我認為這種成果很可能是一種新的C++程序設計風格,而不是一種新的語言。 
 
Lindholm: 編寫面向組件的應用程序,好像更多的是個投資、設計和程序員管理方面的問題,而不是一個編程語言問題。當然某些語言在這方面具有先天優(yōu)勢,不過如果說有什么魔術(shù)般的新語言能夠大大簡化組件的編寫難度,那純粹是一種誤導。

微軟已經(jīng)將全部賭注押在C#上,其他語言何去何從?

Stroustrup: C++在下一個十年里仍然將是一種主流語言。面對新的挑戰(zhàn),它會奮起應對。一個創(chuàng)造了那么多出色系統(tǒng)的語言,絕不“坐視落花流水春去也”。我希望微軟認識到,它在C++(我指的是ISO標準C++)上有著巨大的利益,C++是它與IT世界內(nèi)其他人之間的一橋梁,是構(gòu)造大型系統(tǒng)和嵌入式系統(tǒng)的有效工具,也是滿足高性能需求的利器。其他語言,似乎更注重那些四平八穩(wěn)的商用程序。

競爭
C#會不會獲得廣泛的接受,并且擠掉其他的語言?

Lindholm: 通常,一種語言既不會從別的語言那里獲利,也不會被擠掉。那些堅定的Fortran程序員不還用著Fortran嗎?對于個人來說,語言的選擇當然因時而異,但就整體而言,語言的種類只會遞增,也就是說,它們之間的關(guān)系是“有你有我”而不是“有你沒我”。對于一個新語言的接受程度,往往取決于其能力所及。Java技術(shù)被迅速接受,原因是多方面的,Internet和World Wide Web接口,在其他技術(shù)面前的挫折感,對于Java技術(shù)發(fā)展方向的全面影響能力,都是原因。另一個重要的原因是Java獨立于廠商,這意味著在兼容產(chǎn)品面前可以從容選擇。C#是否會獲得廣泛接受?視情況而定。總的來說,那些對于平臺無關(guān)性和廠商無關(guān)性漠不 關(guān)心的程序員,可能會喜歡C#。那些跟微軟平臺捆在一起人當然可能想要尋找VB 和VC的一個出色的替代品。但是對于程序跨平臺執(zhí)行能力特別關(guān)注的程序員,將會堅守Java之類的語言。這種能力對于多重訪問設備(multiple access devices)和分布式計算模型至關(guān)重
要,而Java語言提供了一個標準的、獨立于廠商運行時環(huán)境。

Stroustrup: C#的流行程度幾乎完全取決于微軟投入的資金多少?瓷先#的興起肯定會犧牲掉其他一些語言的利益,但是事實上未必如此。Java的蓬勃發(fā)展并沒有給C++帶來衰敗。C++的應用仍然在穩(wěn)定增長(當然,已經(jīng)不是爆炸性的增長了)。也許其他的語言也還能
獲得自己的一席之地。 不過,我實在看不出有什么必要再發(fā)明一種新的專有語言。特別是微軟,既生VB,何需C#

不同OOP語言各有什么優(yōu)勢和劣勢?

Stroustrup: C++的優(yōu)點自始至終都是這么幾條:靈活、高效,而且并非專有語言,F(xiàn)在ISO C++標準的出現(xiàn),鞏固了最后一點。我認為C++的高效是它最基本的優(yōu)點。這種高效來自于其特有的數(shù)據(jù)和計算模型,較之Java和C#,這種模型更加貼近機器。不過,哪些程序才真正地渴望這么高的效率?這是個問題。我認為這類程序非常多。人們對于計算機的期望,永遠都超越硬件科技的發(fā)展速度。很顯然,Java和C#的設計者的想法不同,他們認為,在很多地方效率問題無關(guān)緊要。C++主要的缺點,歸罪于糟糕的教育(是那些始終認為C++是個純粹面向?qū)ο笳Z言的人,和那些把C++當成C語言變體的人導致了這種情況),歸罪于不同平臺上的不一致性,歸罪于不完整、不標的編譯器實現(xiàn),歸罪于平臺無關(guān)的系統(tǒng)級程序庫的缺少。這些問題歸于一點,就是缺乏一個卓越的廠商,能夠滿足整個C++社區(qū)的需求,勇于投入大量的資金開發(fā)必要的程序庫。

Lindholm: Java技術(shù)的成功,是因為它在合適的時間,出現(xiàn)在合適的地點,而且合理地選擇了語言和計算平臺的支持目標。Java并不是在所有場合都優(yōu)于其他OOP語言,但是對于出現(xiàn)的新問題能夠解決得很出色。它面向Internet計算環(huán)境,避免了C++中晦澀的結(jié)構(gòu),成功翻越了繼承機制的惱人問題。垃圾收集機制顯著地提高了生產(chǎn)率,降低了復雜度。在網(wǎng)絡背景下使用虛擬機,以及有關(guān)安全性和動態(tài)加載的一系列設計選擇,迎合了正在出現(xiàn)的需求和愿望。這些特性使Java不僅成為現(xiàn)有程序員的新武器,而且也為新的程序員創(chuàng)造了繁
榮的市場空間。此外,Java擁有一個標準化的、二進制形式的類庫,提供了必要的(當然并非充分的)平臺與廠商無關(guān)性。平臺與廠商無關(guān)性要求一項技術(shù)必須有清晰的規(guī)范,摒棄那些阻礙二進制標準實施的特性。C++雖然有一個ISO標準,但其實甚至對于相同系統(tǒng)與相同指令體系的各個平臺,也提不出一個實用的、各版本兼容的二進制標準。歷史上很多使用虛擬機的語言飽受責難,是因為其不夠出色的性能問題,而這要歸過于緩慢的解釋器和糟糕的垃圾收集器。Java的早期實現(xiàn)也因為同樣的問題受到嚴厲的批評。但是自那時起,業(yè)界向新的虛擬機實現(xiàn)技術(shù)投入了大量資金,取得了顯著的效果,如今在大部分場合,Java的性能跟常規(guī)的靜態(tài)編譯語言相比毫不遜色。這使得程序員在獲得平臺和廠商無關(guān)性的同時,也不必付出性能上的代價。C++并沒有強制使用面向?qū)ο蠓椒,因此為了編寫出色的面向(qū)ο蟠a,就要求程序員們有相當強的紀律性。很多公司就是因為這個原因放棄了C++。作為語言,Java的一個突出的優(yōu)點就是強制面向?qū)ο蠓椒ǎ辉试S非面向?qū)ο蟮慕Y(jié)構(gòu)。C#介于C++和Java之間,腳踏兩只船,因此既不夠安全,又失之復雜。

對于公司來說,采用新的語言要付出巨大代價。雇不到好的程序員(沒人熟悉這種新語言),培訓費用高得驚人,學習過程中生產(chǎn)率和產(chǎn)品質(zhì)量下降,多年的經(jīng)驗隨風消逝,等等 。一種語言如何克服這些障礙?

Lindholm: 說得很對,采用新東西確實常常開銷巨大。不過問題是:這個新東西是否能夠節(jié)省更多的開支,或者提供巨大的改進,獲取合理的回報?很多公司發(fā)現(xiàn),轉(zhuǎn)向Java技術(shù)不論在開發(fā)的后端(盡快進入市場、快速迭代開發(fā)、維護簡單性)還是前端(跨平臺發(fā)布,適用范圍從低端設備到高端服務器的技術(shù),安全性),都能節(jié)省大筆的開銷。對于新事物的接納,常常是在痛楚的壓力之下。很大程度上,這正是Java所經(jīng)歷的。Java的產(chǎn)生,是對當時很多系統(tǒng)的缺陷所做出的反應。Java技術(shù)通過下面的手段減輕了開發(fā)者的痛楚:1) 顧及了網(wǎng)絡計算方面的需求,是應運而生。2) 在技術(shù)能力的抉擇上,保持良好的品位,顧及了大眾的心理。3) 采用適度強制性策略推行設計決定。此外,Java技術(shù)已經(jīng)成為大學教學中的主流,這同樣保證了Java開發(fā)者隊伍的不斷壯大。但是最重要的一點是,再沒有另一種程序設計技術(shù),能夠像Java那樣允許程序員開發(fā)基于Internet的不同平臺之上的應用程序。Java平臺在這方面的杰出表現(xiàn),已經(jīng)被大量的實例
證明。Java已經(jīng)成為Internet上的缺省應用程序平臺,Java APIs也成為Internet應用程序開發(fā)的天然平臺。

Stroustrup: 微軟和Sun把大筆的金錢扔在Java、VB和C#中,并不是因為他良心發(fā)現(xiàn),也不是因為他們真的相信這些語言能夠帶給程序員更美好的生活,而是利益使然。有一個說法,認為軟件工具廠商如果能夠把應用程序開發(fā)者的專業(yè)技術(shù)任務負擔起來,將獲取巨大的經(jīng)濟利益。我對其背后的經(jīng)濟分析頗為懷疑,我認為這很難成為現(xiàn)實,特別是當應用程序開發(fā)者使用開放的、標準化的工具時,他們可以有多種選擇,從而使上面的想法更加不可能。

多年以前,C++就已經(jīng)具有泛型能力(也就是templates和STL),有運算符重載,有枚舉類型?我們會不會在Java的未來版本中看到這些特性?Java是不是應該納入這些特性呢?

Strousturp:從1988-89年起,C++就已經(jīng)有了templates。但是我們花了不少時間來了解如何最好地運用這個工具,早期各廠家對于template的支持在品質(zhì)上也有很大的差異。有些編譯器廠商動作遲緩,至少有一個主要的編譯器廠商(好像是指微軟,微軟在Visual C++ 4.0才開始支持template,在此之前一直聲稱template是過于復雜而又沒什么用的技術(shù),時至今日,Visual C++對于template的支持在主流編譯器中都屬于最差的一檔——譯者注)暗中鼓勵聲名狼藉的反template宣傳,直到他們自己終于學會了這項技術(shù)為止。直到今天,對于template的支持在品質(zhì)上仍然有待改進。你上面提到的那些特性,我認為Java(還有C#)應該,也肯定會逐漸引入。那些對于程序員來說最有用的語言特性和概念,將會逐漸集中,成為各家主流語言的必然之選。也就是 說,我認為類似析構(gòu)函數(shù)和模板特殊化之類的機制,遠遠比枚舉等機制重要得多。

Lindholm:Java技術(shù)成功的原因之一,就是很清楚哪些不該做。我們得多問幾個為什么:這項特性是不是必不可少?增加它會帶來哪些開銷?運算符重載是C++中一項極其強大的特性,但是它也大大增加了C++語言的復雜度,很多人都難以招架。Java在各種可能的權(quán)衡之
中,做出了明智的抉擇,找到了能力與需求之間的完美平衡點。當然,Java也會發(fā)展,而且最重要的是,現(xiàn)在是開發(fā)者們在推動發(fā)展Java增加泛型能力這件事,很好地展示了Java是如何通過整個開發(fā)者社群的參與,在權(quán)衡中決定正確的平衡點。關(guān)于增加泛型類型(generic types)的“Java規(guī)格申請”(Java Specification Re quest, JSR)已經(jīng)進入JCP(Java Community Process)程序,而且已經(jīng)開發(fā)了很長一段時間(參見 http://java.sun.com/aboutJava/communityprocess/之JSR-014)。現(xiàn)在,在JCP中,有超過80個JSRs正在討論中,這充分體現(xiàn)了整個體系對開發(fā)者的積極反饋和高度合作,這正是驅(qū)動Java平臺不斷進化的動力。

發(fā)展 vs. 革新(Evolution vs. Revolution)C++是一種發(fā)展型的語言,Java和C#似乎更像是革新型語言(它們是從頭設計的)?什么時候,革新型的語言才是必需的呢?

Lindholm: Java技術(shù)并非憑空出世,反而更像是發(fā)展型的。Java所有的特性,在Java平臺 推出之前,都至少已經(jīng)存在于另一種環(huán)境之中。Java的貢獻在于,在眾多的特性和權(quán)衡中,做出了合理的選擇,使得產(chǎn)品既實用,又優(yōu)雅。Java技術(shù)對于程序員的態(tài)度是:撫養(yǎng),
但不溺愛。

Stroustrup:從技術(shù)上講,我并不認為Java和C#是什么“從頭設計的”革新型語言。倘若Java是從技術(shù)原則出發(fā),從頭設計,大概就不會模仿C/C++那種丑陋和病態(tài)的語法了(不必驚訝,Stroustrup在很多場合表示過,C++采用C的語法形式,實在是迫于兼容性。他本人
更偏愛Simula的語法——譯者)。我認為,只有當程序員們面對的問題發(fā)生了根本的變化的時候,或者當我們發(fā)現(xiàn)了全新的
、極其優(yōu)越的程序設計技術(shù),又完全不能為現(xiàn)存語言所支持的時候,我們才需要全新的語言。問題是,我們恐怕永遠也碰不到那些“根本”、“全新”的情況。我以為,自從OOP問世以來,可稱為“根本”的新型程序設計技術(shù),唯有泛型程序設計(generic programming)和生成式程序設計(generative programming)技術(shù),這兩項技術(shù)主要是源于C++ templates技術(shù)的運用,也有一部分曾經(jīng)被視為面向?qū)ο蠛秃瘮?shù)式語言(functional languages)的次要成分,現(xiàn)在都變成正式、可用和可承受的技術(shù)了。我對于目前C++模板(template)程序設計的成果非常興奮。例如,像POOMA, Blitz++和MTL等程序庫,在很多地方改變了數(shù)值計算的方式。

Java和C#的一個“賣點”,就是它們的簡單性,F(xiàn)在Java是不是快失去這個賣點了?

Stroustrup:新語言總是宣稱自己如何如何簡單,對老語言的復雜性頗多非議。其實這種所謂的“簡單性”,簡單地說,就是不成熟性。語言的復雜性,是在解決現(xiàn)實世界中極為煩瑣和特殊的復雜問題的過程中逐漸增加的。一個語言只要活的時間夠長,總會有某些地方逐漸復雜起來,或者是語言本身,或者是程序庫和工具。C++和Java顯然都不例外,我看C#也一樣。如果一種語言能夠度過自己的幼年時代,它會發(fā)現(xiàn),自己無論是體積還是復雜性都大大增加了。

Lindholm:Java技術(shù)的的功能在增加,需要學習的東西也在增加。不過功能的增加并不一定帶來復雜性的增加。Java技術(shù)的發(fā)展,并沒有使學習曲線更加陡峭,只是讓它繼續(xù)向右方延展了。

標準
標準化語言和開放型語言各自的優(yōu)點和缺點何在?

Lindholm:對于一個開放、不允許專有擴展、具有權(quán)威的強制性標準語言或者運行環(huán)境來說,不存在什么缺點。允許專有擴展就意味著允許廠商下套子綁架客戶。特別重要的是,必須讓整個平臺,而不只是其中一部分完全標準化,才能杜絕廠商們利用高層次的專有API下套子?蛻粢笥羞x擇廠商的自由,他們既要有創(chuàng)造性,又需要兼容性。

Stroustrup:對于一個語言,如C/C++來說,建立正式標準(如ISO標準)最大的好處,在于可以防止某一個廠商操縱這種語言,把它當成自己的搖錢樹。多個廠商的競爭給用戶帶來的是較低的價位和較好的穩(wěn)定性。專有語言的好處,一是流行,二是便宜(不過等你被套牢了之后,情況就會起變化),三是對于商業(yè)性需求可以做出快速的反應。標準化語言的特點之一是,它不能忽略特殊用戶的需求。比如我在AT&T中所考慮的東西,其規(guī)模、可靠性和效率要求,跟那些普通廠商關(guān)注的大眾軟件相比,根本不可同日而語。那些公司很自然只關(guān)注主要的需求。然而,多數(shù)大機構(gòu)和身處前沿的公司,都有著特殊的需求。C++的設計是開放、靈活和高效的,能夠滿足我所能想象的任何需求。跟其他的現(xiàn)代語言相比,C++的家長式作風可謂少之又少,原因就在這。當然,不能贊賞這一點的人會詬病C++“危險”。擁有正式和開放標準的語言主要是為編程工具的使用者和客戶服務的,而擁有專屬“標準
”的語言,主要是為廠商服務的。

關(guān)于作者
Bjarne Stroustrup是C++的設計者和最早的實現(xiàn)者,The C++ Programming Language, The Design and Evolution of C++等書籍的作者。先后畢業(yè)于丹麥Aarhus大學和英國劍橋大學。Stroustrup博士是AT&T實驗室大規(guī)模程序設計研究部門負責人,AT&T成員,AT&T貝爾
實驗室成員,ACM成員。

Tim Lindholm是Sun公司杰出的工程師。他是Java平臺開發(fā)組最早的成員之一,負責Java中的線程、同步、垃圾收集和內(nèi)存管理部分。他與人合著了The Java Virtual Machine Specification一書,目前致力于Java技術(shù)平臺體系研究。





標簽:OOP的未來 

相關(guān)文章