[轉載]C++之父B. Stroustrup言論- -
??????????????????????????????????????
翻譯者 : myan
[譯者按] Bjarne Stroustrup博士,1950年出生于丹麥,先后畢業于丹麥阿魯斯大學和英國劍橋大學,AT&T大規模程序設計研究部門負責人,AT&T、貝爾實驗室和ACM成員。1979年,B. S開始開發一種語言,當時稱為揅 with Class?#65292;后來演化為C++。1998年,ANSI/ISO C++標準建立,同年,B. S推出了其經典著作The C++ Programming Language的第三版。C++的標準化標志著B. S博士傾20年心血的偉大構想終于實現。但是,計算技術的發展一日千里,就在幾年前人們還猜想C++最終將一統天下,然而隨著Internet的爆炸性增長,類似Java、C#等新的、現代感十足的語言咄咄逼人,各種Script語言更是如雨后春筍紛紛涌現。在這種情況下,人們不禁有些惶恐不安。C++是不是已經過時了呢?其前景如何?標準C++有怎樣的意義?應該如何學習?我們不妨看看B. S對這些問題的思考。以下文字是譯者從Stroustrup1998年之后發表的若干文章、談話筆記中精選出來的,由于出處不一,內容多有重復。為保持完整,亦一并譯出。以下內容選自B. S在自己主頁上發表的FAQ。
1、請談談C++書。
沒有,也不可能有一本書對于所有人來說都是最好的。不過對于那些真正的程序員來說,如果他喜歡從?#32463;典風格?#30340;書中間學習一些新的概念和技術,我推薦我的<The C++ Programming Language>, 1998年的第三版和特別版。那本書講的是純而又純的C++,完全獨立于平臺和庫(當然得講到標準庫)。該書面向那些有一定經驗的程序員,幫助他們掌握C++,但不適合毫無經驗的初學者入門,也不適合那些臨時程序員品嘗C++快餐。所以這本書的重點在于概念和技術,而且在完整性和精確性上下了不少功夫。如果你想知道為什么C++會變成今天的模樣,我的另一本書<The Design and Evolution of C++> 能給你滿意的答案。理解設計的原則和限制能幫助你寫出更好的程序。www.accu.com是最好的書評網站之一,很多有經驗的程序員在此仗義執言,不妨去看看。
2. 學習C++要花多長時間?
這要看你說的?#23398;習?#26159;什么意思了。如果你是一個Pascal程序員,你應該能很快地使你的C++水平達到與Pascal相近的程度;而如果你是一個C程序員,一天之內你就能學會使用C++進行更出色的C風格編程。另一方面,如果你想完全掌握C++的主要機制,例如數據抽象,面向對象編程,通用編程,面向對象設計等等,而此前又對這些東西不很熟悉的話,花上個一兩年是不足為奇的。那么是不是說這就是學習C++所需要的時間呢?也許再翻一番,我想打算成為更出色的設計師和程序員最起碼也要這么長的時間。如果學習一種新的語言不能使我們的工作和思想方式發生深刻的變革,那又何苦呢?和成為一個鋼琴家或者熟練掌握一門外語相比,學習一種新的、不同的語言和編程風格還算是簡單的。
3. 了解C是學習C++的先決條件嗎?
否!C++中與C相近的子集其實比C語言本身要好學,類型方面的錯誤會少一些,也不像C那樣繞圈子,還有更好的支持庫。所以應該從這個子集開始學習C++。
4. 要想成為真正的OO程序員,我是不是得先學習Smalltalk?
否。如果你想學Smalltalk,盡管去學。這種語言很有趣,而且學習新東西總是一個好主意。但是Smalltalk不是C++,而且把Smalltalk的編程風格用在C++里不會有什么好結果。如果你想成為一個出色的C++程序員,而且也沒有幾個月的時間百無聊賴,請你集中力量學好C++以及其背后的思想。
5. 我如何開始學習C++?
這取決于你的基礎和學習動機。如果你是個初學者,我想你最好找個有經驗的程序員來幫助你,要不然你在學習和實踐中不可避免的犯下的種種錯誤會大大地打擊你的積極性。另外,即使你的編譯器配備了充足的文檔資料,一本C++書籍也永遠是必不可少的,畢竟文檔資料不是學習編程思想的好教材。選擇書籍時,務必注意該書是不是從一開始就講授標準C++,并且矢志不渝地使用標準庫機制。例如,從輸入中讀取一個字符串應該是這樣的:
string s; // Standard C++ style
cin >> s;
而不是這樣的:
char s[MAX]; /* Standard C style */
scanf("%s",s);
去看看那些扎實的C++程序員們推薦的書吧。記住,沒有哪本書對所有人來說都是最好的。另外,要寫地道的C++程序,而避免用C++的語法寫傳統風格的程序,新瓶裝舊酒沒多大意義。(遺憾的是,目前在市面上的中文C++教材中,符合B. S的這個標準的可以說一本都沒有,大家只好到網上找一些英文的資料來學習了。棗譯者)
6. 怎樣改進我的C++程序?
不好說,這取決于你是怎么使用該語言的。大多數人低估了抽象類和模板的價值,反過來卻肆無忌憚地使用造型機制(cast)和宏。這方面可以看看我的文章和書。抽象類和和模板的作用當然是提供一種方便的手段建構單根的類層次或者重用函數,但更重要的是,它們作為接口提供了簡潔的、邏輯性的服務表示機制。
7. 語言的選擇是不是很重要?
是,但也別指望奇跡。很多人似乎相信某一種語言能夠解決他們在系統開發中遇到的幾乎所有問題,他們不斷地去尋找完美的編程語言,然后一次次的失敗,一次次的沮喪。另外一些人則將編程語言貶為無關緊要的細節,把大把大把的銀子放在開發流程和設計方法上,他們永遠都在用著COBOL, C和一些專有語言。一種優秀的語言,例如C++,能幫助設計者和程序員做很多事情,而其能力和缺陷又能夠被清楚地了解和對待。
8. ANSI/ISO標準委員會是不是糟蹋了C++?
當然不是!他們(我們)的工作很出色。你可以在一些細節上找些歪理來挑刺,但我個人對于這種語言以及新的標準庫可是欣欣然。ISO C++較之C++的以前版本更出色更有條理。相對于標準化過程剛剛開始之初,你今天可以寫出更優雅、更易于維護的C++程序。新的標準庫也是一份真正的大禮。由于標準庫提供了strings, lists, vectors, maps以及作用于其上的基本算法,使用C++的方式已經發生了巨大的變化。
9. 你現在有沒有想刪除一些C++特性?
沒有,真的。問這些問題的人大概是希望我回答下面特性中的一個:多繼承、異常、模板和RTTI。但是沒有它們,C++就是不完整的。在過去的N年中,我已經反復考慮過它們的設計,并且與標準委員會一起改進了其細節,但是沒有一個能被去掉又不引起大地震。
從語言設計的角度講,我最不喜歡的部分是與C兼容的那個子集,但又不能把它去掉,因為那樣對于在現實世界里工作的程序員們來說傷害太大了。C++與C兼容,這是一項關鍵的設計決策,絕對不是一個叫賣的噱頭。兼容性的實現和維護是十分困難的,但確實使程序員們至今受益良多。但是現在,C++已經有了新的特性,程序員們可以從麻煩多多的C風格中解脫出來。例如,使用標準庫里的容器類,像vector, list, map, string等等,可以避免與底層的指針操作技巧混戰不休。
10. 如果不必和C兼容,你所創造的語言是不是就會是Java?
不是,差得遠。如果人們非要拿C++和Java來做比較,我建議他們去閱讀<The Design and Evolution of C++>,看看C++為什么是今天這個樣子,用我在設計C++時遵從的原則來檢驗這兩種語言。這些原則與SUN的Java開發小組所持的理念顯然是不同的。除了表面語法的相似性之外,C++與Java是截然不同的語言。在很多方面,Java更像Smalltalk(譯者按:我學習Java時用的是Sun的培訓教材,里面清楚地寫道:Java在設計上采用了與C++相似的語法,與Smalltalk相似的語義,所以可以說Java與C++是貌合神離,與Smalltalk才是心有靈犀)。Java語言相對簡單,這部分是一種錯覺,部分是因為這種語言還不完整。隨著時間的推移,Java在體積和復雜程度上都會大大增長。在體積上它會增長兩到三倍,而且會出現一些實現相關的擴展或者庫。這是一條每個成功的商業語言都必須走過的發展之路。隨便分析一種你認為在很大范圍內取得了成功的語言,我知道肯定是無有例外者,而且實際上這非常有道理。
上邊這段話是在Java 1.1推出之前寫的。我確信Java需要類似模板的機制,并且需要增強對于固有類型的支持。簡單地說,就是為了基本的完整性也應該做這些工作。另外還需要做很多小的改動,大部分是擴展。1998年秋,我從James Gosling(Java語言的創始人棗譯者)那里得到一份建議書,說是要在Java中增加固有類型、操作符重載以及數學計算支持。還有一篇論文,是數學分析領域的世界級大師,伯克利大學的W. Kahan教授所寫的How Java抯 Floating-Point Hurts Everyone Everywhere(?#19988;看Java的浮點運算如何危害了普天下的蕓蕓眾生敆?#35793;者),揭露了Java的一些秘密。我發現在電視和出版物中關于Java的鼓吹是不準確的,而且氣勢洶洶,讓人討厭。大肆叫囂凡是非Java的代碼都是垃圾,這是對程序員的侮辱;建議把所有的保留代碼都用Java重寫,這是喪心病狂,既不現實也不負責任。Sun和他的追隨者似乎覺得為了對付微軟罪惡的?#24093;國時代?#65292;就必須如此自吹自擂。但是侮辱和欺詐只會把那些喜歡使用不同編程語言的程序員逼到微軟陣營里去。
Java并非平臺無關,它本身就是平臺。跟Windows一樣,它也是一個專有的商業平臺。也就是說,你可以為Windows/Intel編寫代碼,也可以為Java/JVM編寫代碼,在任何一種情況下,你都是在為一個屬于某個公司的平臺寫代碼,這些代碼都是與該公司的商業利益扯在一起的。當然你可以使用任何一種語言,結合操作系統的機制來編寫可供JVM執行的程序,但是JVM之類的東西是強烈地偏向于Java語言的。它一點也不像是通用的、公平的、語言中立的VM/OS。
私下里,我會堅持使用可移植的C++作大部分工作,用不同的語言作余下的工作。(Java is not platform-independent, it is the platform?#65292;B. S的這句評語對于C++用戶有著很大的影響,譯者在國外的幾個新聞組里看到,有些C++高手甚至把這句話作為自己的簽名檔,以表明對Java的態度和誓死捍衛C++的決心。實際上有很多程序員不光是把自己喜愛的語言當成一種工具,更當成一種信仰。棗譯者)