2

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

 1 year ago
source link: https://www.techug.com/post/will-carbon-developed-after-google-really-replace-c-plus120d30de3335fdc0ec28/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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++ 是几十年前编写的,语言设计者也会犯错,我们应该根据当前大多数语言的变化来改进和升级 C++——但是,社区中总是有人反对改变。

  • 简单且易于阅读、理解和编写。我认为 John Carmack 的这句话总结得很好:“原始C语言的一大优点是,大多数高级开发人员都有能力编写自己的 C 编译器,而了解自己所用的工具是非常有价值的。但如果是C++编译器的话,我就需要大量的时间来学习编写。”

  • 安全与测试。更安全的 API、廉价的安全缓解措施以及使用持续集成单元和集成测试的综合测试方法。所有不受信任的输入都会持续进行模糊测试,所有测试都使用检查构建模式(sanitizer、断言等)。

  • 快速且可扩展的开发,本质上就是模块。

  • 硬件、操作系统、环境。定义我们承诺支持的内容,并以可预见的方式持续推进。我们不会有意去破坏已有 20 年历史的平台,但我们也不会继续支持。

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

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

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

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

  • C –> C++

  • JavaScript –> TypeScript

  • Objective C –> Swift

  • Java –> Kotlin

  • C++ –> Rust?

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 提到了该项目的下列工具:

  • 编译器。无需多说,代码的编译非常重要。

  • 格式化程序。正确地格式化代码。

  • 语言的自动升级。从比格式化程序更高的层次上整理我们的代码。

  • IDE 和 LSP 支持。

  • 重构支持。

  • 包管理器。

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

  • var:用于声明变量。

  • class:用于定义类。

  • fn:用于定义函数。

  • interface :用于定义接口。

  • let:用于声明常量。

示例如下:

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。

本文文字及图片出自 CSDN


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK