Bjarne Stroustrup:the C++ Programming Language@2000 (特别版)
好的,這是一份根據您提供的《The C++ Programming Language, Third Edition》部分內容,提取並解釋主要論點的 API 回覆:
C++ 程式設計語言主要論點闡述 (第三版序言與第一章)
根據 Bjarne Stroustrup 在《The C++ Programming Language, Third Edition》的序言及第一章〈Notes to the Reader〉所述,C++ 程式設計語言的核心設計理念與目標可歸納為以下幾個主要論點:
論點一:C++ 是 C 語言的直接演進,保留了 C 的效率與低階存取能力,同時引入了強大的抽象化機制。
- 保留 C 的基礎與效率: 作者強調,C++ 在很大程度上是 C 語言的超集,並且有意地保留了 C 語言接近硬體的特性。這包括對位元、位元組、字詞、位址等硬體基本單位的直接且有效率的操作。選擇 C 作為基礎,是因為其通用性、簡潔性、低階能力、可移植性,以及與 UNIX 編程環境的契合。這種設計確保了 C++ 程式在許多需要嚴格時間和空間限制的系統層級應用中,依然能夠實現與手寫 C 程式相媲美的效能,例如裝置驅動程式或即時系統的核心部分。對效能的承諾是 C++ 設計中的一個重要原則,即使在新增語言特性時,也避免引入會無條件產生執行時或記憶體開銷的功能。
- 引入型別與結構: 與 C 相比,C++ 的主要區別在於更加強調型別和結構。C++ 通過引入強靜態型別檢查、使用者定義型別(類別)和模組化(命名空間、檔案)等特性,使得程式更具表達力。這種對型別系統的關注,使得編譯器能夠更正確地處理複雜的表達式,減少程式設計師處理低階細節的需求。同時,編譯器也能更早地(在編譯時期)偵測到錯誤,避免錯誤延遲到測試甚至部署後才發現,從而提高了程式碼的可靠性和可維護性。雖然 C++ 引入了更精細的型別結構,但這並未導致程式碼的源碼長度增加,反而常因使用標準函式庫提供的抽象而顯得更為簡潔。
- 避免移除既有特性: 語言的命名 “C++” (來自 C 的遞增運算符 ++) 象徵著其演進的性質。作者說明了不將語言命名為 “D” 的原因之一,就是因為 C++ 選擇擴展 C,而不是透過移除特性來解決 C 的問題。保留與 C 的高度相容性(在可能的情況下,相同結構在兩語言中具有相同意義),是為了讓現有的 C 程式碼更容易過渡到 C++,並能利用大量現有的 C 函式庫和工具。然而,這種相容性並非百分之百,特別是在型別安全和使用者定義型別與內建型別的順暢整合方面,C++ 有時會犧牲與 C 的完全兼容以達到更好的設計目標。
論點二:C++ 支援多種程式設計典範,核心概念圍繞使用者定義型別(類別)及不同層次的抽象化能力。
- 支援多種典範: C++ 被設計為一種多典範語言,支援程序式程式設計、模組化程式設計(資料隱藏/資訊隱藏)、資料抽象化(使用者定義型別)、物件導向程式設計(繼承、虛擬函式、多型)以及泛型程式設計(模板)。這種設計理念旨在為程式設計師提供多種工具,以根據問題的性質選擇最適合的風格,而不是強制採用單一的程式設計方式。
-
類別作為核心: C++ 的關鍵概念是
class(類別),它是使用者定義型別的基礎。類別提供了資料隱藏、物件的保證初始化與清理(建構函式和解構函式)、運算符重載、以及成員函式等機制,使得使用者定義的型別可以像內建型別一樣方便地使用,並且將資料和操作封裝在一起。這支持了資料抽象化,使得程式設計師可以定義與應用領域概念緊密匹配的新型別。 -
不同層次的抽象化:
- 資料抽象化 (Data Abstraction): 通過類別將資料表示與操作介面分離,使用者只需了解如何使用介面,而無需關心內部實現細節。這提高了程式碼的模組化和可維護性。
- 物件導向程式設計 (Object-Oriented Programming): 通過繼承(derived classes)表達類別之間的「is-a」階層關係,並利用虛擬函式(virtual functions)實現多型(polymorphism),使得可以通過基類別的指標或引用操作不同衍生類別的物件,而自動呼叫正確的成員函式版本。這在處理相關概念的集合時特別有效,例如圖形系統中的各種形狀。
- 泛型程式設計 (Generic Programming): 通過模板(templates)實現參數化型別和函式,使得可以編寫獨立於特定型別或資料結構的演算法和資料結構。例如,容器模板(如 vector, list)可以容納任何型別的元素,而泛型演算法(如 sort, find)可以在不同型別的容器上操作。這通過在編譯時期進行型別參數化,避免了運行時開銷。
- 典範的互補性: 作者強調這些典範並非互斥,而是互補的。一個經驗豐富的設計師會根據需求靈活運用不同的典範和語言特性來構建系統。從低階的程序式風格到高階的泛型程式設計,C++ 提供了逐步學習和應用這些技術的途徑。
論點三:C++ 專為建構大型、複雜、長生命週期且跨越多個應用領域的軟體系統而設計。
- 針對大型系統: C++ 的設計反映了相較於 C 語言設計時,程式規模顯著增加的現實。它提供了模組化、強型別介面和彈性等特性,旨在使程式結構合理,即使是十萬行以上的程式碼也能由單個人合理地掌握和維護,並支持程式設計團隊的協作。百萬行的 C++ 程式並非罕見。
- 廣泛的應用領域: C++ 不僅用於系統程式設計(如作業系統、電信系統),還被廣泛應用於許多其他領域,包括金融服務、圖形處理、使用者介面(如 Macintosh 和 Windows 的主要使用者介面)、科學計算、遊戲開發等。C++ 的一個主要優勢在於它能夠有效地用於需要結合多個應用領域的程式,例如同時涉及網路、數值計算、圖形和資料庫存取的應用程式。
- 長生命週期考量: 由於許多 C++ 程式是大型且長生命週期的專案,穩定性、相容性和可擴展性一直是 C++ 演進過程中的重要考量。標準化工作旨在確保語言的穩定定義和廣泛的實作互通性。
- 生態系統支持: C++ 的廣泛使用得到了強大的生態系統支持,包括多個獨立的實作、眾多函式庫、教科書、期刊、研討會和培詢,這使得它成為一個成熟且可行的開發平台。
論點四:掌握 C++ 需要專注於核心概念與程式設計風格,而非僅僅語法細節,並將設計映射到語言特性。
- 學習的重點: 作者建議學習 C++ 時,最重要的是專注於概念和程式設計技術,而不是被語言的技術細節淹沒。學習程式設計語言的目的是成為更好的程式設計師和設計師,能夠更有效地設計、實作和維護系統。
- 逐步學習與實踐: C++ 的組織方式支援逐步學習,讓程式設計師可以隨著經驗的累積,逐步掌握更進階的技術。即使不了解所有細節,也能夠在不同熟練程度上進行有效的程式設計。
- 風格與慣用法: 每個程式設計語言都有其適合的風格和慣用法。將在其他語言中有效的技術直接應用於 C++ 通常會導致程式碼笨拙、效能低下且難以維護。程式設計師應該花時間學習和內化 C++ 獨特的風格和技術,例如如何將概念映射到類別、如何利用繼承表達階層關係、如何使用模板實現泛型等。標準函式庫本身就是一個學習 C++ 風格和技術的豐富來源。
- 設計即理解: 程式設計本身是一個理解問題並表達解決方案的過程。C++ 語言提供了一套概念性工具,可以幫助程式設計師以更直接和簡潔的方式思考和表達解決方案。將應用領域的概念直接映射到程式中的類別、物件、繼承、模板、命名空間等語言特性,可以使程式結構更清晰,更易於理解和維護。
- 實踐與經驗: 設計好的程式需要智慧、品味和耐心。沒有完美的語言,也沒有可以替代經驗和實踐的「烹飪手冊」式方法。程式設計師應該勇於實驗,從錯誤中學習,並參考優秀的程式碼。
總而言之,C++ 在保留 C 語言的基礎效率的同時,通過類別、繼承、模板等強大的抽象機制,支援多種程式設計典範,旨在成為建構大型、複雜、長生命週期的軟體系統的有效工具。成功的 C++ 程式設計師需要專注於概念和風格,並學習如何將設計中的抽象概念直接映射到語言特性,以便寫出易於理解、維護和擴展的程式碼。 標準函式庫在提供通用工具的同時,也為程式設計師提供了學習和應用這些高階技術的具體範例和基礎。
comments
comments for this post are closed