開發者應該開始學習C++嗎?
英文原文:Should Developers Start Learning C++?
隨著C++ 11和C++ CX 的引入,很多人重新燃起了對這門語言的興趣。不少開發者,尤其是 Windows 開發者,都想知道是否應該放棄 C# 和 Java,轉而支持C++。John Sonmez 認為這并不需要。
在“為什么 C++ 并沒有‘王者歸來’(Why C++ Is Not ‘Back’)”一文中,John Sonmez 認為只有如下三個原因才會使用C++:
- 需要榨干軟件每一寸可能的性能,并且想用支持面向對象抽象的語言來實現。
- 編寫直接面對硬件的代碼。(例如,編寫底層驅動。)
- 內存控制與定時極為重要,因而系統的行為必須是完全確定的,還必須能夠手動管理內存。(想一下控制機器移動部件的嵌入式實時操作系統。) </ul>
- 服務,依賴于運行時會更為困難。
- 測試,對比一下全部或者大部分采用靜態鏈接的應用程序與在最終用戶機器上往往是首次執行時才編譯或即時編譯(JIT)的應用程序,后者無法完整地測試。 </ul>
Herb Sutter 高度稱贊了這篇文章,認為文中的“觀點有些深度,沒有夸張”。關于 C++ 的應用場景,他又做了一些補充:
John Sonmez 反對學習C++,過于復雜是原因之一。即使C++ 11 讓開發容易了一些,但是程序員仍然不得不學習各種老式的 C++ 編碼方法。“你會碰到 20 年前的 C++ 代碼,看起來就像是完全不同的語言。”為了加強其觀點,他向準備應聘 C++ 職位的開發者提出了 36 個問題。下面列出幾條:
1. 在 C++ 中,基本數據類型有多少種初始化方式?你能都說出來嗎?
12. 什么是復制構造函數,何時會用到?尤其是與賦值操作符相比,你能區分嗎?
16. 在 C++ 中,何時適合通過引用來返回值,何時不適合?
33. 為什么絕對不應該在析構函數中拋出異常?
</blockquote>反對 C++ 的另一個理由是“編程語言真正需要的是簡化并提高抽象層次,而不是反其道而行之”。他繼續道,
編寫底層代碼的需求總是存在的,但我們今天編寫的大部分都是較高層次的代碼。
很多年前,當我終于無法再堅持認為我用 C++ 開發應用的速度比 C# 快時,我跳下了 C++ 這條船。
我堅持良久,試圖讓自己相信我在 C++ 上的所有投入并沒有白費,但是事實證明, C#帶來的簡化是如此之大,以至于與此相比,C++所提供的額外的力量并不值得這些額外的付出。
</blockquote>在文章結尾,John Sonmez 說到,學習 C++ 對于理解計算機的一般工作原理仍然是有用的,“但是我認為 C++ 不會東山再起,這是好事”。
關于這一點,Alo 補充到:
我是從 C++ 開始的,而且我職業生涯的前四年都花在了 C++ 上。這種經驗對我非常有價值,正如您的文章中所指出的那樣,因為一旦把 C++ 學到了足夠的水平,就可以很快地撿起其他任何語言;此外,還能從一個更低的層次上更深刻地理解軟件工作原理——如果從其他層次更高的語言開始學習編程,獲得這種知識的難度就大多了。正因如此,我一直不贊成讓程序員從 Java 開始學起。
</blockquote>Richard Dunks 反駁到:
我認為,在第一學期的程序設計導論課程和數據結構的教學中,C++是沒什么幫助的,因為光實現就要耗費很多時間,反而讓同學們忽略了他們要復現的結構。我很高興自己能夠精通C++,但我認為這并不值得,而且 C++ 絕對不是一門萬能的教學語言。
</blockquote>Stephen Cleary 有一條評論談到了可重用性:
我原來是 C++ 開發者,幾年之前,市場的壓力讓我成了一名 C# 開發者。C#的確更有生產率,但是完全不可能實現 C++ 模板那種級別的代碼復用。
經典的例子就是容器、迭代器和算法這三駕馬車。在 C++ 中,能夠創建一個用于任何容器的算法,而且可以在編譯時對算法加以調整以便必要的情況下利用隨機訪問能力。你可以用 C# 試試。這還是尚未談到“新C++”的情況;1998 年的 C++ 對代碼復用的支持就比現在的 C# 好了。
</blockquote>關于性能,Herb Sutter 給出了如下建議:
在任何語言中,如果非常關注性能,都會大量使用數組(未必“總是”使用,只是“大量”用到)。不過這在有些語言中很容易,可以很好地控制一般內存布局,特別是控制數組;而在其他語言或環境中就困難一些(有可能讓你使用,但更為困難),如果這些語言或運行時特別偏愛通過指針構造的數據結構,你就不得不“放棄”或者“盡量避開”。
</blockquote>除了在 Herb Sutter 和 John Sonmez 的相關博客上的大量高質量評論,Reddit 的 Programming 和 Coding 子群組也有很多可以學習的東西。
來自: InfoQ本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!