舊談:首個 C++ 編譯器誕生 30 週年了,來聽聽 C++ 之父暢談 C++

喜歡的可以收藏轉發加關注

C++ 之父 Bjarne Stroustrup 在 cfront 誕生 30 週年的訪談。

舊談:首個 C++ 編譯器誕生 30 週年了,來聽聽 C++ 之父暢談 C++

整整30年前,CFront 1.0 連同第一版的《C++編程語言》發佈。這兩個東西在同一天發佈,有什麼重要意義嗎?

其實倒沒有刻意的重要意義,但我覺得同時發佈是個不錯的主意。因為 AT&T(美國電話電報公司,也是貝爾實驗室當時的母公司)和 Addison-Wesley(著名科技書籍出版公司)當時都問我選哪天合適,我就跟他們說 10 月 14 日合適。因為那天我要在 ACM(美國計算機學會,也是計算機最高獎圖靈獎的頒發機構)大會上作一個演講,我想在演講中宣佈這個事情。

為了《C++編程語言》這本書,你已經當了兩回作家了,以後可能還有更多的寫作工作要做。那寫書這件事情對你設計編程語言確有幫助嗎?

我認為這本書是非常必要的。當時的C++社區規模還很小,但是發展卻非常迅速,社區需要這本書。其實寫書一開始都不是我自己的主意。Al Aho,我在貝爾實驗室的鄰居,是他指出社區的這種需求的。我那時完全低估了寫《C++編程語言》這本書所需要的工作量。寫書寫得清楚明白是很困難的。我真的是做了很多努力,以便清楚地向大家介紹C++。C++本身也做了改進,從邏輯性和功能性上做了增強,從而使我的闡述能夠變得容易一些。另外,給這本書寫例程也是一個很需要技術和效率的工作。

你還記得在1985年10月14日星期一那天的感受嗎?那天你發佈了《A C++ Tutorial》

其實我不記得了。實際上,我對在八十年代發生的大多數事情都沒什麼印象了。因為我那個時候實在是太忙了。從1979年到1991年間,C++程序員的數量每7.5個月就翻一倍。這種增長的速度造成了很大的工作量。截至到今天,C++用戶的數量大約有440萬,詳情看《全球有多少 C/C++ 程序員?》。這對我來說可是個大日子。但是我現在唯一有印象的事情就是我拿到第一版的《A C++ Tutorial》的那一刻。

“我確實做了大量的工作,以便讓大家瞭解C++”

舊談:首個 C++ 編譯器誕生 30 週年了,來聽聽 C++ 之父暢談 C++

在那個年代,你對C++的願景是什麼?你當時怎麼看C++的前途?

很顯然,當時我根本沒料到C++會發展到如此數量,以及C++爆炸性的增長。我當時的注意力都放在了諸如對語言的改進,對類庫的豐富,對編譯器的改進,以及對語言進行推廣教學上。

“今天我們熟知的很多C++特性都與那個最初的時代淵源頗深”

“人們可能都不太記得,在一開始C++是不支持參數化類型的”

另一方面,我們今天熟知的大部分C++的特性都與那個最初的年代淵源頗深。類,函數聲明(函數原型),構造函數,以及析構函數都是一開始就引入的語言特徵。幾年以後,我又引入了內聯函數和對操作符的重載。當時對初始化和賦值的特性已經區分開了。通用的操作符重載則是幾年以後引入的(大約在1983年左右),虛函數機制也差不多是那個時候引入的。人們通常不太會記得,一開始C++是沒有參數化的類型的(也就是template——譯者注)。在CFront的早期版本里,我是用一個向量宏,然後把元素的類型作為一個宏參數傳入,以此來實現泛型的邏輯,這些實現都包含在<generic.h>頭文件裡。隨後幾年,我覺得用宏的方式來實現泛型已經足夠了。現在看來我當時的這種觀點真是非常錯誤的,不過我認為(非向量之外的)其他數據類型還是很需要參數化類型的,我的這個判斷還是正確的。所以後來模板誕生了(1988年)。/<generic.h>

C++的基本設計思想,是要給這門語言提供一種可擴展機制,以便用戶可以定義強大、優雅而且高效的抽象模型。這種設計思想與面向某種特定應用的語言截然不同。直至今日,C++仍然支持C語言的機器模型,使得用戶能夠在移動設備上高效合理地編程。我們也依然堅持採用循序漸進的方式對C++進行改進,確保C++對抽象的有效支持。

想發明一種成功的編程語言的人很多,但大多數人都失敗了。周圍越來越多的人都在用你創造的編程語言,對此你怎麼看?從你的角度,你認為這是你成功的主要原因麼?

對此我的感覺是既驕傲又有點惶恐。能夠創造出一個經得住考驗的產品當然是很棒的,但是同樣附帶的責任也非常巨大——尤其是在語言進化這個方面。如果我們能把優秀的,有用的特性加入到語言中,那麼我們就為世界做了大好事,可是如果我們搞砸了,那帶來的危害同樣也會很大。目前,我認為C++的進化是在有條不紊地進行。並不是說之前所有引入的特性都是成功的,但是我們引入的有用的特性要遠遠多於那些徹底失敗的特性。每一年,C++都在朝著更好的方向發展。如今的C++已經比1985年推出的那個1.0版本優秀了無數倍。今天,我們能夠寫出比以前更優雅,更高效的代碼(即使是你把硬件性能的差異考慮進來,也是如此)。

“C++的演進採用了小心謹慎,循序漸進的態度,而且與現實問題息息相關。”

“C++在不停地成長。它不是一個”象牙塔項目”

提到成功的原因?原因肯定是複雜的。想要獲得成功,一個語言需要滿足用戶的任何需求,而且還要保證在各方面都不能出錯。所以在一兩個點上做到世界第一,那是完全不夠的。首先,C++在那些對性能和硬件資源相關的編程方面(這個領域稱為”系統編程“)獨佔鰲頭,尤其是對那些複雜度需可控的系統更是沒有對手;其次,C++的演進採用了小心謹慎,循序漸進的態度,而且與現實問題息息相關。C++在不停地成長。它不是一個”象牙塔項目“,(目標宏大,結構複雜但脫離現實——譯者注)。最後,我認為非常重要的一點是,C++不會去迎合那些花裡胡哨的東西:我採用了相對謙虛謹慎的態度來發展這門語言,並且一直將這種風格保持了下來。

你花費了幾乎畢生的精力在C++上,時至今日還非常活躍。你對這項工作如此投入的主要動因是什麼?你現在是不是已經開始設計新的編程語言了呢?

“我有好幾次想脫離C++的開發,但是最後總是又被拖回來繼續幹。”

“如果要從頭髮明一種語言,太容易犯錯了。一個成功的大系統,往往都是由一個個小系統逐步進化而來的。”

我有好幾次想脫離C++的開發,但是最後總是又被拖回來繼續幹。我感覺從事C++方面的工作對我來說是貢獻世界最好的機會了吧。畢竟,C++是我從事研究和開發的主要工具。那些經驗和教訓——來自於我本人或C++社區的無數參與者——會及時反饋到語言本身,以及相關類庫上,這樣就能讓數以百萬計的人得益。

我當然有想過要設計一門更好的新語言,但對於一門語言來說,要實現從思想到工具的轉變,這個過程太漫長了。況且C++在自己的地盤上幾乎沒有對手,所以我還是把我的興趣放在如何把C++打造成一套優秀工具上吧。另外還有一點,大部分新發明的語言都失敗了。如果要從頭髮明一種語言,太容易犯錯了。一個成功的大系統,往往都是由一個個小系統逐步進化而來的。

鑑於C++漫長的進化歷程以及複雜度,要把一個新特性整合到其中是非常困難的,但是一旦某種特性被採納了,那麼這個特性將會被數以百萬計的用戶使用。這樣規模形成的影響力,比創造一種新語言然後給幾百個早期用戶使用要大得多了。

30年了,哪些東西變了?哪些東西還維持原樣呢?

機器模型沒變,對(編程語言)抽象能力的追求也沒有變,而且這兩者像以往一樣相互關聯。這也是我一直強調使用靜態(編譯時)類型系統的原因。

對異常機制和模板這兩種特性的支持大大改進了這門語言,使得人們可以書寫優雅而高效的代碼。我在1986年為《IEEE軟件》期刊撰寫的論文中,第一次提出了這兩種語言特性的概念。異常機制,連同構造函數和析構函數,在資源管理方面提供了安全保障(RAII)。模板則為 Alex Stepanov 實現STL,以及日後泛型編程的繁榮奠定了基礎。在這一年裡,我們實現了對概念的語言級支持,從而完成了模板機制。

“1980年後期,人們對類的層次結構的用法非常狂熱。”

“我還做過報告,報告的題目就叫“C++不僅是一門面向對象編程語言”。”

“稍後,人們又對使用模板非常狂熱。”

舊談:首個 C++ 編譯器誕生 30 週年了,來聽聽 C++ 之父暢談 C++

1980年後期,人們對類的層次結構的用法非常狂熱。那時我倒是不願意跟風,我更願意把不同的編程風格混合,從而形成一個相互關聯的整體。我寫的書的第一版(故意)沒有使用“面向對象編程”這個詞。我還做過報告,報告的題目就叫“C++不僅是一門面向對象編程語言”。稍後,人們又對使用模板進行泛型編程,以及模板元編程非常狂熱,認為語言設計的基本元素越少越好。而我則還是在尋找各種方法,來闡釋我的理解,我認為優雅的編程語言是基於語言特性和類庫機制的綜合體。

最近,我認為還有一件事情會在未來的幾年內變得非常重要,那就是要努力制定出一套工具和類庫編碼指導書。這個東西會幫助C++社區更有效地應用新的語言機制。在這方面的一個新例子,就是我們現在有工具可以用來消除“野指針”,從而為開創一個完全類型安全,資源安全的新局面提供了可能。尤其是,我們在不使用“垃圾回收機制“(因為我們根本就不產生垃圾)的前提下避免了資源洩露,這樣一來我們就不用為了增強安全性而忍受性能損失之苦了。當然,我們不會限制C++的用途。

我希望這能夠幫助C++解決長期以來一直被人們詬病的問題:糟糕的教學和糟糕的理解,即使對於C++從業者來說也是如此。業界存在一種趨勢,總是把C++描述成各種怪異的東西。比如,C++經常在教學中被稱為是”一種增加了語言特性的 C 語言“,或者被稱為”和 Java 差不多,但是不如 Java 安全,還缺少了一些高級語言特性。”這些說法對現實中C++的應用都造成了非常負面的印象。對此,我希望我最新版的《C++之旅》能有所幫助。我在這本書對C++語言本身,以及所有標準庫都進行了高層次的描述,但是書的篇幅比經典的 K&R 的C語言教程還要少。本書面向有經驗的程序員,對於完全的新手來說則不合適。

幾天以後,C++委員會將在夏威夷集結,討論下一個C++的主要版本事宜。你認為C++20將會是什麼樣子呢?

C++20將會頒佈。我自己很難預測C++20會是什麼樣子。但是我(還是)很樂觀的。C++11相對於C++98來說,是一個重大的進步,C++17也是一個非常大的發展,我也希望C++20相對與C++11以及C++17來說,也能達成同樣重大的進步吧。

學習C/C++的夥伴可以轉發+私信回覆小編“學習”領取全套免費C/C++學習資料

舊談:首個 C++ 編譯器誕生 30 週年了,來聽聽 C++ 之父暢談 C++


分享到:


相關文章: