Bjarne Stroustrup:the Design And Evolution Of C++@1994

核心論點:C++ 的設計與演進

根據提供的資料,C++ 的設計與演進是作者 Bjarne Stroustrup 基於自身在 Simula 和 C 語言上的經驗,旨在建立一個能解決系統程式設計挑戰(特別是組織和抽象化問題),同時保留 C 語言的效率、彈性、可移植性及與硬體的緊密聯繫的程式語言。其核心理念強調實用性、效率和為程式設計師提供強大的工具,而非追求學術上的完美或強迫採用單一程式設計風格。

以下是從資料中提取並闡述的主要論點:

  1. 雙重起源的影響 (Simula 和 C 語言):

    • Simula 的啟發: 作者在 Simula 中體會到類別 (Class) 和繼承(前綴類別)在組織大型程式、提高程式碼可讀性方面的巨大優勢,以及其類型系統在編譯時捕捉設計缺陷的能力。Simula 的物件導向概念是 C++ 類別和繼承的直接來源。然而,Simula 實作在執行時效率(特別是垃圾收集)和靈活性(無法擁有區域變數或全域變數、無法直接操作硬體)方面的不足,促使作者尋找一個效率更高的基礎。
    • C 語言的基礎: C 語言因其效率、可移植性、低階系統程式設計能力和與其他語言良好的互通性而被選作 C++ 的基礎。作者旨在補償 C 語言在程式組織和類型安全方面的不足,同時不犧牲其核心優勢。這也解釋了 C++ 繼承了 C 語言的一些特性(如指標、位元操作、某些語法不規則),即使這些特性從純設計角度看並非理想。
  2. 效率與實用性為核心原則:

    • 零開銷原則 (Zero-Overhead Principle): C++ 的設計哲學是「不使用的功能不產生開銷」。只有在程式設計師明確要求特定功能時,才會產生相應的執行時或空間開銷。這點對於確保 C++ 在系統程式設計、資源受限環境及追求效能的應用中具有競爭力至關重要。例如,虛擬函式、多重繼承、例外處理、模板等功能的設計都考慮到在不使用它們時,對程式的影響最小化。
    • 實用性優先: C++ 必須是「現在就能用」的實用工具,能夠在現有硬體、作業系統和工具鏈上高效運行。這影響了許多設計決策,例如採用傳統的 C/Fortran 連結器模型,以及避免依賴先進但普及度低的運行時系統(如垃圾收集)。
    • 避免學術上的完美追求: 語言設計不是純粹的理論活動,而是工程、社會學和哲學的結合。C++ 的演進由實際問題和使用者經驗驅動,避免為了追求抽象的完美而引入可能導致不實用或不相容的變動。
  3. 對程式組織和抽象化的支援:

    • 類別與繼承: 這是 C++ 核心的抽象機制,允許程式設計師將應用領域的概念直接映射到語言結構中,提供資料隱藏、程式碼重用和多型性。虛擬函式是實現執行時多型性的關鍵。
    • 模板 (Templates): 支援參數化類型(泛型編程),允許編寫獨立於特定類型、同時保持靜態類型安全和高效能的程式碼,特別適用於容器和演算法的設計。這是避免宏的優雅且類型安全的替代方案。
    • 命名空間 (Namespaces): 解決全域名稱衝突問題,特別是在整合來自不同函式庫的程式碼時,提供更好的程式碼組織和管理名稱可見性。
    • 例外處理 (Exception Handling): 提供標準化的錯誤處理機制,確保資源的正確管理(透過析構函式),並使程式碼在面對錯誤時更具韌性。C++ 採納終止語義,認為這更適合系統程式設計。
  4. 強調靜態類型檢查和安全:

    • C++ 大部分檢查在編譯時進行(靜態類型檢查),以提早捕捉錯誤。雖然為了與 C 相容,C++ 保留了一些可能導致執行時錯誤的低階操作(如指標轉換),但設計目標是使這些操作盡量明顯,並提供更安全、更方便的替代方案(例如,new/delete 運算子、static_cast、dynamic_cast)。
    • 類型安全被視為實用工具,而非絕對目標。理解程式碼的可靠性取決於整個系統的所有部分,而非單一語言特性。
  5. 支援多種程式設計風格:

    • C++ 刻意設計為支援從傳統程序式到資料抽象化再到物件導向等多種程式設計風格。語言設計者避免強迫程式設計師採用某種特定風格,而是提供工具和機制支援多樣化的有效實踐。這體現了對個體程式設計師工作方式的尊重。
  6. 演進與相容性的平衡:

    • C++ 是一個不斷演進的語言,其發展受到使用者需求和經驗的強烈影響。每一次變動都必須考慮其對既有程式碼的影響,並盡量提供平滑的過渡路徑。與 C 語言的相容性雖然帶來一些設計上的妥協,但也被視為 C++ 成功被廣泛採用的關鍵因素。

總結來說,C++ 是一個實用主義主導的設計,其核心是結合 Simula 的組織能力與 C 的效率,透過靜態類型檢查和靈活的抽象機制,為系統程式設計師提供強大的工具集,同時在不斷演進的過程中平衡效率、相容性、複雜性和多樣化的程式設計需求。