MISRA C++:2023,MISRA? C++ 標準的下一個版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫的 MISRA C++:2023 博客系列的第二部分。
在這篇博客中,我們將深入探討 C++ 的歷史、編程語言多年來的發展歷程以及它的下一步發展方向。
簡介:C++ 歷史
C++是一種常用的通用編程語言,可以用它來編寫高效的程序。
正因為如此,它在安全關鍵型應用領域也很受歡迎,例如汽車行業,MISRA是最受歡迎的編碼標準之一。
讓我們來看看這門語言的迷人歷史。
C++是如何開始的
C++是由AT&T貝爾實驗室的丹麥計算機科學家Bjarne Stroustrup于1979年發明的。它起源于對 UNIX 內核的分析,目的是研究它可以在多大程度上分布在網絡上。
當 Stroustrup 在劍橋大學計算實驗室撰寫博士論文時,他對用于編寫模擬器的Simula編程語言的程序組織和并發特性印象深刻。然而,他發現實現的擴展性不好,所以最終用 BCPL 重寫了模擬器。
C 與類
在AT&T貝爾實驗室的工作中,Stroustrup決定用他在Simula中發現非常有用的語言功能來增強C編程語言。他開始編寫一個預處理器 Cpre ,將帶有類似 Simula 類的 C 程序轉換為可以使用現有編譯器編譯的常規 C 代碼。這門新語言最初被簡單地命名為“C with Classes”。
從一開始,目標就是讓新語言可以用于 C 語言的所有用途,因此它是一種通用編程語言。此外,由于 C 編譯器已經可用于許多平臺,因此它繼承了 C 的可移植性,這是迄今為止它的重要質量特性之一。該語言的另一個目標是為 C 語言的不安全特性提供更好的替代方案,同時保持其效率和對底層硬件特性的直接訪問。
C提供的類:
? 類
? 派生類
? 公共/專用訪問控制
? 構造函數和析構函數
? 調用和返回功能(由于缺乏普及,很快被刪除)
? 友元類
? 函數參數的類型檢查
? 內聯函數
? 默認參數
? 賦值運算符重載
C++
在 C++ 歷史上的這一點上,該語言需要一個專有的名稱。一段時間以來,它一直被稱為C84,但這被認為是丑陋和令人困惑的。最終,計算機科學家Rick Mascitti提出了C++這個名字,這可以解釋為該語言是C的繼承者。
隨著更多的功能被添加到該語言中, Cpre 預處理器不再適用,因此編寫了一個合適的編譯器名稱Cfront。為了方便起見,它仍然生成 C 代碼,但它是一個合適的編譯器,因為它對語法和語義進行了完整的檢查,并生成了程序的內部表示,每個范圍都有一個符號表。
新的語言功能包括:
? 虛擬功能
? 函數名稱和運算符重載
? 引用
? 常量
? 用戶控制的空閑存儲內存控制
? 改進了類型檢查和 C++ 樣式注釋(實際上取自 BCPL)
1986年,《C++編程語言》一書的第一版出版,根據 Cfront 1.0編譯器描述了該語言。
C++ 版本 2.0
該語言的第二版于1989年完成,提高了其定義和實現的穩定性。
添加了 C++ 2.0:
? 多重繼承
? 類型安全聯動
? 改進了重載函數的分辨率
? 賦值和初始化的遞歸定義
? 改進了用戶定義的內存管理功能
? 抽象類
? 靜態成員函數
? Const 成員函數
? 受保護的成員
? 運算符重載 -> 和指向成員的指針的重載
C++ 版本 3.0
這是該語言標準化之前的最后一個 C++ 版本。C++ 3.0 于 1991 年完成,并添加了類和函數模板。C++ 4.0 應該在 1993 年發布,增加異常處理功能,1992年惠普完成了該功能的初步實現,但一直沒有完成。
帶注釋的 C++ 參考手冊
AT&T計劃推出新的C++編譯器計劃從未實現,而其他C++編譯器,包括商業編譯器(包括Borland,IBM,DEC和Microsoft)和開源GNU編譯器g++都出現了。因此,Stroustrup 的重點轉移到了語言的開發和標準化上。1991 年出版 的《注釋 C++ 參考手冊 》成為語言標準的起點。該手冊提供了 C++ 的完整定義,而不僅僅是 Cfront 3.0 實現的功能,并且來自不同組織的許多人都對其進行了審查。新特性包括命名空間、嵌套類和異常處理。
C++98
C++ 的 ANSI 標準化由 Hewlett-Packard 與 AT&T、DEC 和 IBM 于 1989 年共同發起。標準化語言之所以成為必要,有幾個原因:增加重要的新特征,防止不兼容方言的發展。1991年,ISO標準化開始,從那時起,委員會舉行了聯席會議。
一項重要的活動是標準庫的定義,包括標準模板庫(STL)。此外,它補充說:
? 實時類型信息(RTTI:dynamic_cast、typeid)
? 協變返回類型
? 強制轉換運算符
? 可變
? 布爾
? 條件聲明
? 成員模板
? 類內成員初始值設定項
? 模板的單獨編譯(導出)
? 模板部分專用化
? 重載函數模板的部分排序
C++03 和嵌入式 C++
C++03 是 C++98 的維護版本,經過修訂,并批準了技術勘誤的更正。委員會也開始考慮C++0x。
與此同時,包括東芝、日立、富士通和NEC在內的日本嵌入式系統工具開發商聯盟提出了嵌入式C++(EC++)子集。這是為嵌入式系統編程而設計的。該子集刪除了可能損害性能或被認為對開發人員來說過于復雜的語言功能,因此被視為生產力或正確性風險。
被禁止的功能是多重繼承、模板、異常、RTTI、新樣式的強制轉換和命名空間。此外,STL 和語言環境已從標準庫中刪除,并提供了 iostreams 的替代方案。有趣的是,EC++ 的使用并不多,添加模板的“擴展的EC++”超集更受歡迎。
作為對 EC++ 的回應,委員會發布了《性能技術報告》。性能技術報告提供了使用各種 C++ 語言和庫功能所隱含的時間和空間開銷的模型。在這樣做的過程中,它解決了對性能問題的擔憂。此外,它還介紹了有效實施的技術。因此,ISO 委員會不認可 EC++。
C++11
這個版本引入了許多新的主要功能,所以對于許多程序員來說,它感覺就像一門新語言!
C++11 添加了:
? 內存模型
? 并發
? Auto 和 decltype
? 范圍
? 移動語義和右值引用
? 統一初始化
? 零點
? Constexpr 函數
? 用戶定義的文本
? 原始字符串文本
? 屬性
? Lambdas
? 可變參數模板
? 模板別名(使用)
? Noexcept
? 覆蓋和最終
? Static_assert
? Long long
? 默認成員初始值設定項
? 在構造函數中初始化
? 枚舉類
標準庫也進行了重大補充。1998年,Boost組織成立,提供免費的同行評審的可移植C++源代碼庫。Boost 庫很重要,因為其中很早就提供了各種庫功能,因此 ISO 標準可以從使用中獲得的經驗中受益。內存模型是并發支持的重要基礎,它提供了線程和鎖。
移動語義可以提高效率,因為它消除了不必要的副本,這對于大型對象來說可能很昂貴。它允許開發人員控制是否復制資源,或者是否應將其所有權轉移到另一個對象,從而完成對對象生存期和資源管理的控制。
C++14
ISO C++ 委員會打算對主要和次要版本進行更改,以便 C++14 旨在完成 C++11。它補充道:
? 二進制文本 (0b)
? 數字分隔符
? 變量模板
? 函數返回類型推導
? 通用 lambdas
? constexpr 函數中的局部變量
? 移動捕獲
? 按類型訪問元組
? 標準庫中的用戶定義的文本
C++17
在次要的 C++ 14 發布之后, C++17 應該是一個重大更新。不幸的是,一些主要的預期功能,如概念和協程,沒有出現在這個版本中。
新的主要功能包括:
? 類模板參數推導(介紹推導)
? 結構化綁定
? 內聯變量
? 折疊表達式
? 在條件下進行顯式測試
? 有保證的副本省略
? 更嚴格的表達式計算順序
? 自動作為模板參數類型
? 捕獲常見錯誤的標準屬性
? 十六進制浮點文字
? “if constexpr”
一些新功能是增加對函數式編程風格的支持的示例。這方面的關鍵元素已經由C++11中的lambdas提供,但折疊表達式(一種使用運算符將參數列表簡化為單個值的方便表示法)和推導指南增加了語言的功能風味。
C++20
C++17 中沒有的主要功能在 C++20 中添加。因此,這個版本向前邁出了一大步,與從 C++03 到 C++11 的步驟相當,所以我們可以說這個版本是 C++17 應該的重大升級。
主要的新語言功能包括:
? 推論
? 概念
? 模塊
其他新的語言功能包括編譯時計算支持、宇宙飛船運算符 <=>、并發性改進、指定的初始值設定項以及非類型模板參數中的類類型(還允許字符串文字作為模板參數)。此外,新的標準庫功能包括范圍、日期、跨度和格式。
模塊最終提供了一種比基于預處理器的更好的表達模塊化的方式,其中包括繼承自 C 的文件機制。Coroutines為異步執行順序代碼提供了一個無堆棧機制,概念是模板參數上的命名需求集,是模板接口的一部分。它們可以指定模板的預期用途,并在不滿足約束條件時大大提高編譯錯誤的清晰度。與以前使用“替換失敗不是錯誤”(SFINAE) 的做法相比,這是一個顯著的改進,后者在違反約束時會導致長時間而復雜的編譯錯誤。
C++的未來
自 1979 年邁出第一步以來,C++ 已經走過了漫長的道路,并且還在不斷發展。
C++23 將很快發布,并進行了小但重要的調整,并且 C++26 的工作已經開始。
C++的受歡迎程度不斷上升,其使用范圍也在擴大——包括通過虛幻引擎創建虛擬現實 (VR) 應用程序,以及加密貨幣應用程序。
信任 C++ 的 Perforce 靜態分析
30 多年來,Perforce 的靜態分析工具 Helix QAC 和 Klocwork 因其安全、可靠和高質量的 C、C++ 等代碼而備受信賴。我們的工具可在您編碼時識別缺陷、漏洞和合規性問題,并經過認證可用于安全關鍵型應用程序。
Helix QAC 還提供合規性模塊,用于執行 新的 MISRA C++:2023 指南。Perforce 計劃在標準發布時提供完整的 MISRA C++:2023 合規性模塊。
-
C語言
+關注
關注
180文章
7604瀏覽量
136683 -
編程語言
+關注
關注
10文章
1942瀏覽量
34707 -
函數
+關注
關注
3文章
4327瀏覽量
62569
發布評論請先 登錄
相關推薦
評論