编程语言之争:Rust 社区活跃开发者 Ed Page 谈 Rust 与 C++ 的未来

2024-09-05 20:28

本文主要是介绍编程语言之争:Rust 社区活跃开发者 Ed Page 谈 Rust 与 C++ 的未来,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

图片

作者 | Annie Xu

采访 | CSDN&Boolan 首席顾问 卢威

责编 | 何苗

出品丨GOSIM 开源创新汇

你最 pick 哪种编程语言?C++、Rust,还是 Python?

Ed Page 从事编程行业十几年,见证了不同编程语言的兴衰史。从 C++标准版本 C++98 的诞生,到 Jave、D、Go 等编程语言的崛起与发展,并跃跃欲试想挑战 C++ 的江湖地位。

诚然,新出现的编程语言分走了 C++的部分用户,但在 Ed 看来,它们都不具备 C++的核心优势。Rust 的出现,让 Ed 看到了它在部分场景下取代 C++的一丝曙光,于是他全身心投入 Rust 和 Cargo 的功能构建与社区维护。

编程语言之争:Rust 社区活跃开发者 Ed Page 谈 Rust 与 C++ 的未来

曾是 C++、Rust 和 Python 的使用者,Ed 为什么唯独看好 Rust?

他也是 AI 时代的逆行者,拒绝使用 AI 生成代码,甚至不使用任何代码辅助工具。CSDN&Boolan 首席顾问卢威主持本期 GOSIM 独家对话栏目 Open AGI Forum,对话 Futurewei 软件开发者 Ed Page,分享他对 Rust 编程语言发展与 Cargo 社区运营与功能开发方面的看法

  • 不同的编程语言有其优势,也有其缺点,现在暂时还没有一种语言完美到解决所有问题。

  • 不要花费太多时间去优化细节,而忽视了“这是否重要”。

  • 大胆地复制代码,通过大量学习填补知识空白,之后思考如何优化加速。

以下是本次采访的主要内容:

图片

C++、Rust 还是 Python?

GOSIM:大家好,欢迎来到 Open AGI Forum。我们非常荣幸地邀请到了 Ed Page,请向观众简要介绍一下自己。

Ed Page我从事软件开发已经有几十年了。最初是一名 C++程序员,负责操作系统、驱动程序开发。随着职业发展,我逐渐转向开发者体验、工具构建等方面的工作。现在,我全身心投入 Rust 社区,致力于改善用户体验。同时我还服务于 Cargo 团队,更新生态系统中的软件包。

GOSIM:为什么在做了多年的 C++程序员后,转向 Rust 呢?之前积累的经验对现在有什么影响?

Ed Page:在 C++ 98 标准版本出现之前,我就已经在用 C++ 了。这几十年,我也见证了很多编程语言的兴亡史。期间出现了很多传言,如“Java 将会取代 C++”“D 语言将会取代 C++”“Go 语言将取代 C++”……

每一种新的编程语言的出现,都会带走一部分 C++的用户,但始终没有哪个编程语言能真正动摇 C++的核心优势。C++存在问题,圈内有一句话是“C++ is bad,but so is everything else”,大意是“C++有缺点,但没有更好的选择了”。

第一次接触到 Rust 时,我觉得它很有趣。Rust 语言解决了一些其他语言没能解决的关键问题,填补了操作系统和嵌入式空间中尚未得到充分服务的部分。所以,我想尽我所能推动 Rust 成功,也许未来有一天它可以替代 C++ 成为这类应用场景的主要语言

GOSIM:在接触 Rust 之前,你曾使用过 C++ 和 Python,请比较一下这三种编程语言。

Ed Page:现在暂时还没有一种语言完美到解决所有问题。C++的功能很强大,它支持泛型特化,而 Rust 目前并不支持。当你在 Rust 中使用泛型参数时,你需要指定其所适用类型的的所有特征。因此,C++中的泛型模型不能保证适用于所有类型,而 Rust 能保证泛型的可持续构建,类型可接受就能良好运行。

我很喜欢 Python 的干净整洁,有时候在 Python 中编写的代码像是伪代码。但我对 Python 工具的分散和无序感到失望,XKCD 漫画中也有吐槽这一点的。Cargo Script 正在朝这个方向努力。我想:如果我们有一个标准库的替代品,隐藏掉很多低级别的细节,会不会更好?

我们也试图优化 Rust 的编辑布局,让开发者感觉是在 Python 中编写一样流畅。这样还能享受到 Python 的一些好处,比如快速组合代码、原型化、编译和构建等等。有时候,不用声明类型十分方便。但由于 Python 缺乏静态类型,有时会引发一些错误。我们尝试让 Rust 吸收 C++、Python 的优势。

图片

Rust 的维护挑战与 Cargo 团队协作

GOSIM:作为 Rust 的关键工具如 Clap 库和 Cargo 包管理器的维护者,你曾遇到最大的挑战是什么?

Ed Page:时间是最大的挑战之一。起初我只是在业余时间进行 Rust 的维护,但随着家庭事务的增多,我的业余时间变少了。在加入 Futurewei 之前,我并没有太多时间进行维护。即使有时间,需要解决掉问题的也很多,远不是一两天就能搞定的。我的一个待办事项中列出了亟待解决的问题,可能需要超过一年的时间才能完成。另一个挑战是弄清楚哪个问题应该优先考虑,以及何时说“不”

GOSIM:你做过的哪些改进功能令你特别自豪?

