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 Circle
class Printer(template t:! Type)
fn Draw()
interface Shape
let 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。
☞科大讯飞回应薪酬回溯制度;OpenAI 宣布开放 API,可将 ChatGPT 集成到自己的产品;Godot 4.0 发布|极客头条
☞离职两年后,程序员遭前东家索赔:Bug 是你写的
☞ChatGPT API 低价上线,网友:用上 import openai,能开一家创业公司!
Google 后开发的 Carbon 真的会取代 C++ 吗?相关推荐
- 微信打开时支持消息通知横幅引热议;Google和甲骨文的云服务因英国高温天气而下线;谷歌发布开源开发语言Carbon|极客头条
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...
- php会不会被人工智能取代,人工智能真的会取代前端开发吗?
原标题:人工智能真的会取代前端开发吗? 相信不少人看过一篇人工智能已经能实现自动编写HTML,CSS的文章,人工智能开始取代前端的一部分工作.消息一出便激起了很多前端工程师的恐慌和讨论,很多刚刚准备学 ...
- Google Android开发入门与实战
Google Android开发入门与实战 [作 者]靳岩;姚尚朗 [同作者作品] [作译者介绍] [出 版 社] 人民邮电出版社 [书 号] 9787115209306 [上架时间] 2 ...
- Google Android开发入门与实战(china-pub首发免运费)
Google Android开发入门与实战(china-pub到货首发免运费) [作 者]靳岩;姚尚朗 [同作者作品] [作译者介绍] [出 版 社] 人民邮电出版社 [书 号] 97871 ...
- 【转】敏捷开发,你真的做对了吗?
缘起 2017年3月,应移动事业群智能营销平台项目管理部负责人邀请,我开始支持智能营销平台CRM团队.智能营销平台是阿里文娱广告团队,是阿里巴巴淘外变现的主力军.CRM团队负责开发和维护CRM系统.C ...
- Google Protobuf 开发指南
为什么80%的码农都做不了架构师?>>> Google Protobuf开发指南 1.简介 l 它是开源项目:http://code.google.com/p/protobu ...
- 健身泡沫轴可以带上高铁吗_每次训练结束后用泡沫轴真的好吗?如果想节约时间就这样做!...
大家好,今天我们来看下泡沫轴与训练后的恢复,很多人都会在训练开始前,或者是结束之后,用泡沫轴进行放松,并且让肌肉得到一些放松,那么每次训练结束后用泡沫轴真的好吗?想节约时间就这样做! 首先要注意的是, ...
- Google VR开发-Cardboard VR SDK头部追踪实现(罗德里格旋转公式)
一.罗德里格旋转公式 可以参考百度百科和维基百科进行了解. 概括来说就是罗德里格旋转公式就是用来求旋转后新向量的公式: 而这个公式可以转换成矩阵形式: 公式各部分的几何意义和推导原理参考下图 这个图证 ...
- Android Google Map 开发指南(一)解决官方demo显示空白只展示google logo问题
这两天一直在做google map接入前的准备工作 特此在这里将自己在加载官方demo时出现的问题以及详细的接入步骤进行记录,已免后者踩坑 注:项目实际运行时不要使用虚拟机 因为电脑ip和虚拟机ip不 ...
最新文章
- linux学 java_[操作系统]Linux学习第二步(Java环境安装)
- 《城市大脑全球标准研究报告》发布会将于12月23号在北京举办
- Mysql数据库中修改库名的的方法
- 浅谈构建 apache 2 虚拟主机[zt]
- 作者:周涛,男,电子科技大学教授。
- ubuntu cheat sheet 目录结构
- 奇点汽车黄浴:SLAM的动态地图和语义问题
- 遇到了arcgis server9.1 在web开发的问题
- ERROR Request failed with status code 404 :at createError (node_modules\axios\lib\core\createError.
- 什么录播软件好用?超级好用的录屏软件在这里
- 城市统计年鉴数据查询
- 2021-2027全球与中国DJ设备市场现状及未来发展趋势
- 两台计算机如何打印机共享打印机,两台计算机如何共享一个打印机?
- 语音信号处理1 ----- 基础知识
- stm32无源蜂鸣器定时器_STM32与无源蜂鸣器
- Linux python + selenium 以 kiosk模式打开Chrome浏览器 并 支持下载文件时询问下载路径
- 【文献阅读】StyleBERT: Chinese pretraining by font style information
- 51单片机三线串行驱动12864液晶
- 西安交大计算机考研软件工程编程题库(二十四)
- altium designer原理图生成pcb
热门文章
- 黑客很酷?手把手教你用Python做一个
- 799. 香槟塔 : 简单线性 DP 运用题
- Android的识花软件推荐,识花App有哪些 形色app好不好用【详解】
- 查看gym中的内置游戏环境
- 解决方案PPT的编写框架
- 与电影相关的100个英文词汇
- P3467 [POI2008]PLA-Postering
- MyEclipse,Servlet使用@WebServlet() 报import javax.servlet.annotation.WebServlet;错误
- java radiogroup_RadioGroup实现单选并获得所选项值
- 函数式编程在JavaScript下应用实践