在编程语言的世界中,C++的地位举足轻重。在2022年5月的TIOBE编程语言排行榜中,C++位列第四。同样地,谷歌内部也在广泛使用C++。
但是,天下大势,合久必分,分久必合。每一种编程语言都曾想一统江湖,将其他语言取而代之。但事实上,能够在众多竞争者中脱颖而出并雄霸一方天地并非易事。今天,谷歌重磅公开了其内部建立的最新编程语言——Carbon,剑指 C++,欲成为其实验性继任者。

历朝历代的“继承者们”
多年来,谷歌创建了许多编程语言,其中一些已经广为流行并深受大家的喜爱。例如,Golang(简称 Go)是为了改善服务器和分布式系统的开发而创建的,后来被公众采用。同时,Dart 编程语言,最初是作为 Java 的替代品,直到 Flutter 的发布后终于成为主流语言。
日前在多伦多举行的 Cpp North 大会(专门讨论 C++ 的会议)上,谷歌首席软件工程师和开源软件开发者 Chandler Carruth 分享了一种名为 Carbon 的新编程语言的愿景。Carruth 展示了当今许多最流行的编程语言是如何拥有继承者的,这些继承者们利用了现代语言设计的优势,使开发者能够迅速提高生产力。目前,Carbon编程语言正处于实验阶段。
在谈到为何要替代 C++ 时,Carruth表示,C++作为长期以来构建性能关键应用的首选语言,它自身的很多问题困扰着现代开发人员。C++积累了数十年的技术负债,带有的很多过时实践都是其前身C语言的一部分。C++ 的维护者优先考虑向后兼容,以便继续支持广泛使用的项目,例如Linux及其包管理生态系统等。
此外,C++语言的发展也受到了官僚委员会程序的阻碍,该程序以标准化而非设计为导向。这种做法导致很难添加新功能。C++在很大程度上处于一个隔绝的开发过程,其中可能经过数年才会做出一些重要决定。
因此,Carruth希望通过更开放的社区主导环境来构建Carbon语言,并已开源。目前,该项目已在GitHub上获得了16.5k的Stars。

但是,众所周知,C++ 是 C 语言的继承者,Kotlin 是 Java 的继承者,Swift 是 Objective-C 的继承者,而来自微软的 Type 彻底增强了 Java,同时保持舒适的使用并能够“转译”回 Java。那么,C++ 的继承者会是哪一个?Rust 或者是这个新出现的 Carbon?

或许很多人会选择 Rust 作为 C++ 的后继语言。不可否认,想要启动新项目,Rust 是一种很好的语言选择,但它不像 Java 和 Kotlin 那样具有“双向互操作性”,因此很难稳定地迁移。借用Conor Hoekstra 的说法,“如果 Rust 今天适合你的项目,你应该使用它。但是未来想要将 C++ 项目背后的整个生态系统迁移到 Rust 是困难的。”
为此,虽然 Carbon 有许多与 Rust 相同的目标,如帮助开发者创建“性能关键型软件”,但 Carbon 也打算与现有的 C++ 代码完全互通,并使从 C++ 迁移到 Carbon 尽可能容易。
为何不大力发展Rust语言呢?
有人或许会问了:最近有专门为解决内存安全性能应用的需求而构建的Rust语言,为何不直接使用它呢?Carruth对此表示,如果Rust适合你,就继续使用。但是,将C++的生态系统转移到Rust非常困难。
相比之下,Carbon是建立在已有C++生态系统之上,适合那些已经拥有大量C++代码库的开发人员,这些库很难转换到Rust。

