C++: 从历史说起

简介:C++历史

C++是一种常用的通用编程语言,可以编写出高效的程序。

一起来了解这门语言的精彩历史吧!

C++的起源

C++是由丹麦计算机科学家Bjarne Stroustrup于1979年在AT&T贝尔实验室发明。它源于对UNIX内核的分析,目的是研究它可以在网络上分布到什么程度。
当Stroustrup在剑桥大学计算实验室撰写博士论文时,对Simula编程语言的程序组织和并发功能印象深刻,并用它编写了一个模拟器。然而,他发现该语言的实现并不能很好地扩展,因此最终用BCPL重写了该模拟器。

带类(Classes)的C语言

在AT&T贝尔实验室工作期间,Stroustrup决定用他在Simula中发现的那些有用的语言特性来增强C编程语言。他开始编写一个前处理器Cpre,将带有类似Simula类的C程序转换为可以用现有编译器编译的普通C代码。这种新语言最初被简单地命名为 “带类的C语言”。

从一开始,这个新语言的目标就是可以用于C语言能用于的一切,因此它是一种通用的编程语言。此外,由于C语言编译器已经可以在许多平台上使用,因此它继承了C语言的可移植性,这也是其重要的质量特性之一。该语言的另一个目标是为C语言的不安全特性提供更好的替代方案,同时保持其效率和对底层硬件特性的直接访问。

带类的C语言提供:

  • 派生类
  • 公共/私有访问控制
  • 构造函数和析构函数
  • 调用和返回功能(由于不受欢迎,很快被删除)
  • 友元类
  • 函数参数的类型检查
  • 内联函数
  • 默认参数
  • 赋值运算符的重载
C++

在C++发展历史的这一时刻,这门语言需要一个合适的名字。有一段时间它被称为C84,但人们认为这个名字难听且容易混淆。最终,计算机科学家Rick Mascitti建议将其命名为 C++,这可以理解为该语言是C语言的继承者。

随着语言功能的不断增加,Cpre预处理器已不再适用,于是一个名为Cfront的编译器应运而生。为方便起见,Cfront仍能生成C代码,但它是一个正式的编译器,因为它能对语法和语义执行全面的检查,并生成程序的内部表示,每个范围有一个符号表。

新的语言特性包括:

  • 虚拟功能
  • 函数名称和运算符重载
  • 引用
  • 常量
  • 用户对自由存储器(堆内存)的控制
  • 改进了类型检查和C++风格注释(实际上取自BCPL)

1986年,《C++编程语言》一书的第一次修订版出版,该书根据Cfront 1.0编译器描述了C++语言。

C++的2.0版本

C++语言的第二个版本于1989年完成,提高了其定义和实现的稳定性。

C++ 2.0 增加了:

  • 多重继承
  • 类型安全链接
  • 改进了重载函数的解析
  • 赋值和初始化的递归定义
  • 改进的用户定义内存管理设施
  • 抽象类
  • 静态成员函数
  • 常量成员函数
  • 受保护的成员
  • 重载运算符->和指向成员的指针
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的工作重点转移到了语言的开发和标准化上。《C++注释参考手册》于1991年出版,成为语言标准的起点。该手册提供了C++的完整定义,而不仅仅是 Cfront 3.0 实现的功能,并经过了来自不同组织的许多人的审查。新功能包括命名空间、嵌套类和异常处理。

C++98

C++的ANSI标准化始于1989年,由惠普公司与AT&T、DEC和IBM联合发起。标准化该语言主要是由于这几个原因:添加重要的新功能,并防止不兼容方言的发展。1991年,国际标准化组织开始了标准化工作,此后各委员会举行了联席会议。

其中一项重要活动是定义标准库,包括标准模板库(STL)。此外,它还增加了:

  • 实时类型信息(RTTI:dynamic_cast、typeid)* 协变返回类型* 强制转换运算符* Mutable* 布尔类型(Bool)* 条件声明* 成员模板* 类内成员初始值设定项(In-class member initializers)* 模板的单独编译(导出)* 模板部分专用化* 重载函数模板的部分排序
C++03和嵌入式C++

C++03是C++98的另一个维护版本,经过技术勘误批准的更正进行了修订。委员会还开始考虑C++0x。

