写点什么

C++:后现代的系统编程语言

  • 2016-02-05
  • 本文字数:2343 字

    阅读完需:约 8 分钟

C++ 作为一门经典的编程语言,从上世纪八十年代起至今一直被广泛应用在系统开发和高性能计算领域。近几年来随着各种编程语言和范式的兴起,C++ 的身影渐渐淡出了人们的视野。但是作为一个仍在不断进步的语言,C++ 在最近几年飞速发展,已经具备了现代语言应有的特性,而且也有了许多已有的和正在进行的新的拓展。

经典的 C++

作为 C 语言的超集,一方面,C++ 集成了 C 在系统编程优点,能够精确的控制内存中的每一个 bit;另一方面,提供了丰富的抽象机制和编程范式,引入了面向对象、泛型编程和函数式编程等风格。因为这一点,C++ 拥有了与 C 媲美的运行时性能,另一方面,也简化了 C 语言带来的领域建模的难度。但是因为 C++ 的整体设计结合了多种风格,几乎相当于嵌套了几个小语言的一个庞大的系统,这也使得 C++ 的整体易学性和易用性上有些差劲。同时,由于标准库更新跟不上需求,在诸如 Concurrency/Network 等应用层的软件设计方面逐渐被 Java 等后来者取代。而且,各个 C++ 厂商对编译器的实现并没有完全参考 ISO 标准,也造成了很多跨平台可移植性和兼容性问题。

现代 C++

C++ 在最近几年进行了几次探索和蜕变,让整个语言变得更具备现代化的特色。

资源管理

RAII(Resource Aquiration is Initialization,资源获取即初始化)作为 C++ 的特色之一,被广泛地应用到 C++ 的程序中。RAII 通过堆对象的生命周期来控制资源(包括堆内存、文件句柄、网络连接等)的生命周期,使得资源管理变得更加自动化,同时也避免了引入垃圾回收带来的运行时负担。但这种模式有一个很重要的问题,就是当需要对资源进行共享时,需要做更多额外的工作来进行检查和同步等工作。

作为更现代的资源管理方式,C++11 中引入了两种智能指针,std::shared_ptrstd::unique_ptr。前者拥有线程安全的引用计数,后者则是通过所有权(owenrship)转移来控制资源的生存周期。C++11 中也引入了右值引用和移动语义,来避免资源传递的过程中的不必要的复制。

与 Rust 中的生命周期(Lifetime)和所有权(Ownership)的概念类似,C++ 的std::unique_ptr在每一次值传递的时候将自身持有的资源转移到赋值的目标,同时结合移动语义,将赋值过程进一步地优化。

Lambda

Functor 作为 C++ STL 的一个重要组件,也是 C++ 中被使用很多的一个功能。一个 Functor 其实就是一个重载了operator()的类的实例对象,这种对象配合 C++ 模版的行为,可以被简单看成一个函数来调用,所以被称为 Functor(函子)。但是,由于 C++ 对于匿名类和内部类支持并不够好,使用 Functor 必须提前进行设计。一方面不方便使用,另一方面,定义和使用分离,对代码的组织和理解也造成了一定的困难。

首先,lambda 作为 Functor 的替代品,解决了不能即时定义并使用的问题。配合 STL 中的容器和算法,lambda 也能将 C++ 的函数式风格发挥到极致。其次,出于 C++ 一贯对性能和抽象的考虑,引入了 lambda capture 的概念,使得对象的生命周期能够绑定到 lambda 表达式,也就能够构建出闭包对象(closure)。另外,C++14 中加入的 generic lambda,增强了 lambda 的类型推导算法,在不损失类型安全特性的基础上,让组合式编程(Combinator–based Programming)更加易于实现。

并发

在 C++ 设计的初期,并发并未作为核心的语言特性考虑在内。并且,线程等并发模型在不同平台之上也有各种不同的实现,构建一个统一的并发模型也很困难。

C++11 中重新设计了 C++ 的内存模型,在保持原有兼容性的基础之上加入了并发的内容。同时标准库中也加入了线程(<thread>)、信号量(<condition_variable>)、互斥锁(<mutex>)和原子操作(<atomic>)等内容。同时也在此基础上封装了future/promise模式和async等操作。

元编程

C++ 自身对元编程提供了良好的支持。作为主要组件之一的模版,提供了编译时的数值计算和类型计算。但一方面由于使用模版减慢编译速度,另一方面,在使用模版的时候,非常难以调试和排错,这让很多人望而却步,甚至对基于模版的 STL 组件也有一种畏惧感。

C++11 中对元编程支持做了加强。首先是把 type traits 作为标准库引入,能够给模版提供一套直观的约束,也让类型作为 C++ 中的第一类值(first-class value)存在;另外 constexpr 的引入简化了编译时的值运算,配合用户自定义字面量(user-defined literals)以及可变参数模版(varadic template/parameter pack)等特性,让 C++ 能够更方便地定义内部 DSL。

Bright Future

作为一门经典的编程语言,C++ 至今还在不断地更新着。即将到来的 C++17 中,正在筹备着这些重要的特性:

  • 更丰富的标准库:C++ 中对 File System、Network 等重要的组件进行了标准化的支持,
  • Module TS:模块化提案,用于替代继承自 C 语言的头文件,简化 C++ 的编译模型和模块依赖,
  • Concepts TS:用于增强类型约束和类型推导,同时也简化模版的用法,
  • Reflection TS:提供编译期静态反射的支持,简化和增强 type traits,提供更丰富的元编程功能。

Conclusion

可以看到 C++ 发展至今一直都走在时代的前列线上。一方面,增加了更多适合应用和系统开发的组件,另一方面,通过语言特性的扩充来简化抽象复杂度。作为这样一个兼具新生特性和历史责任的编程语言,足以预见其应用的广度;同样,更多的系统级开源项目,像 Mesos 等,也选择 C++ 作为主要的编程语言。有足够的理由让我们相信,C++ 正在重获新生。

编后语

《他山之石》是 InfoQ 中文站新推出的一个专栏,精选来自国内外技术社区和个人博客上的技术文章,让更多的读者朋友受益。本问转载自《TW 洞见》。文章推荐可以发送邮件到editors@cn.infoq.com。


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-02-05 17:115303

评论

发布
暂无评论
发现更多内容

AI广告创意生产实践

之家技术

大模型 AIGC 企业号 4 月 PK 榜

苹果开发新款 AI 能「看懂」屏幕上内容;阿里未来 20% 代码将由 AI 编写丨 RTE 开发者日报 Vol.177

声网

连接世界,选择国外主机服务,让你的网站跨越地域限制

一只扑棱蛾子

国外主机 国外主机服务

日志服务 HarmonyOS NEXT 日志采集最佳实践

阿里巴巴云原生

阿里云 云原生 HarmonyOS 日志服务 sls

大模型驱动的新范式选车引擎

之家技术

大模型 AIGC 企业号 4 月 PK 榜

智能座机方案建设与实践

之家技术

人工智能 企业号 4 月 PK 榜

快马科技丨中小型经销商数字化怎么玩?

科技热闻

Apache Doris 2.1.1 版本正式发布!

SelectDB

数据库 大数据 开源 数据分析 大数据 开源

Databend 集成 PRQL:现代数据处理的一小步

Databend

从基础到高级,带你深入了解和使用curl命令(二)

霍格沃兹测试开发学社

打包与发布iOS应用的完整指南

雪奈椰子

零训练创建大模型的新方法:进化算法在模型融合中的应用

算AI

人工智能 神经网络 深度学习 算法

UniApp 应用发布到苹果商店指南

反套路打工:王子公主职场图鉴

白洞计划

云计算

室内全彩LED显示屏的构成与技术

Dylan

技术 LED显示屏 全彩LED显示屏 led显示屏厂家 户内led显示屏

给蚂蚁金服antv提个PR, 以为是改个错别字, 未曾想背后的原因竟如此复杂!

前夕

前端 数据可视化 bug 蚂蚁金服 antv-g2

持续兑现承诺,英特尔锐炫Day 0驱动支持网易武侠大作《射雕》

E科讯

阿里云可观测 2024 年 3 月产品动态

阿里巴巴云原生

阿里云 云原生 可观测

汽车之家人的“灵创”AI应用平台及编程助手AutoCode

之家技术

大模型 AIGC 企业号 4 月 PK 榜

从基础到高级,带你深入了解和使用curl命令(一)

霍格沃兹测试开发学社

顶级Layer-3 通证正在飙升,布局龙头Degen Chain(含bitget教程)

股市老人

浅谈TypeScript对业务可维护性的影响

前夕

typescript 前端

通义灵码走进武汉大学:让 AI 编码助手激活大学生的创造力

阿里云云效

阿里云 AI 云原生 通义灵码

pageSpy - 远程调试利器

前夕

前端 pagespy

C++ While 和 For 循环:流程控制全解析

小万哥

程序人生 编程语言 软件工程 C/C++ 后端开发

AIGC在广告创意上的实践

之家技术

大模型 AIGC 企业号 4 月 PK 榜

喜报!天翼云论文被权威国际学术会议IEEE/ACM CCGrid收录

编程猫

汽车智能化多模态交互

之家技术

大模型 AIGC 企业号 4 月 PK 榜

全网唯一能够秒回粉丝的博主, 是如何做到的?

前夕

前端 Electron React 自媒体

《计算机程序设计艺术(第2卷)》PDF

程序员李木子

我们是如何测试人工智能的(三)数据构造与性能测试篇

测试人

人工智能 软件测试

C++:后现代的系统编程语言_语言 & 开发_刘清_InfoQ精选文章