写点什么

对话 Steve Klabnik 和 Herb Sutter:Rust 和 C++

作者:Sergio De Simone

  • 2024-11-15
    北京
  • 本文字数:1976 字

    阅读完需:约 6 分钟

对话Steve Klabnik和Herb Sutter:Rust和C++

在 Kevin Ball 主持的《软件工程日报》(Software Engineering Daily )播客中,Steve Klabnik 和 Herb Sutter 讨论了几个与 Rust 和 C++ 相关的话题,其中包括这两种语言的共同点和独特之处、它们的不同之处、以及它们是如何演进的等等。

完美的语言并不存在


对于 Klabnik 来说,除了关于 Rust 是一种内存安全的语言的普遍观点之外,真正使其与众不同的是,它汲取了在最近的编程语言中虽并不流行但在编程语言领域广为人知的思想。


另一方面,Sutter 强调零负担抽象(Zero-Overhead Abstraction)的概念,即我们可以用更高层次的方式表达事物,而无需为抽象付出过高的成本。在这里,Klabnik 呼应了 Sutter 的观点,认为 Rust 实现“零成本”抽象的主要机制是通过类型:


[Klabnik] 基本上,在类型系统中可以表达的越多,在运行时需要检查的就越少。


但并非所有抽象都是零负担的,Sutter 表示,他举了两个 C++ 特性的例子,编译器总是提供禁用这两个特性的选项:异常处理和运行时类型。


[Sutter] 如果你仔细查看原因,那是因为这两个特性可以更好地手工编写。或者,即使你不使用它们,你也要为它们付费。


因此,这就引出了这样一种观点,即语言设计同样是一门艺术或一种工艺,深受品味和语言应该是什么的哲学的影响,所以我们还没有达到一种语言可以成为完美语言的地步。

适用范围


谈到语言的使用方式,Sutter 说,它们有一个非常相似的目标,生态系统成熟度和线程安全保证可能会导致选择一种而不是另一种。Klabnik 强调,Rust 经常被用来创建网络服务,即使是在大型公司也是如此:


[Klabnik] 例如,Cloudflare 正在使用 Rust 代码作为后端。它们为 10% 的互联网流量提供支持。其他公司 […] 用 Python 编写的一些东西,然后用 Rust 重写它们。最后他们就能够从云账单中省去数千台服务器的费用。


Sutter 强调了 C++ 可以让我们控制时间和空间的能力,以及围绕 C++ 构建了 30 多年的工具生态系统的丰富性,而 Rust 相对来说仍然是一门年轻的语言。


[Sutter] 现在,在某些情况下,除非通过这类工具,否则我无法将代码发布出去。它理解 C++,但不理解 Rust。我无法发布该代码。如果我用 Rust 编写,则不允许在没有 VP 异常的情况下发布它。

语言如何演进


当谈到语言演进时,关键点在于什么时候值得为一个新特性增加语言的复杂性,这并不总是一个容易做的决定。在这方面,Klabnik 称赞 C++ 的一点是它致力于“在合理范围内”实现向后兼容。


[Klabnik] 我并不是说 Rust 团队在总体上没有类似的观点。但最近有一些关于某些事情的提议增加了一定程度的复杂性,我个人对此并不满意。


Sutter 提到 C# 团队在某种程度上决定在语言中添加可空性,尽管这肯定是一件好事,但它也带来了隐性的成本:


[Sutter] 因为现在用户和语言都很复杂,甚至未来 20 年也会如此。因为我们会永远支持这件事,对吧?它将永远限制演进。[…] 事实证明,一旦你添加了可空性 […],整个语言需要我们更多地理解它,会比我们最初想象的要多得多。


为了进一步强调做出此类决定有多困难,Klabnik 回忆了一个案例,他对 Rust 的 wait 的后缀语法进行的抗争,这与大多数其他语言的前缀语法不同:


[Klabnik] 现在我用 async 和 wait 编写了很多代码,天哪,我很高兴他们选择了后缀 wait。因为它在很多方面都非常好。

语言版本的力量


Rust Core 团队管理变更的一种方法是定义语言版本,以便在添加新功能时保持源代码的兼容性。


Sutter 表示自己有兴趣了解这种机制是否可以引入到 C++ 中以支持 async/await ,而无需采用 co_asyncco_await 关键字来防止与现有代码库发生冲突。Klabnik 解释说,版本是一种添加新语法的强大机制,但它们也有局限性:


[Klabnik] 将 mute 更改为 unique 作为纯粹的语法变更是绝对可行的。因为最终发生的事情是,当它为 2015 编译一个包,为 2024 编译另一个包,并且在 2024 中添加了 unique 或其他什么时,它会脱糖到相同的内部 [表示… 但] 你不能在版本中添加 GC,因为这会在更深层次上真正改变事情的运作方式。


类似地,Rust 标准库是一个唯一的二进制文件,因此我们必须确保它包含了所有版本中使用的所有函数。


Klabnik 和 Sutter 在播客中谈论的内容和细节比我们在此总结的要多得多。其中还包括 C++ 标准化过程对 C++ 的重要性;Rust 社区是否会对 ISO 标准语言感兴趣;Rust 拥有多个编译器而不是只有一个编译器的原因和影响;如何处理合规问题;以及在大学里教授 C++ 或 Rust 等语言的价值。如果你有兴趣了解更多信息,请不要错过完整的播客内容。

作者介绍

Sergio De Simone 是一名拥有超过 25 年工作经验的软件工程师。他曾在包括西门子、惠普和小型初创公司等不同的工作环境工作过。在过去的十多年里,他一直专注于移动平台和相关技术的开发。他目前在 BigML, Inc. 工作,负责 iOS 和 macOS 的开发。


查看原文链接:

https://www.infoq.com/news/2024/10/klabnik-sutter-on-cpp-rust/

2024-11-15 08:0310011

评论

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

线性排序

wzh

Java 排序算法 计数排序 基数排序 桶排序

【21-15】PowerShell条件判断

耳东@Erdong

PowerShell 6月日更

在线PS(PhotoShop),打开PSD文件,图像处理

入门小站

PhotoShop ps

网络抓包实战01——互联⽹:客户端请求是如何到达服务器的

青春不可负,生活不可欺

Wireshark TCP/IP tcpdump 网络抓包 tcpcopy

详解Java中static关键字和final关键字的功能

华为云开发者联盟

Java static关键字 final关键字 静态变量

react源码解析18事件系统

全栈潇晨

React

软件复杂度

海拉鲁

读书笔记 软件工程 软件设计

JAVA 面向对象 (十)--接口和抽象类

加百利

Java 后端 笔记 6月日更

GO database/sql 连接池源码分析

非晓为骁

源码分析 Go 语言 连接池 database

云小课|RDS实例连接又失败?看我祭出杀手锏!

华为云开发者联盟

数据库 关系型数据库 云数据库 RDS GaussDB(for MySQL)

在云原生场景下构建企业级存储方案

青云技术社区

云原生

Python——默认字典 (defaultdict)

在即

6月日更

做好项目管理,项目经理需要具备哪些优秀品质?

万事ONES

项目管理 研发管理 研发管理工具 ONES

Java进阶 | 泛型机制与反射原理

晨雨听风

Java

文件保险箱——用区块链保护文件

趣链科技

区块链 区块链应用

Linux之rmdir命令

入门小站

Linux

Elastic Job简单使用

赵镇

Elastic-job

OpenCV-Python+Moviepy结合进行视频特效处理

老猿Python

Python 音视频 Video PPT 引航计划

容器化 | MySQL on K8s 开源开放的高可用容器编排方案

RadonDB

MySQL 容器 RadonDB KubeSphere

有状态应用如何在Kubernetes平台上快速迁移和重建

焱融科技

云计算 Kubernetes 容器 云原生 高性能

极狐GitLab致力打造DevSecOps 行业标准

极狐GitLab

ci 修复措施 安全扫描器 安全测试

技术干货 | macOS桌面端录屏采集实现教程

ZEGO即构

大前端 音视频 WebRTC 屏幕录制

Redis:我是如何与客户端进行通信的

码农参上

redis Redis 协议

“AI赋能”大学计划落地,英特尔联合生态伙伴推进产教融合

E科讯

在线HTML标签清除工具

入门小站

工具

软件开发项目中,产品经理和程序员谁更累?

万事ONES

产品经理 研发管理 ONES 项目经理

迷惘的六月份

卢卡多多

生活状态 6月日更

一次性搞清Java中的类加载问题

华为云开发者联盟

Java

不管卷不卷,面试还是得问问你G1原理!

艾小仙

Java 编程 程序员

分布式数据库在抖音春晚活动中的应用

火山引擎开发者社区

数据库 后端

对话Steve Klabnik和Herb Sutter:Rust和C++_编程语言_InfoQ精选文章