与此同时,日本嵌入式系统工具开发商联盟(包括东芝、日立、富士通和NEC)提出了嵌入式C++(EC++)子集。这是为嵌入式系统编程而设计的。该子集删除了那些可能影响性能或被开发人员认为过于复杂,从而被视为影响生产率或正确性的语言特性。

被禁用的功能有:多重继承、模板、异常、RTTI、新式投人和命名空间。此外,标准库中还删除了STL和locales,并提供了iostreams的替代方案。有趣的是,EC++的使用并不多,而增加了模板的”Ectended EC++”超集更受欢迎。

作为对EC++的回应,委员会发布了《性能技术报告》。该报告提供了一个模型,用于说明使用不同C++语言和库特性所带来的时间和空间的开销。这样一来,它就解决了人们对性能问题的担忧。此外,它还提出了高效实施的技术。因此,国际标准化组织委员会没有批准 EC++。

C++11

这个版本引入了许多新的主要功能,因此对许多程序员来说,它就像是一种新的语言!

C++11新增了:

  • 内存模型
  • 并发性
  • 自动和声明类型
  • 基于范围的for循环(Range-for)
  • 移动语义和右值引用
  • 统一初始化
  • 空指针
  • 常量表达式函数
  • 用户定义的文本
  • 原始字符串文本
  • 属性
  • Lambdas(拉姆达斯)
  • 可变参数模板
  • 模板别名(使用)
  • Noexcept
  • 覆盖和最终
  • 静态断言
  • Long long
  • 默认成员初始值设定项
  • 在构造函数中初始化
  • 枚举类

标准库也有了重大的补充。1998年,Boost组织成立,免费提供经同行评审的可移植C++源代码库。Boost库之所以重要,是因为它很早就提供了各种库功能,这样ISO标准就可以从中获益。内存模型是并发支持的重要基础,它提供了线程和锁。

移动语义可以提高效率,因为它消除了不必要的复制,而复制对于大型对象来说是昂贵的。它允许开发人员控制是否复制资源,或其所有权是否应转移到另一个对象,从而能够控制对象的生命周期和资源管理。

C++14

ISO C++委员会打算更改主要版本和次要版本,因此,C++14的目标是完善C++11。 它增加了:

  • 二进制文本(0b)
  • 数字分隔符
  • 变量模板
  • 函数返回类型推导
  • 通用lambda
  • constexpr函数中的局部变量
  • 移动捕捉
  • 按类型访问元组
  • 标准库中的用户定义的文本
C++17

在C++14小版本发布之后,C++17本应是一次重大更新。遗憾的是,一些主要的预期功能(如概念和例程),并没有出现在这个版本中。

新的主要功能包括:

  • 类模板参数推导(推导指南介绍)
  • 结构化绑定
  • 内联变量
  • 折叠表达式
  • 条件下的显式测试
  • 保证复制省略
  • 更严格的表达式计求值顺序
  • 自动作为模板参数类型
  • 用于发现常见错误的标准属性
  • 十六进制浮点文字
  • “if onstexpr”

其中一些新功能体现了对函数式编程风格越来越多的支持。这方面的关键元素在C++11中已经由lambdas提供,但折叠表达式(一种使用运算符将参数列表缩减为单个值的方便符号)和推导指南增加了语言的函数式风格。

C++20

C++17中没未能实现的主要功能在C++20中得以实现。因此,该版本向前迈进了一大步,相当于从C++03迈进了C++11,可以说该版本是C++17应有的重大升级。

主要的新语言特性包括:

  • 协程(Coroutines)
  • 概念
  • 模块

其他新的语言功能包括:编译时计算支持、宇宙飞船运算符<=>、并发改进、指定的初始值设定项,以及非类型模板参数中的类类型(还允许字符串文字作为模板参数)。此外,新的标准库功能包括范围、日期、跨度和格式。

模块提供了一种比基于预处理器(包括从C语言继承的文件机制)更好的模块化表达方式。协程提供了一种无栈机制,用于执行顺序代码的异步操作。概念是对模板参数的要求的命名集合,是模板接口的一部分。它们使指定模板的预期用途成为可能,并在不满足约束条件时,大大提高了编译错误的清晰度。与以前使用的”替换失败不是错误(Substitution Failure Is Not An Error)”做法相比,这样可以避免出现约束违规时产生的冗长和复杂的编译错误,是一项显著的改进。

C++的未来

自1979年迈出第一步以来,C++已经取得了长足的进步,并还在不断发展。

