Google 后开发的 Carbon 真的会取代 C++ 吗?

【CSDN 编者按】Carbon 真的能成为 C++ 的替代品吗?目前我们只能猜测,但请不要忘记 Swift 或 Kotlin 等语言的诞生。

原文链接:https://semaphoreci.com/blog/carbon

未经授权,禁止转载!


作者 | Manuel Rubio 译者 | 弯月
出品 | CSDN(ID:CSDNnews)

2022 年的 CppNorth 大会上,Chandler Carruth 发表了一项主题演讲,标题是:Carbon Language: An experimental successor to C++,其中提到了一门名为“Carbon”的全新开源开发语言,号称是 C++ 的继承者。

但是,为什么我们需要 C++ 的继承者?这个想法从何而来?

在 2019 年 CppCon 大会的最后一天,Chandler Carruth 和 Titus Winters 发表了一项惊人的演讲,他们讨论了什么是 C++?我认为,该演讲传达的一个最有趣的想法是,“语言是工具,我们必须使用正确的工具来完成工作。”

在谈话的最后,他们提出了不同的建议,旨在解决 C++ 开发人员面临的一些常见问题,这些建议包括:


我们可以改进 C++ 或使用其他语言吗?


在2022年的 CppNorth大会上,Carruth 为我们提供了这方面的信息。他首先提到了上一次演讲的建议,并讨论了为什么 C++ 无法实现这些它们。主要问题在于,C++ 积累了几十年的技术债务,在此期间社区优先考虑的是向后兼容性,因此未能修复技术债务。

那么,是否可以利用现有的一种语言来代替 C++?使用垃圾回收的语言很棒,但我们不会考虑它们,因为这些语言会付出性能的成本,而且大多数 C++ 开发人员认为他们不想在这方面让步。

Rust 编程语言是一个不错的选择,因为它是内存安全的,并且非常适合作为低级语言的替代品,但请看下面的替代关系,Rust 实际上无法替代 C++:

Rust 是一门运行良好的语言,如果你准备开发一个新项目,那么非常推荐。但如果你需要将 C++ 生态系统连同各种深层次的依赖都迁移到 Rust,那将会是一项非常艰巨的任务。我们不推荐这种做法。

我们需要的是一位“继承者”。这里的“继承者”指的是在现有生态系统中构建的语言,无需建立新语言,它可以提供互操作性,而且学习和采用也很方便,理想情况下,所有的辅助工具也可以继续提供支持。从本质上来说,“继承者”是其父辈语言的超集。


Carbon 编程语言是什么?

在讨论了C++的问题后,Carruth 提出了一个问题:下一步该怎么办?在讨论了为什么我们不能改进 C++,为什么我们不能使用 Go 语言或其他垃圾收集语言,以及我们不能使用 Rust 语言(或其他低级语言)后,Carruth 认为我们需要为 C++ 创建一门“继承者”:Carbon。

Carbon 采纳了改进 C++ 的建议,并将其融入了语言的设计目标,同时他们还照顾到了一个新的关键性目标,也是最重要的一个目标:与现有 C++ 代码的互操作性和迁移。

根据官网的信息,Carbon 语言的创建理由如下:

“从根本上说,Carbon 是一种后继语言,而不是尝试逐步发展C++。Carbon 将围绕与 C++ 的互操作性以及现有 C++ 代码库和开发人员的大规模采用和迁移而设计。[...] 通过这种方法,我们可以在 C++ 现有生态系统的基础上构建软件,并继续支持现有的投资、代码库和开发人员群体。”


Go 或 Dart 会消失吗?

Carruth 是谷歌编程语言与软件基础技术主管,而且 Carbon 语言这项计划始于谷歌,所以人们担心 Golang 甚至 Dart 的支持可能会减弱。然而,谷歌是一家大公司,他们需要通过不同的平台和不同的项目开发软件。这意味着,他们需要不同的语言来处理不同的工作。

谷歌的生产环境使用 Go 来提供一些服务(dl.google.com 的下载服务器),但正如 Carruth 所说,大型 C++ 项目的迁移非常困难,而且无法完成。

Dart 是一种建立在JavaScript 和其他语言之上的语言,其使命是成为 Flutter 项目的主要语言,解决跨平台创建应用程序的问题。由于 Flutter 不支持 C++,因此 Carbon 在这种环境下基本没有任何用处,因此 Dart 语言不会受到影响。


如何使用这种新语言?

在 2022年 的 Core C++ 会议期间,Jon Ross-Perkins(谷歌的资深软件工程师,拥有两年 Carbon 语言的经验)谈到了 Carbon 语言的语法和权衡弊端。

首先,他强调了目前这个项目仍处于实验阶段,但我想通过工具初步窥探一下这个生态系统。Ross-Perking 提到了该项目的下列工具:

关于编写代码,保持开发的上下文不变很重要,但是,我们需要保留那么多信息吗?为了简化上下文,Carbon 提供了特定的保留字,这样工具的使用会更容易,代码的可读性也更高。这些保留字包括:

示例如下:

var radius: Printer(Circle);class Circleclass Printer(template t:! Type)fn Draw()interface Shapelet Pi: f32

我认为,我们可以直接看看语法的细节以及代码示例。但在浏览代码之前,我需要说明该语言目前仍处于实验阶段,并且与大多数实验一样,它可能会逐步发展起来,也有可能会消失。但就目前的情况来看,这是一个很有希望的项目。

关于语法,由于第一版还没有正式发布,所以将来实际的代码可能会与这里有所出入。如果你想看看该语言最新的发展,可以查看设计文档https://github.com/carbon-language/carbon-lang/blob/trunk/docs/design/README.md),其中包含设计人员和开发人员贡献的建议和变更。

import Math;// Returns the smallest factor of `n` > 1, and// whether `n` itself is prime.fn SmallestFactor(n: i32) -> (i32, bool) { let limit: i32 = Math.Sqrt(n) as i32; var i: i32 = 2; while (i <= limit) { let remainder: i32 = n % i; if (remainder == 0) { Carbon.Print("{0} is a factor of {1}", i, n); return (i, false); } if (i == 2) { i = 3; } else { // Skip even numbers once we get past `2`. i += 2; } } return (n, true);}

以上代码使用了两个不同的函数。看来 Carbon 包中的函数是默认导入的,而 Math 包需要导入才能使用。

我们还使用了两个常量(let)。第一个limit是整个函数的常量,而第二个remainder是 while 循环范围内的常量,每次迭代都会创建并绑定一个值。常量limit还声明了一个不同于 Math.sqrt 函数返回的类型,但它利用 as i32 进行了转换。

我们看到 return 中定义了一个元组。基于这种技术,函数将返回两个值,而不是一个值。Python、Erlang 或 Elixir 等语言也使用了这种数据类型。这样,我们就可以不同情况下处理一组值。


展望未来

目前 Carbon 还是一个实验性项目,但你可以查看它的线路图,了解近期的进展。通过前面所说的文档,我们可以看到 Carbon 的预期发布时间(停止实验)原定于 2023 年,后来变成了 2024 年,如今又推出到了2025~2026 年。然而,我们可以看到 Carbon 正在快速发展,而且没有停止。

Carbon 真的能成为 C++ 的替代品吗?目前我们只能猜测,但请不要忘记 Swift 或 Kotlin 等语言的诞生。在文本开头,我们列举了有关C++的多项建议,相信大多数想要解决这些问题的大公司都会接受并采用 Carbon。

展开阅读全文

页面更新:2024-03-12

标签:都会   继承者   可能会   常量   函数   语言   代码   建议   工具   项目

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top