0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++简史:C++是如何开始的

北汇信息POLELINK 2024-01-11 09:00 次阅读

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

    文章

    7597

    浏览量

    136114
  • 编程语言
    +关注

    关注

    10

    文章

    1937

    浏览量

    34584
  • 函数
    +关注

    关注

    3

    文章

    4303

    浏览量

    62408
收藏 人收藏

    评论

    相关推荐

    C语言与C++的区别

    在很大程度上,C++C的超集,这意味着一个有效的C程序也是一个有效的C++程序。
    发表于 09-16 10:20 1128次阅读

    C++课件、习题及答案

    *1.1  从CC++*1.2  最简单的C++程序 1.3  C++程序的构成和书写形式 1.4 
    发表于 09-08 09:35 108次下载
    <b class='flag-5'>C++</b>课件、习题及答案

    C++简介 ppt

    C++简介 目录1.0  本科程在专业学习中的地位1.1  程序设计语言 1.2  C++前史 1.3  C++ 1.4  C++
    发表于 02-24 09:34 28次下载

    C++ 入门自学教程

    C++ 入门自学教程从入门知识开始讲起,比较有利于初学者入门掌握,比较好懂,能够对C++有一个全面认识
    发表于 11-17 10:36 0次下载

    C++C/C++程序设计教程_C/C++概述

    C++基础知识,简要介绍了C++的一些简单知识,概念,函数
    发表于 12-25 10:15 0次下载

    C++入门教程之C++程序设计的课件资料免费下载

    本文档的主要内容详细介绍的是C++入门教程之C++程序设计的课件资料免费下载主要内容包括了:1. 认识C++2. C++的现状和发展3. C++
    发表于 12-07 08:00 33次下载
    <b class='flag-5'>C++</b>入门教程之<b class='flag-5'>C++</b>程序设计的课件资料免费下载

    VISUAL C++教程之VISUAL C++的安装和使用方法

    本文档的主要内容详细介绍的是VISUAL C++教程之VISUAL C++的安装和使用方法资料免费下载。
    发表于 12-27 16:32 19次下载
    VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安装和使用方法

    C++程序设计教程之C++的初步知识的详细资料说明

    C++程序设计教程之C++的初步知识的详细资料说明包括了:1. 从CC++,2 . 最简单的C++程序,3 .
    发表于 03-14 14:48 31次下载
    <b class='flag-5'>C++</b>程序设计教程之<b class='flag-5'>C++</b>的初步知识的详细资料说明

    C++程序设计的基础知识初步了解C++的资料免费下载

    本文档的主要内容详细介绍的是C++程序设计的基础知识初步了解C++的资料免费下载包括了:1 认识C++,2 C++的现状和发展,3 C++
    发表于 06-10 08:00 25次下载
    <b class='flag-5'>C++</b>程序设计的基础知识初步了解<b class='flag-5'>C++</b>的资料免费下载

    C++创造者:成功属于意料之外

    的成功属于意料之外 1979 年,C++ 的创建者 Bjarne Stroustrup 开始着手    Bjarne Stroustrup 一开始没想到 C++ 会获得如此大的成功,
    的头像 发表于 01-02 09:46 1611次阅读

    c++知识要点

    第一章 开始 1.1 编写一个简单的C++程序 int main() { return 0; } 每个C++程序都包含一个或多个函数,其中一个必须命名为main.
    发表于 06-20 09:45 0次下载

    C++学习笔记之c++的基本认识

    自这篇文章我们即将开始C++的奇幻之旅,其内容主要是读C++ Primer的总结和笔记,有兴趣可以找原版书看看,对于学习C++还是有很大帮助的。这篇文章将从一个经典的程序
    的头像 发表于 03-17 13:57 700次阅读

    浅谈C语言与C++的前世今生

    C++开发人员将有这些问题归咎于C,而C开发人员则认为C++过于疯狂。我觉得站在C的角度看C++
    发表于 05-26 09:27 431次阅读
    浅谈<b class='flag-5'>C</b>语言与<b class='flag-5'>C++</b>的前世今生

    C++之父新作带你勾勒现代C++地图

    为了帮助大家解决这些痛点问题,让大家领略现代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他亲自操刀写就了这本《C++之旅》!
    的头像 发表于 10-30 16:35 792次阅读
    <b class='flag-5'>C++</b>之父新作带你勾勒现代<b class='flag-5'>C++</b>地图

    c++怎么开始编程

    应用程序、嵌入式系统和网络应用程序等各种领域。 在开始编程之前,你需要安装C++的编程环境。首先,你需要下载并安装一个编译器,比如微软的Visual Studio、GNU的GCC或者Clang。这些编译器可以将你的C++代码编译
    的头像 发表于 11-27 15:56 887次阅读