取代 C++是Carbon 的使命
谷歌希望在2022年年底推出Carbon的核心工作版本,即v0.1。Carbon将建立在现代编程原则的基础上,包含一个泛型系统,使开发人员不再需要为每个实例检查和再核对代码。
C++ 语言中亟需的一个特性是内存安全。内存访问 bug是安全漏洞的罪魁祸首之一,Carbon 设计人员将探索追踪未初始化状态的更好方法、设计支持动态边界检查的 API和惯用语,并构建全面的默认debug构建模式。随着时间的推移,设计人员还计划构建一个安全的Carbon子集。
尽管 C++ 仍然是性能关键型软件的主流编程语言,拥有庞大且不断增长的代码库。但其易用性较差、掌握难度大、以及由于语言功能过于丰富而易导致混乱等特点,也经常被人诟病。由于积累了几十年的技术债务,企图逐步改进 C++ 是非常困难的,这既是由于技术债务本身,也是由于其进化过程中的挑战。解决这些问题的最好方法是避免直接继承 C 或 C++ 的“遗产”,而是从坚实的语言基础开始,如构建现代泛型系统、模块化的代码组织和一致、简单的语法。
正因如此,Carbon 应运而生,其目标如下:
1. 速度快,可与 C++ 一起使用
- 性能与使用LLVM的C++相匹配,具有对位和地址的低级访问
- 从“遗产”到模板,实现与现有的 C++ 代码互操作
- 快速和可扩展的构建,与现有的 C++ 构建系统一起工作
2. 现代化和并且能不断发展
- 坚实的语言基础,易于学习,特别是对于已经使用过 C++ 的人
- 简单的、基于工具的 Carbon 版本之间的升级
- 更安全的基本原理,以及逐步实现内存安全子集的途径
3. 打造受欢迎的开源社区
- 明确的目标和优先级,具有强大的管理能力
- 社区致力于成为一个欢迎、包容和友好的社区
- 包含“电池”的方法:编译器、库、文档、工具、包管理器等
尽管 Carbon 是在谷歌内部开始的,但该团队愿意将其开源,为的是使其在未来能够获得成功,Carbon 需要成为一个“独立的并且由社区驱动的项目",而不仅仅是为谷歌自用。
“学不动”的开发者们,依然期待
随着这门新语言的正式发布,不少开发者跃跃欲试,仅在 Hacker News(https:///item?id=32151609)上就引发 400 多名开发者关于该语言的探讨。
前排“课代表”对 Carbon 做了进一步的总结:
@cogman10:如果你像我一样,想知道 "是什么让 Carbon 与 Rust 或 Zig 不同?那我总结三点:
1. 能够与各种各样的代码互操作,如类/结构和模板,而不仅仅是自由函数。
2. 愿意将 C++ 的习性暴露在 Carbon 代码中,必要时也可以反过来,以使互操作层的性能最大化。
3. 使用包装器和通用编程,包括模板,以减少或消除运行时的开销。
换句话说,Carbon 可以做 Rust 不能做的事情,就是用一个'foo'方法调用一个 C++ 类。或者创建一个带有'foo'方法的类,然后从 C++ 中调用该方法。这可能是实现 C++ 相互操作中要克服的最大障碍之一。大多数人不会这样做,相反,你会做一个 C 函数绑定和结构,并通过它移动数据/调用函数。
另一名开发者指出了 Carbon 在安全方面可能存在的问题。
@ansible:总的来说,Carbon 在安全方面做出了妥协,以便为 C++ 的发展提供一条道路。C++ 开发者必须能够自如地迁移他们的代码库,并且能够以一种基本自动化的方式进行迁移。为了实现自动迁移,Carbon 不能要求对迁移的 C++ 代码进行根本性的重新设计。虽然迁移工具在理论上可以将所有被迁移的代码标记为不安全的,但 Carbon 应该使用一种安全策略,对 C++ 代码进行优雅地降解并提供改进,无论是否被迁移。
这并不意味着 Carbon 永远不会默认采用有保障的安全策略,只是 C++ 代码的性能和迁移需要优先考虑,任何设计都需要在其他目标的背景下考虑。以后仍有可能采用有保障的安全,尽管这需要确定一个迁移路径。
这是非常有趣和务实的。如果他们最终能通过与 Rust 的借用检查器不同的路径得出同样水平的安全保证,那就很有意思了。
无论如何,凭借Google在业内的影响力,几年之后,Carbon有望成为一种新的热门编程语言。
