Ed Page:我对 Cargo 的第一个重大贡献是给 Cargo 添加了“add”功能。在此之前,我并没有使用过这个功能,认为没有必要仅仅为了添加依赖项而去安装一个第三方工具。虽然不是我编写的初始功能,但是我负责把它加入到 Cargo 进行运行的。在进行了一些调整和改进后,它大大提升了 Cargo 的使用体验。

GOSIM:作为 Cargo 团队的一员,你的主要职责是什么?你与其他团队成员是如何开展合作的?

Ed Page:Cargo 团队的情况很容易让人误解。人们可能以为“他们需要 Cargo 团队去做某件事,Cargo 团队就会去执行”,或者“Cargo 团队的负责人就是团队的唯一决策者”。实际上并非如此,Cargo 团队可以决定 Cargo 中包含哪些功能。

Cargo 团队也可以帮助人们完善设计,使其达到 Cargo 团队的标准。有时我们会参与功能设计,但我们不可能帮助每个人做全部内容。我们工作的重点在于决策制定和长期维护。

GOSIM:再次回到协作的话题,是否有具体的例子可以分享一下你们如何与其他团队成员进行合作?

Ed Page:我们共同讨论了 Cargo 的设计方案。例如,Rust 和 C++可以为用户提供错误提示和长度检查的功能,而我们无法提供这样的提示信息。因此,目前正在开发这项功能。

随着 Cargo 的发展,我们会根据人们的需求拓展 Cargo 的功能。我和团队的另一位成员 Scott 合作进行了大量的工作。合作提高了效率,更方便我们进行开发。

图片

重点改进依赖项处理与兼容问题

GOSIM:Cargo 还将推出哪些令人期待的功能呢?

Ed Page:即将推出的是 MSRV-aware 解析器。它为项目支持最低的 Rust 版本,确保选择的依赖项与你声明的 Rust 版本兼容,对企业来说非常重要。我们每六周会进行一次升级以保证 Rust 的质量和兼容性。

但是,有些企业更新前需要进行不同的验证,有些只能抽空进行升级维护,他们就无法及时进行更新。为了方便这些企业在使用旧版本 Rust 时也能找到兼容的依赖项,我们也改进了相关功能。

我开发的另一项功能是 Cargo Script,它允许 Rust 文件中直接包含依赖项,而不必单独使用一个 Cargo.toml 文件。这使得快速搭建实验变得非常容易。当你创建一个 issue 并在 GitHub 上提交时,它包含其他用户想要复现该 issue 所需的一切内容。如果你想与同事交流这个项目,也可以发送给他完整的文件,可以方便地进行原型设计、实验和工作进度分享。

GOSIM:你认为 Rust 需要进行哪些重点改进以提供更好的服务?

Ed Page:首先,我刚才提到的 MSRV-aware resolver 将大大减轻人们的负担。最近,我和技术人员沟通时,他们表示 CTO 对其处理旧依赖项的工作效率感到不满。对所有员工来说,处理旧的依赖关系占用了很多时间。

第二,时间构建。时间十分重要,需要有人专门负责时间,从而更好地优化 Cargo 的缓存机制,提高构建速度。

第三,供应链管理。我们正在开展软件物料清单相关的工作。除此之外,还有一些其他工作需要解决,比如更好地跟踪代码中的漏洞报告,更好地了解依赖项的变化,以及如何更好地查看你的依赖项。

图片

AI or not?

GOSIM:你是否尝试过使用 Copilot 或 ChatGPT 来生成 Rust 代码?

Ed Page:事实上,我没有使用过任何 AI 工具,或者类似的代码辅助工具。我甚至不使用语言集成查询(Language Server Protocol),如 Rust Analyzer。有一次我不小心启用了它,随后我想立刻把它从我的文本编辑器中删掉。

GOSIM:我问这个问题的原因是,Python 几乎是大语言模型的母语,但大模型对于 C++ 和其他语言的支持相对较低。在 CSDN,我们正在进行一些工作试图提高大语言模型在 C++ 上的性能。

Ed Page:我不太清楚这些模型的细节,也不太了解 AI 和机器学习。但我猜测可能是 Python 对属性信息的规定更严格,所以可以更好地用 Python 来生成代码建议。

GOSIM:不同语言在大型语言模型中的表现存在差异,应该做点儿什么让不同语言在 AI 领域更公平。最后一个问题,对于有兴趣在 Rust 中创建或维护开发工具的开发者,你有什么建议?对于新加入 Rust 生态的开发者来说,有哪些注意事项?

Ed Page:不要过分担心细节Rust 提供了低级控制功能,不要花太多时间试图优化每一个细节,而忽略了它是否真的重要。这样只会造成时间浪费,事情却没有真正完成。我认识的一个人的一件衬衫上面写着“keep calm and clone”。

不要担心把所有东西都借用过来,尤其是当你只是想做一个 CLI,或者你刚刚学会一些内容,只需要让代码工作完成你想做的事情,随后通过专业书籍搞明白,找出如何让它更快的方法,然后再去担忧它是否运行。大多数情况下,你可能根本不会在意自己做了哪些克隆。 

GOSIM:感谢 Ed 的精彩见解和讨论,感谢所有观看的开发者们。本次的访谈就到这里,下次再见。

图片

推荐阅读

海内外开源大咖齐聚,GOSIM China 2024 盛大开启

可集成多模型的机器人开发框架 dora:让机器人编程走向大众

GitHub 斩获近 20,000 Star,创始人揭秘跨平台自动化 APP 开发 | Open AGI Forum

这篇关于编程语言之争:Rust 社区活跃开发者 Ed Page 谈 Rust 与 C++ 的未来的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139981

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域