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