MISRA C++:2023 - MISRA C++ 標準的下乙個版本就在這裡!為了幫助您更好地了解新版本,Perforce 帶來了 Misra C++:2023 部落格系列的第二部分,作者是 Perforce 首席技術支援工程師 Frank Van den Beuken 博士。 要閱讀第一篇文章,請單擊......
在本文中,我們將深入探討 C++ 的歷史、程式語言多年來的發展情況以及下一步。 C++ 是一種常用的通用程式語言,可用於編寫高效的程式。 正因為如此,它在汽車行業等注重安全的應用中很受歡迎,其中MISRA是最常用的編碼標準之一。
讓我們了解這門語言的迷人歷史!C++是由丹麥計算機科學家Bjarne Stroustrup於2024年在AT&T貝爾實驗室發明的。 它源於對 UNIX 核心的分析,目的是研究它可以在網路中分布多遠。
當 Stroustrup 在劍橋大學計算實驗室攻讀博士學位時,他對 Simula 程式語言的程式組織和併發能力印象深刻,他用它編寫了乙個模擬器。 然而,他發現該語言的實現不能很好地擴充套件,所以他最終用 BCPL 重寫了模擬器。 在AT&T貝爾實驗室工作期間,Stroustrup決定用他在Simula中發現的那些有用的語言功能來增強C程式語言。 他開始編寫預處理器 CPRE,將具有類似 SIMULA 類的 C 程式轉換為可以使用現有編譯器編譯的普通 C。 這種新語言最初只是簡單地命名"帶類的 C 語言"。
從一開始,這種新語言的目標就是能夠使用 C 可以使用的一切,因此它是一種通用程式語言。 此外,由於 C 編譯器已經在許多平台上可用,因此它繼承了 C 語言的可移植性,這是其重要的質量特徵之一。 該語言的另乙個目標是為 C 語言的不安全特性提供更好的替代方案,同時保持其效率和對底層硬體特性的直接訪問。
帶有類的 C 提供:類。
派生類。 公共和私人訪問控制。
建構函式和析構函式。
呼叫和返回函式(由於不受歡迎,該函式很快被刪除)。
流派的朋友。 函式引數的型別檢查。
內聯函式。 預設引數。
賦值運算子的過載。
在C++歷史上的這一點上,該語言需要乙個合適的名稱。 有一段時間它被稱為C84,但這個名字被認為是令人不快和令人困惑的。 最終,計算機科學家Rick Mascitti建議將其命名為C++,這可以理解為該語言是C的繼承者。
隨著語言能力的不斷提高,CPRE 預處理器不再適用,於是建立了乙個名為 CPfront 的編譯器。 為了方便起見,cfront 仍然可以生成 c**,但它是乙個正式的編譯器,因為它對語法和語義進行全面檢查,並生成程式的內部表示,每個範圍都有乙個符號表。 新的語言功能包括:虛擬功能。
函式名稱和運算子過載。
引用。 不斷。
使用者對可用記憶體(堆記憶體)的控制。
改進了型別檢查和 C++ 樣式注釋(實際上取自 BCPL)。
2024年,基於Cfront 1的《C++程式語言》一書的第一修訂版出版0 編譯器描述了 C++ 語言。 C++ 語言的第二個版本於 1989 年完成,提高了其定義和實現的穩定性。
c++ 2.新增 0:多重繼承。
型別安全的鏈結。
改進了過載函式的分析。
賦值和初始化的遞迴定義。
改進了使用者定義的記憶體管理功能。
抽象類。 靜態成員函式。
常量成員函式。
受保護的成員。
過載運算子 - >和指向成員的指標。
這是 C++ 語言標準化之前的最後乙個版本。 c++ 3.版本 0 於 1991 年完成,增加了類和函式模板。 c++ 4.版本 0 應該在 1993 年發布,並進行異常處理。
惠普在 1992 年初完成了最初的實施,但由於無法完成而沒有發布。 AT&T推出新的C++編譯器的計畫從未實現,而其他C++編譯器,包括商業編譯器(例如Borland,IBM,DEC,Microsoft)和開源GNU編譯器G++,出現了。 因此,Stroustrup 的重點轉移到了語言開發和標準化上。 C++注釋參考手冊於2024年出版,成為語言標準的起點。 該手冊提供了 C++ 的完整定義,而不僅僅是 Cfront 30 功能由來自不同組織的許多人實施和審查。 新功能包括命名空間、巢狀類和異常處理。
C++ 的 ANSI 標準化始於 1989 年,由惠普與 AT&T、DEC 和 IBM 合作發起。 該語言之所以標準化有幾個原因:新增重要的新功能和防止不相容方言的發展。 2024年,國際標準化組織(ISO)開始了標準化工作,此後各委員會舉行了聯席會議。
其中一項重要活動是定義標準庫,包括標準模板庫 (STL)。 此外,它還新增了:實時型別資訊(RTTI:Dynamic Cast,TypeID)。
協方差返回型別。
脅迫運算子。
mutable
布林型別 (bool)。
條件宣告。 成員模板。
類內成員初始值設定項
模板的單獨編譯(匯出)
模板部分專用化。
對過載函式模板進行部分排序。
C++03 是 C++98 的另乙個維護版本,其修訂版已通過技術勘誤批准批准。 委員會也開始審議C++0X。
與此同時,包括東芝、日立、富士通和NEC在內的日本嵌入式系統工具開發商聯盟提出了嵌入式C++(EC++)的子集。 這是為嵌入式系統程式設計而設計的。 此子集刪除了可能影響效能或開發人員認為過於複雜而無法影響工作效率或正確性的語言功能。 禁用功能包括:多重繼承、模板、異常、RTTI、新式強制轉換和命名空間。 此外,STL 和語言環境已從標準庫中刪除,並提供了 iostreams 的替代方案。 有趣的是,EC++ 使用得不多,而是新增了模板"ectended ec++"超集更受歡迎。
作為對 EC++ 的回應,委員會發布了效能技術報告。 該報告提供了乙個模型來說明與使用不同的 C++ 語言和庫功能相關的時間和空間成本。 通過這種方式,它解決了人們對效能問題的擔憂。 此外,它還提出了有效實施的技術。 因此,ISO 委員會沒有批准 EC++。 這個版本引入了許多新的主要功能,所以對於很多程式設計師來說,它就像一門新語言!C++11 新增了新的記憶體模型。
併發。 自動和宣告型別。
範圍-for迴圈
移動語義和右值引用。
統一初始化。
空指標。 常量表示式函式。
使用者定義的文字。
原始字串文字。
屬性。 lambdas(lambdas)
可變引數模板。
模板別名(已使用)。
noexcept
覆蓋範圍和終結性。
靜態斷言。 long long
預設成員初始值設定項。
在建構函式中初始化。
列舉類。 標準庫也增加了乙個重要的內容。 1998 年,Boost 組織成立,旨在提供乙個免費的同行評審、可移植的 C++ 原始碼庫。 Boost 庫很重要,因為它在早期提供了各種庫功能,以便 ISO 標準可以從中受益。 記憶體模型是併發支援的重要基礎,提供執行緒和鎖。
移動語義可以更有效,因為它消除了不必要的複製,這對於大型物件來說代價高昂。 它允許開發人員控制是否複製資產或是否應將其所有權轉移到另乙個物件,從而使他們能夠控制物件的生命週期和資源管理。 ISO C++ 委員會打算更改主要和次要版本,因此 C++14 的目標是改進 C++11。 它新增:二進位文字 (0b)。
數字分隔符。
變數模板。 該函式返回型別派生。
通用 lambda
constexpr 函式中的區域性變數。
移動捕捉。 按型別訪問元組。
標準庫中的使用者定義文字。
在 C++14 發布後,C++17 應該是乙個重大更新。 遺憾的是,此版本中沒有一些主要的預期功能,例如概念和例程。 主要的新功能包括:類模板引數派生(在派生指南中介紹)。
結構化繫結。
內聯變數。 摺疊表示式。
在條件下進行顯式測試。
省略了保證複製。
對表示式計數進行更嚴格的計算順序。
自動作為模板引數型別。
用於發現常見錯誤的標準屬性。
十六進製浮點文字。
if onstexpr”
其中一些新功能反映了對函式式程式設計風格的支援日益增加。 C++11 中的 lambda 已經提供了這方面的關鍵元素,但摺疊表示式(一種方便的表示法,使用運算子將引數列表減少到單個值)和派生指南增加了語言的函式風格。 未在 C++17 中實現的主要功能在 C++20 中實現。 因此,這個版本是向前邁出的一大步,相當於從 C++03 遷移到 C++11,可以說這個版本是 C++17 應該有的一次重大公升級。 主要的新語言功能包括: 協程
概念。 模組。
其他新的語言功能包括編譯時計算支援、宇宙飛船運算子 <=>、併發改進、指定的初始值設定項以及非型別化模板引數中的類型別(也允許將字串文字作為模板引數)。 此外,新的標準庫功能包括範圍、日期、跨度和格式。
與基於預處理器相比,模組提供了一種更好的方法來表達模組化,包括繼承自 C 的檔案機制。 協程提供了一種無堆疊機制,用於執行順序非同步操作。 概念是模板引數要求的命名集合,是模板介面的一部分。 它們可以指定模板的預期用途,並且在不滿足約束條件時,可以大大提高編譯錯誤的清晰度。 與以前的使用"替換失敗不是錯誤"與避免發生約束衝突時發生的冗長而複雜的編譯錯誤的做法相比,這是乙個重大改進。
自 1979 年邁出第一步以來,C++ 已經走過了漫長的道路,並且仍在不斷發展。 C++23即將發布,將進行小而重大的調整,而C++26的開發工作已經開始。 C++的受歡迎程度持續上公升,其使用也在不斷上公升,包括通過虛幻引擎建立虛擬實境(VR)應用程式以及加密貨幣應用程式。 30 多年來,Perforce 的靜態分析工具 Helix QAC 和 Klocwork 一直備受信賴,可以保持 C 和 C++ 等語言的安全、可靠和高質量**。 它們可以在您編寫時識別缺陷、漏洞和合規性問題,並經過認證,可用於安全關鍵型應用程式。
Helix QAC 還提供了乙個合規性模組,用於執行新的 MISRA C++:2023 指南。 Perforce 計畫在標準發布時提供完整的 MISRA C++:2023 合規性模組。 關於作者:
弗蘭克·范登博肯
Perforce 首席技術支援工程師
作為一名技術支援專家,Frank 在整合 PerForce 靜態源**分析解決方案以在客戶軟體開發環境中進行軟體質量控制方面擁有 20 多年的經驗。 近年來,他專注於為各種編譯器配置靜態分析。 他還提供優質的培訓和諮詢服務。
Frank 擁有奈梅亨大學的數學和計算科學博士學位,他的研究重點是系統規範語言。
品**: