------專訪C++之父Bjarne Stroustrup博士------ 《C++程序設(shè)計(jì)語言(特別版)》試讀 感謝C++ View讓我們轉(zhuǎn)載它的這篇專訪(2000-2002 C-View.ORG All Rights Reserved),未得C++ View同意,任何人請(qǐng)勿將此文再做轉(zhuǎn)載。采訪:蟲蟲,翻譯:ALNG Bjarne Stroustrup博士,C++語言的設(shè)計(jì)者和最初實(shí)現(xiàn)者,現(xiàn)任AT&T實(shí)驗(yàn)室的大型程序設(shè)計(jì)研究部的主管。著有《C++程序設(shè)計(jì)語言》(1985年第1版,1991年第2版,1997年第3版,2000年特別版)、《The Annotated C++ Reference Manual》和《C++語言的設(shè)計(jì)與演化》。Bjarne于1950年生于丹麥美麗的港口城市奧爾胡斯市,在奧爾胡斯大學(xué)取得碩士學(xué)位,在英國著名的劍橋大學(xué)完成了他的博士學(xué)業(yè)......更多>>> 專訪索引 1、C++的標(biāo)準(zhǔn)化進(jìn)程 2、C++的模板函數(shù) 3、經(jīng)典流 4、C++、Java與C# 5、Bjarne看C++的機(jī)制 6、STL與C++的GUI 7、在C++中相得益彰的GP和OO 8、今后C++將支持分布開發(fā) 9、愛好廣泛的Bjarne 10、Bjarne的中國觀 1、C++的標(biāo)準(zhǔn)化進(jìn)程                             TOP 記者:C++的ANSI/ISO標(biāo)準(zhǔn)化標(biāo)志著C++的成熟。能告訴我們?cè)谶@個(gè)標(biāo)準(zhǔn)化的過程中,您感到最難忘、最快樂以及最遺憾的事分別是什么嗎? Bjarne Stroustrup:標(biāo)準(zhǔn)化進(jìn)程其實(shí)是一項(xiàng)極具價(jià)值的重大活動(dòng),但是人們對(duì)它認(rèn)識(shí)太不足了,而且整個(gè)進(jìn)程也是荊棘滿途。實(shí)際上,通過標(biāo)準(zhǔn)化活動(dòng),C++語言顯得越發(fā)成熟和完善了,還因此而獲得了有著驚人表達(dá)能力的標(biāo)準(zhǔn)庫。編譯器的廠商老想束縛住他們的用戶,而正式的標(biāo)準(zhǔn)化活動(dòng),則是用戶們?yōu)閿?shù)不多的自衛(wèi)手段之一。   很難說哪一件事是最特別的。在委員會(huì)中,大多數(shù)的工作都是發(fā)現(xiàn)、提煉和建立信任的這樣一個(gè)過程,這都需要花費(fèi)大量的時(shí)間。不過最重要的事莫過于以下兩件事,其一是1990年基于《The C++ Programming Language》第2版的參考手冊(cè)(有模板和異常處理機(jī)制的那一版)進(jìn)行C++標(biāo)準(zhǔn)化的那第一次的投票,其二則是1998年批準(zhǔn)ISO標(biāo)準(zhǔn)的最終表決。毋庸置疑,在這兩件大事當(dāng)中,將STL接納為標(biāo)準(zhǔn)庫一部分的投票是一件最令人歡欣鼓舞的快事。   可以說,沒有任何負(fù)面或者遺憾的事情能與這些具有進(jìn)步意義的投票相提并論。說到"遺憾",要么是一些十分微小的技術(shù)細(xì)節(jié),要么就是那些(暫時(shí))分化了委員會(huì)而使進(jìn)展緩慢的討論。例如,我本來是反對(duì)C風(fēng)格的強(qiáng)制類型轉(zhuǎn)換,也不想引入僅允許整型的靜態(tài)常量成員在類中初始化的機(jī)制。不過,這都是些無關(guān)痛癢的小節(jié)。   我正期待著另外一次關(guān)鍵的表決。明年(2002年)的某個(gè)時(shí)候,委員會(huì)將決定ISO C++的未來方向,這可是頭等大事啊! 2、C++的模板函數(shù)                              TOP 記者:Alexander Stepanov說有一次他曾經(jīng)與你爭論。因?yàn)樗J(rèn)為C++的模板函數(shù)應(yīng)該像Ada通用類一樣顯式實(shí)例化,而你堅(jiān)持認(rèn)為函數(shù)應(yīng)使用重載機(jī)制隱式實(shí)例化。正是由于您的堅(jiān)持,這一技術(shù)后來在STL中發(fā)揮了重要作用。能跟我們具體談?wù)剢幔? Bjarne Stroustrup:對(duì)此,我已經(jīng)沒有多少可補(bǔ)充的了。在模板成為C++的一部分之前,Alex和我曾經(jīng)花了一些時(shí)間去討論語言特性。從我的角度來看,當(dāng)時(shí)的Ada經(jīng)驗(yàn)給他施加了過大的影響,而Alex有著自己的優(yōu)勢(shì)--泛型編程的寶貴實(shí)踐經(jīng)驗(yàn),這恰恰是我的不足。他強(qiáng)化了我對(duì)不犧牲效率和內(nèi)限制表達(dá)能力或犧牲效率的實(shí)現(xiàn)方法。尤其是過去我對(duì)能否把模板參數(shù)限制在繼承層次持懷疑態(tài)度,如今我態(tài)度依然。聯(lián)的偏好。我們都討厭宏而喜歡類型安全。他本來想要更強(qiáng)的模板參數(shù)的靜態(tài)類型檢驗(yàn),我也是這么想的,不過還沒有找到可以不   后來Alex創(chuàng)造性地使用了我所設(shè)計(jì)的模板特性,這就導(dǎo)致了STL的誕生,使得目前人們開始重視泛型及生成編程。跟Alex爭論很有意思!關(guān)于我對(duì)他風(fēng)格的印象,參看http://www.stlport.org/resources/StepanovUSA.html【記者注:這是一篇STL之父Alexander Stepanov的訪談錄,內(nèi)容相當(dāng)激進(jìn),心臟不好的人請(qǐng)做好一切必要準(zhǔn)備^_^。Alex在GP上有極深的造詣,這篇訪談?lì)嵏残圆恍。踔量梢钥吹剿麑?duì)OO的批判!也許徹底拋棄OO很難,但Alex的話確實(shí)富有啟發(fā)性,值得一看】。   我曾經(jīng)試驗(yàn)過多種在不使用語言擴(kuò)展的情況下約束模板參數(shù)的方式。個(gè)人早期的想法在《The Design and Evolution of C++》(《C++語言的設(shè)計(jì)與演化》的中文版和影印版均已由機(jī)械工業(yè)出版社引進(jìn)出版)一書中已有詳述,其后期的變體如今成為了普遍使用的約束和概念檢查的一部分。這些系統(tǒng)在表現(xiàn)力和彈性上比在其他語言中的常見內(nèi)建設(shè)施要強(qiáng)很多。如果要舉例的話,可以參閱我的C++ Style and Technique FAQ(http://www.research.att.com/~bs/bs_faq2.html#constraints)。 3、經(jīng)典流                                  TOP 記者:Jerry Schwarz在Standard C++ IOStream and Locales一書的前言中回顧了IOStream的歷史。我想在從經(jīng)典流到標(biāo)準(zhǔn)IOStream的轉(zhuǎn)變過程間一定有很多趣事,您能給我們講一些呢? Bjarne Stroustrup:我不想替這次轉(zhuǎn)變?cè)俣嗾f些什么了。然而,我想強(qiáng)調(diào)的是原來我所設(shè)計(jì)的流庫簡單且高效,我在兩個(gè)月內(nèi)就完成了設(shè)計(jì)和建構(gòu)。   那次關(guān)鍵的決策把格式與緩沖分離開來,并使用了類型安全的表愛貓撲.愛生活于<<和>>運(yùn)算符)。與AT&T貝爾實(shí)驗(yàn)室的同事Doug McIlroy進(jìn)行了一番探討之后,我最終做出了這些決策。實(shí)驗(yàn)表明,諸如<、>、逗號(hào)和=都不太合適,后來我選擇了使?lt;<和>>。類型安全使得在編譯時(shí)就可以決定一些原本在C風(fēng)格庫中需要在運(yùn)行時(shí)才決定的事情,因而其性能非同一般。在我剛開始使用流以后的不久,Dave Presotto就把我的實(shí)現(xiàn)的緩沖部分替換成一個(gè)更出色的部分,我一直都沒有注意到這一點(diǎn),直到他后來告訴我。   目前的IO流肯定小不了。不過我堅(jiān)信,在許多通常沒有使用IO流全部通用性的情況下,借助于強(qiáng)力的優(yōu)化,我們可以重獲原來的效率。注意,IO流之所以如此復(fù)雜,大部分的原因是為了滿足那些我原來所設(shè)計(jì)的經(jīng)典流沒能考慮到的需求。例如,帶本地化的標(biāo)準(zhǔn)IO流就可以處理經(jīng)典流力不能及的漢字和漢字串。 4、C++、Java與C#                             TOP 記者:有人說Java是純粹面向?qū)ο蟮模鳦#更勝一籌。而還有很多人說它們純粹是面向金錢的。以您之見呢? Bjarne Stroustrup:我喜歡"面向金錢"這個(gè)詞 :-) 還有Andrew Koenig的成語"面向大話"我也喜歡。 不過,C++可不面向這兩個(gè)東東。   對(duì)這點(diǎn)我還想指出,我認(rèn)為純粹性并不是優(yōu)點(diǎn)。C++的強(qiáng)項(xiàng)恰恰在于它支持多種有效的編程風(fēng)格(多種的思維模型,如果你一定要這么說)以及他們之間的相互組合。最優(yōu)雅、最有效也最容易維護(hù)的解決方案常常涉及不止一種的風(fēng)格(編程模型)。如果一定要用吸引人的字眼,可以這么說,C++是一種多思維模型的語言。在軟件開發(fā)的龐大領(lǐng)域之中,需求千變?nèi)f化,需要至少一種支持多種編程風(fēng)格的通用語言,而且很可能需要一種以上。再說,世界之大,總能容得下好幾種編程語言吧?那種認(rèn)為一種語言對(duì)所有應(yīng)用和每個(gè)程序員都是最好的看法,本質(zhì)上就是荒謬的。【注:paradigm的中文翻譯似乎沒有約定。有人偏好"典范"或者"范式",記者則喜歡侯捷先生使用的"思維模式"或者"思維模型"。總之,paradigm的大概意思是an example or pattern,大家理解就行。】   Java和C#的主要力量源自于其所有者的支持。這意味著低價(jià)(為取得市場(chǎng)份額免費(fèi)發(fā)放實(shí)現(xiàn)和庫),集約和不擇手段的營銷(欺騙宣傳),以及由于缺乏替代廠商而產(chǎn)生的表面上的標(biāo)準(zhǔn)。當(dāng)然,就Java的情形而言,當(dāng)其他廠商和修改版本出現(xiàn)后,版本、兼容性和移植問題也會(huì)像其他語言一樣,重新冒出來。   不被語言所有者操縱的開放進(jìn)程所產(chǎn)生的正式標(biāo)準(zhǔn)是最好的。如果用戶不想看到這種語言為了其發(fā)起者或所謂"一般用戶"的利益,而不顧經(jīng)濟(jì)上無足輕重的"少數(shù)派"反對(duì)而來回折騰,像ISO這樣正式的標(biāo)準(zhǔn)進(jìn)程,則是他們唯一的希望了。   C++本可以更簡單或更易用些(更純粹,如果你認(rèn)為這是必要的),不過這樣就無法支持那些有著"不同尋常"的需求的用戶了。我個(gè)人很關(guān)注他們,他們要構(gòu)建可靠性、運(yùn)行效率以及可維護(hù)性遠(yuǎn)高于行業(yè)平均水準(zhǔn)的系統(tǒng)。我的猜測(cè)是,在10年內(nèi)大多數(shù)的程序員都將面臨"不同尋常"的技術(shù)要求,他們可以從C++的多思維模型結(jié)構(gòu)中受益,而Java和C#之類"簡化"語言則力有不逮了。   我認(rèn)為模板和泛型編程是現(xiàn)代C++的核心,是無損效率、類型安全代碼的關(guān)鍵。然而它們并不適合經(jīng)典的面向?qū)ο缶幊趟季S模型。 5、Bjarne看C++的機(jī)制                           TOP 記者:Ian Joyner在C++: A Critique of C++ and Programming and Language Trends of the 1990s一書中比較了C++和Java并批評(píng)了C++的許多機(jī)制。你贊成他的觀點(diǎn)嗎?尤其是多數(shù)新語言都有垃圾收集機(jī)制,C++中會(huì)加入嗎? Bjarne Stroustrup:Ian Joyner對(duì)C++的觀點(diǎn),我不敢茍同。撇開這點(diǎn),垃圾收集可能算是有價(jià)值的技術(shù),不過并不是萬能丹,它也會(huì)帶來問題。對(duì)C++而言,自動(dòng)垃圾收集是一個(gè)有效的實(shí)施技術(shù),有許多為C++設(shè)計(jì)的不錯(cuò)的垃圾收集器(商業(yè)支持和免費(fèi)的都有),而且也被廣泛地使用(參看我的C++頁面上的鏈接)。然而C++中垃圾收集機(jī)制應(yīng)該是可選的,這樣在不適合垃圾收集的地方,如嚴(yán)格的實(shí)時(shí)應(yīng)用程序,可以免受其累。關(guān)于垃圾收集,我的《The C++ Programming Language》(《C++程序設(shè)計(jì)語言》)一書和我的主頁上都用評(píng)注,可以參看。   我期望在下一個(gè)C++標(biāo)準(zhǔn)中能體現(xiàn)出我的意見,并做出明確的聲明。就此而論,C++可以優(yōu)雅地處理一般的資源,而不僅僅局限于內(nèi)存。尤其是"resource acquisition is initialization(資源獲得就是初始化)"技術(shù)(參看D&E、TC++PL和我的技術(shù)FAQ)支持對(duì)任意資源進(jìn)行簡單并且符合異常安全(exception-safe)要求的管理。沒有析構(gòu)函數(shù)的Java不可能支持這一技術(shù)。 6、STL與C++的GUI                               TOP 記者:STL是一個(gè)超凡脫俗的跨平臺(tái)架構(gòu)。有沒有考慮在其他方面,比如GUI(圖形用戶接口),設(shè)計(jì)這樣的標(biāo)準(zhǔn)架構(gòu)? Bjarne Stroustrup:很自然地,很多人會(huì)想如何在其他領(lǐng)域借鑒STL的成功。比如在數(shù)值運(yùn)算和圖論方面都有了許多有趣的工作。相關(guān)鏈接可以參看我的網(wǎng)頁。   標(biāo)準(zhǔn)GUI價(jià)值極大,不過我懷疑其政治上的可行性。太多有錢的大公司在維持其專有GUI上有著重大的商業(yè)利益,而且要求用戶放棄現(xiàn)在所使用的GUI庫也殊非易事。【注:有朋友可能奇怪,一個(gè)GUI庫怎么扯出"政治(politically)"來了?西方人口中的"政治",在中文里并沒有真正對(duì)應(yīng)的詞語。這里的意思是of concerning public affairs,跟中文里的"政治"無關(guān)。下一段就是對(duì)這個(gè)所謂"政治上的可行性"的詳細(xì)解釋。】   這里我所說的可行性是就商業(yè)和技術(shù)而言。現(xiàn)在有好幾種廣泛使用的GUI,即使標(biāo)準(zhǔn)委員會(huì)提供一個(gè)替代方案,它們也不會(huì)就此退出。其所有者和用戶──常常有充分理由──會(huì)只是忽略新標(biāo)準(zhǔn)。更糟的情況:某些公司或群體會(huì)積極反對(duì)這樣的標(biāo)準(zhǔn),因?yàn)樗麄冋J(rèn)為標(biāo)準(zhǔn)不如他們已有的庫,或者因?yàn)椴町愄蠖沟棉D(zhuǎn)換到新GUI不可行。必須理解,如果標(biāo)準(zhǔn)不能充分服務(wù)于其目標(biāo)用戶,用戶會(huì)視而不見。許多ISO標(biāo)準(zhǔn)因?yàn)闊o人理會(huì)而變得無關(guān)緊要。C++標(biāo)準(zhǔn)可不想成為其中一員──把現(xiàn)有實(shí)施拉近到一起,標(biāo)準(zhǔn)就功德無量了──我們不希望將來ISO C++標(biāo)準(zhǔn)被人忽略。   注意STL成功的一個(gè)主要原因在于它是一個(gè)技術(shù)突破。它可不單是"又一個(gè)容器庫",因此它不需要和許多現(xiàn)有的容器庫(其中幾個(gè)品質(zhì)卓著)直接競(jìng)爭。我猜想C++要有一個(gè)標(biāo)準(zhǔn)GUI,我們需要技術(shù)突破,加上好運(yùn)多多。   不過我還是懷疑委員會(huì)有由必需的專業(yè)技術(shù)和資源來構(gòu)建一個(gè)可以成為真實(shí)世界中真正標(biāo)準(zhǔn)的GUI。   我對(duì)標(biāo)準(zhǔn)庫的想法傾向于修補(bǔ)現(xiàn)有庫的遺漏(如hash_map和正則表達(dá)式),以及通過更廣泛的運(yùn)行時(shí)間類型信息和并發(fā)庫來支持分布運(yùn)算(可選)。   有時(shí)大家忘了,庫不是非得成為標(biāo)準(zhǔn)的一部分才有用。有成千上萬有用的C++庫。例如,參見C++庫FAQ(我的C++網(wǎng)頁有鏈接)。 7、在C++中相得益彰的GP和OO                          TOP 記者:泛型編程是C++特殊的編程思維模型。你是怎樣看GP(泛型編程)和OO(面向?qū)ο螅┑模繉鞢++會(huì)提供更強(qiáng)大的機(jī)制來支持GP嗎?有沒有考慮引入其他思維模型,比如面向模式? Bjarne Stroustrup:我認(rèn)為,在C++中面向?qū)ο蠛头盒途幊滔嗟靡嬲茫宜鶎懙脑S多最優(yōu)美的代碼段都是兩者的結(jié)合。也就是說,那些認(rèn)為OOP和GP水火不容的觀點(diǎn)是錯(cuò)誤的。它們是應(yīng)該組合使用的技巧,語言應(yīng)該支持這樣的組合──C++正是如此。   我覺得C++相當(dāng)好地支持了泛型編程,所以只需要細(xì)微的增加。模板化的typedef是個(gè)顯而易見的例子。我們要謹(jǐn)慎地?cái)U(kuò)展語言,僅當(dāng)擴(kuò)展對(duì)要表述的內(nèi)容提供重大的便利時(shí),我們才這樣做。比如我不支持對(duì)模板參數(shù)約束檢查提供直接語言支持的想法。通過約束/概念檢查模板,我們已經(jīng)可以比用為C++和相似的語言提議的各種各樣的語言擴(kuò)展做得更多。   談起"思維模型"和"新的思維模型"讓我很為難,只有很少的想法佩得上這樣美妙的字眼。我也擔(dān)心對(duì)新觀念過于直接的支持,可能會(huì)限制和跟不上我們的觀念和技術(shù)的進(jìn)一步演化。理想的情況是,語言設(shè)施應(yīng)有效地支持非常通用的觀念,這樣大家可以使用這些設(shè)施用各種風(fēng)格來編寫代碼。至于C++能優(yōu)雅地支持哪些模式概念,能和不能通過與已有風(fēng)格的組合,還有待觀察。我認(rèn)為,只需要很少新的特定語言概念來支持模式。 8、今后C++將支持分布開發(fā)                           TOP 記者:今后C++會(huì)支持分布開發(fā)嗎?對(duì)RTTI和多線程的進(jìn)一步支持呢? Bjarne Stroustrup:對(duì)。如果事情進(jìn)展能如我所愿,C++標(biāo)準(zhǔn)的下一次修訂會(huì)通過提供擴(kuò)展的類型信息和并發(fā)支持庫來支持分布計(jì)算。我覺得這不需要特別的語言擴(kuò)展。不過在存在并發(fā)的情況下現(xiàn)有語言設(shè)施實(shí)施需要做出額外的保證。   我沒有太多可說,因?yàn)閲@下一標(biāo)準(zhǔn)應(yīng)該和不該包含哪些的討論才剛剛開始。我的看法是C++需要一個(gè)無縫地支持線程(在同一地址空間內(nèi))、進(jìn)程(在不同地址空間)及遠(yuǎn)端進(jìn)程(可能有重大的通訊延時(shí)而且網(wǎng)絡(luò)可能暫時(shí)分離)的標(biāo)準(zhǔn)庫。支持這點(diǎn)會(huì)需要超越簡單的Unix或Windows線程的設(shè)施。但是我并不認(rèn)為這需要設(shè)計(jì)新的語言元件。 9、愛好廣泛的Bjarne                             TOP 記者:據(jù)說大人物年輕時(shí)就會(huì)表現(xiàn)出與常人的差異,請(qǐng)問您在大學(xué)就讀時(shí)表現(xiàn)過什么與眾不同的地方? Bjarne Stroustrup:我并不清楚是否有人覺得我真的與眾不同。我猜想自己可能比多數(shù)人天真和顯得理想主義那么一點(diǎn)點(diǎn)。此外,比起大多數(shù)人,我花在解決現(xiàn)實(shí)問題的時(shí)間會(huì)多一點(diǎn)吧──我要掙錢以免債臺(tái)高筑。我可不能如此,因?yàn)榧依锊⒉桓挥校乙恢北桓嬲]要勤奮工作。另一方面,我喜歡學(xué)習(xí)自己感興趣的許多東西(包括哲學(xué)和歷史),而不僅僅是那些直接有助于我取得學(xué)位和提高成績的東西。 10、Bjarne的中國觀                              TOP 記者:喜歡安徒生的童話嗎?在《夜鶯》里他寫到了中國。您對(duì)中國、中華文化和中國人的印象如何?以前去過中國嗎?2008年來中國看奧運(yùn)會(huì)可能是個(gè)不錯(cuò)的主意。 Bjarne Stroustrup:作為一名丹麥人,我當(dāng)然知道安徒生童話。恰好我也很喜歡這些故事。在《夜鶯》里描繪的中國純屬虛構(gòu),與當(dāng)時(shí)的中國可能有也可能沒有任何聯(lián)系。安徒生創(chuàng)造的那個(gè)"中國",是用來泛指許多個(gè)國家及其統(tǒng)治者的。   中國是個(gè)巨大的概念Bjarne Stroustrup,很難能對(duì)之有一個(gè)總體的印象。我所遇到的中國人大都是程序員或者工程師,因此我對(duì)中國人的看法可能會(huì)過于狹隘。縱使是類似于我的本國丹麥這樣的小國和文化體也是十分復(fù)雜的,不是單個(gè)人能夠完全理解的──丹麥只有500萬人口。我對(duì)歷史很感興趣,因此也看了數(shù)本有關(guān)中國歷史和文化題材的書籍。不過這可能意味著我頭腦里的中國會(huì)比較古老,與現(xiàn)在的中國并不能相提并論。我在臺(tái)灣進(jìn)行過一個(gè)星期的講學(xué),那里挺不錯(cuò)的,不過目前我尚沒有機(jī)會(huì)訪問大陸。   關(guān)于中國歷史和文化的書我看過不少。中國歷史悠久、幅員遼闊,因此書的內(nèi)容就集中于早期的事件、人和傳統(tǒng),幾乎沒有描繪近10年或者20年的中國。盡管從新聞和中國朋友那里得知中國已經(jīng)發(fā)生了巨大的變化,但是我對(duì)今日的中國還是相當(dāng)無知(但是可能比大多數(shù)人對(duì)遠(yuǎn)方國度的那種無知要強(qiáng)一些),比如我對(duì)當(dāng)今中國的文學(xué)和音樂一無所知。因而一旦想起中國,我就可能想起很多嚴(yán)重過時(shí)的東西──盡管自己極力去避免此類的錯(cuò)誤。這里順便說一句,我對(duì)主要從書本上獲知的世界其他地區(qū)也都有類似的問題。   我對(duì)大型人群和有組織的群體事件不太熱心,因此我會(huì)遠(yuǎn)離2008年奧運(yùn)會(huì),就象我遠(yuǎn)離那些原本可以參與的各屆奧運(yùn)會(huì)一樣。我希望能找個(gè)除此之外的機(jī)會(huì)訪問中國。 Bjarne著作參考                              TOP 《C++語言的設(shè)計(jì)和演化》 《C++語言的設(shè)計(jì)和演化(英文版)》 《C++程序設(shè)計(jì)語言(特別版)》即將出版,試讀、預(yù)訂 《C++ 程序設(shè)計(jì)語言(特別版)(英文影印版)》 --- 轉(zhuǎn)載-----