C++23即将发布,并将进行小而重大的调整,而C++26的开发工作已经开始。

C++的受欢迎程度持续上升,其使用范围也在不断扩大——包括通过虚幻引擎创建虚拟现实 (VR) 应用程序,以及加密货币应用程序。

相关文章

<

树莓派掌上电脑

一支国外团队推出了“树莓派掌上电脑”,看上去很酷。

它就是一个全功能的 Linux 系统,带有7小时续航。

它还有一个可组装版本,屏幕是单独分离的。

下面可以配上键盘,也可以配上手柄。

它是开源的,制作团队希望将成本控制在250美元。

阅读更多
<

少儿编程是学什么的?

一、基础编程概念与语法

少儿编程的起点是基础编程概念的学习,如变量、循环、条件判断等。这些概念是构建程序逻辑的关键,通过学习,孩子们能够了解计算机如何执行任务,进而培养逻辑思维能力。在编程语言的选择上,Scratch和Python是两种常见的入门语言。Scratch是一种图形化编程语言,通过拖拽积木形式的代码块,孩子们可以轻松学习基础的编程知识和逻辑。而Python则是一种更为高级的编程语言,适合稍大一些的孩子,通过学习Python,孩子们可以编写更复杂的程序,实现更多功能。

二、算法与数据结构

随着学习的深入,孩子们会接触到算法和数据结构的概念。算法是解决特定问题或执行特定任务的一系列步骤,而数据结构则是一种组织和存储数据的方式。通过学习算法和数据结构,孩子们能够更高效地解决问题,提升编程能力。这一阶段的学习不仅要求孩子们掌握理论知识,更需要通过实践项目来加深理解。

三、趣味编程与项目实践

少儿编程不仅仅是枯燥的理论学习,更包含了趣味编程和项目实践。孩子们可以使用图形化编程工具制作动画、游戏、互动故事等,这些有趣的主题和项目能够激发孩子们的学习兴趣,提高他们的创造力和动手能力。同时,项目实践也是培养团队合作和沟通能力的重要途径。孩子们会分组进行项目制作,如制作一个简单的游戏或网站,在这个过程中,他们不仅需要将所学知识应用到实践中,还需要学会团队协作,共同完成任务。

四、计算思维与创新能力的培养

少儿编程的核心目标是培养孩子们的计算思维和创新能力。计算思维是一种解决问题的思维方式,它强调问题分解、模式识别、抽象化和算法设计。通过编程学习,孩子们能够学会用这种思维方式去解决问题,同时,在编程过程中,孩子们还可以发挥自己的想象力,创造出独一无二的作品,从而培养创新能力。这种思维方式和创新能力将伴随孩子们一生,成为他们最宝贵的财富。

五、跨学科融合与未来技能

少儿编程还是一座桥梁,连接着数学、科学、艺术等多个领域。在编程的过程中,孩子们会不自觉地运用到数学中的逻辑、物理中的原理、艺术中的审美,这种跨学科的学习模式不仅加深了他们对各个学科知识的理解,更重要的是让他们学会了如何将这些知识融会贯通,应用于实际问题中。掌握编程技能意味着孩子们在未来将拥有更多的选择,无论是成为一名程序员,还是跨领域的人才,都将具有更大的竞争力。

阅读更多
<

为什么要鼓励孩子学习编程?

计算机技术已经成为生活中不可或缺的一部分.我们鼓励孩子们学习编程,是基于以下方面的考虑:

收获创造的乐趣

孩子出门上学前用"彩云天气"查看天气预报, 等公交时使用"车来了"查看公交车位置, 外出时使用"微信"和父母保持联系, 周末时打开"Minecraft"和朋友一起搭建城市. 所有这些产品的背后都是计算机程序在支撑.

如果孩子并不知道计算机程序的工作原理, 不知道程序如何为他服务, 那么, 他只是一个消费者, 一个用户. 如果, 我们可以让孩子成为程序的创造者呢?

如果孩子不再是产品的消费者, 而是产品的创造者呢, 那会是怎样的景象?

他可以设计游戏玩得不亦乐乎、可以开发网站展示自己、可以利用算法解决奥数题、可以编写脚本完成重复操作… 学会编程, 他可以将自己脑袋中迸发的无数创意, 落地到真实生活中, 收获创造的乐趣.

阅读更多