CodeWisdom
“智能化软件开发沙龙是由CodeWisdom团队组织的围绕智能化软件开发、数据驱动的软件开发质量与效能分析、云原生与智能化运维等相关话题开展的线上沙龙,通过微信群访谈交流等线上交流方式将学术界与工业界专家学者汇聚起来,共同分享前沿研究进展与业界实践,共同探讨未来技术发展方向。”
Rus t语言与系统及生态发展
智能化软件开发微访谈·第三十二期
背景介绍
Rust语言作为一种注重内存安全、并发性能强大的系统编程语言已经受到了广泛的关注,并在系统编程、Web开发、嵌入式开发、人工智能等领域得到越来越多的应用。当前Rust语言国际开源社区与软件生态快速发展,但作为一种新生代语言还没有在国内得到广泛的了解和接受,同时在技术和生态发展上还有很多挑战和机遇。
为此,本次微访谈邀请了多位来自学术界和产业界的专家围绕Rust语言与系统及生态发展进行研讨,介绍Rust语言的发展历史及其各种特点、分析Rust语言的优势及其应用领域、分享Rust语言的最佳实践、探讨Rust生态发展的现状及问题,在此基础上展望未来的发展方向。
主持人
彭鑫
复旦大学计算机科学技术学院副院长、教授
嘉宾
陈渝
清华大学计算机系长聘副教授
张伟
北京大学计算机学院副教授
韩文弢
清华大学计算机科学与技术系讲师,党委副书记
向勇
清华大学计算机系副研究员
徐辉
复旦大学计算机科学技术学院副教授
冯洋
南京大学计算机科学与技术助理研究员
马全一
华为2012 实验室下属开源管理中心
田洪亮
蚂蚁技术研究院操作系统(OS)方向负责人
戴钎
vivo系统架构专家
张汉东
资深独立咨询师,Rust 专家级顾问
蓝登峰
开放原子开源基金会资深顾问
访谈主题
Rust语言与系统及生态发展
01
Rust语言是如何提出并一步步发展起来的?Rust语言有什么特点,适用于什么样的软件开发项目?Rust语言在软件开发特别是系统软件开发中有哪些独特的优势,同时又有哪些缺点?
02
如何评估Rust语言在特定项目中的适用性?Rust语言在构建高性能系统软件方面的潜力和挑战是什么?Rust在嵌入式系统、操作系统等底层软件开发中的应用前景如何?Rust语言的应用对软件工程实践带来了哪些变化?在大型软件开发项目中应用Rust语言有哪些最佳实践?
03
当前Rust语言在开发库、框架、工具等方面的生态建设现状如何,存在哪些挑战?在构建可持续发展的Rust生态系统方面还存在哪些关键的缺失或不足?
04
如何通过教育和推广帮助更多的人了解和使用Rust语言并参与到Rust软件生态建设中?在当前的大学教育中是否适合引入Rust语言教育,有哪些实践经验?如何在开源社区推广Rust语言和基于Rust语言的项目?如何能积极参与到Rust相关的国际交流与国际社区中去?
05
展望未来,Rust语言将会往什么样的方向发展,有望在哪些领域取得突破?对于Rust语言与系统及其生态未来的发展有哪些建议?
Q&A记录
Question 1
**主持人:**Rust语言是如何提出并一步步发展起来的?Rust语言有什么特点,适用于什么样的软件开发项目?Rust语言在软件开发特别是系统软件开发中有哪些独特的优势,同时又有哪些缺点?
陈渝:
Rust语言的发展历程、特点和应用场是一个很有趣的话题,2006年,由在Mozilla的Graydon Hoare基于个人兴趣创立了Rust语言,并逐步以开源社区的形式发展,并通过基金会得到了各大公司的支持。
如果说Rust语言的一个特点,那就是“安全”。Rust语言适合于对安全和性能都非常重视的系统软件场景。其优点是安全和高性能,缺点是学习曲线陡峭,编译速度较慢,不适合快速原型开发。
张伟:
Rust最初源于Mozilla员工Graydon Hoare在2006年开始的一个私人项目;2009年,Mozilla开始赞助这个项目,并成立了专门的开发团队;2010年,该项目对外公开;2011年,实现了编译器的自我编译;2015年,Rust 1.0发布;2021年8月,Rust 基金会成立,首批5个金主公司 AWS、Huawei、Google、Microsoft、Mozilla。
Rust的特点很多,如果用一句话来讲,可以这样描述:“Rust初见是一个美丽的花园,但走过交叉小径,却有一片unsafe的黑暗区域”(这是北大的一名本科生在今年《Rust程序设计》课程期终考试试卷上写下的一句话)。对这句话的一种解释是,Rust语言实际上可以理解为两种语言:冰山之上的语言,晶莹剔透,非常好看;冰山之下的语言,与C语言没有本质上的差别,灵活、不安全、责任自负。
一般编程语言程序中的值在内存中表现为一种具有复杂引用关系的网络,可分析性差。Rust程序中值在内存中表现为一种由所有权关系形成的树:从图转变为树,丢失了很多的灵活性,但带来了程序在编译时刻的可分析性;“transferring the pain of understanding your program from the future to the present”。
观点讨论
@彭鑫:@张伟 这段理解很有意思,看来RUST也有AB两面。
@彭鑫:各位嘉宾如何看张伟老师提到的北大学生的这段理解:“Rust初见是一个美丽的花园,但走过交叉小径,却有一片unsafe的黑暗区域”。
@田洪亮:@彭鑫 北大的同学就是浪漫。
@陈渝:@田洪亮 清华学生为了用Rust写OS实验,不得不经常在黑暗中探索
@张汉东:@彭鑫 我的看法是,unsafe 和 safe 是相辅相成的, safe 是从 unsafe 中抽象而成的。
@张伟:@张汉东 非常赞同;没有unsafe,就没有safe
@戴钎:@彭鑫 unsafe对于Rust来说是不可避免的,原因我认为有两个方面:1、与硬件打交道本身就是“不安全”的,2、其次,目前Rust还没有覆盖到所有的OS基础性支撑,因此有很多FFI的需求,而这些也是unsafe的。
@蓝登峰:@彭鑫 有时候似乎unsafe确实很难避免,涉及到底层抽象和外部调用轮子的时候。这些需要仔细设计将风险尽量控制在局部。真正的风险来自于不可预知的地方,这是显式的unsafe的设计用意。
@韩文弢:@彭鑫 我个人理解是与C++相比,Rust在设计时把一些更加安全的选项推到了前面,而那些可能会伤害自己的选项必须以某种显式的方式标注出来。比如,引用默认是不可变的,必须要写明 mut 才是可变的;再比如 unsafe 也得明确写出来。这跟 C++ 里 const 的标注等形成了设计选择上的对比。
@冯洋:@彭鑫 我认为unsafe的存在其实是“必须”的,因为很多时候,我们需要更加关注性能,或者需要与外部系统交互(FFI)等,这些部分需要处理的问题已经超出了 目前所有权机制可以处理的范围了。
@张汉东:@冯洋 对,因为这个世界是被 C/Cpp 奠基的。
@张汉东:@彭鑫 Rust 标准库里也有 unsafe,为什么说它是 Safe 的 ? 这也是 Rust 初学者一个经典问题了。
本质原因就是 unsafe 无法避免,但是考虑了各种安全边界条件之后,抽象出一个「安全的光明的岛屿」,就能避免「在黑暗前行」了。
@ 戴钎:@张汉东 非常同意这种思路,我们实践中也是这么做的。
@向勇:@彭鑫 我认为,现在unsafe的代码,找到适合的抽象后也会变成safe的代码。这也正Rust语言演进过程的一部分。
@田洪亮:@彭鑫 RustBelt论文里对safe和unsafe的关系描述的挺好的:任何safe语言都有它无法表达的语言结构,所以Rust引入safe/unsafe的设计使得Rust作为一个safe语言的表达能力得以扩展,这对Rust语言的成功是极为重要的。
韩文弢:
我个人对Rust语言印象比较深刻的是零开销抽象和内存安全,使得它特别适合用来进行系统级的开发。同时,语言的生态也已经初具规模,各种库层出不穷。缺点主要是一开始的学习曲线陡峭,以及编译速度较慢。
观点讨论
@彭鑫:@韩文弢 请教韩老师,“零开销抽象”具体怎么理解?
@韩文弢:@彭鑫 引用知乎上的一个回答:零开销抽象一般有两层含义:你不会为没使用的功能付出代价,而对使用了的功能,你也无法手写出更好的代码。
@田洪亮:@彭鑫 这个对零开销抽象的定义来自C++之父。零开销抽象的哲学是Rust从C++那里吸收的
@彭鑫:@田洪亮 原来RUST语言的特性是通过这种迭代化的方式设计的。
向勇:
Rust语言是一个十多年前由个人发起和开源社区主导的编程语言。
我看重的Rust语言特点是开源社区主导、关注并发性能和内存访问安全。开源社区主导可以吸引外部人员参与语言规范的形成和修改;出色和易用的并发机制是为操作系统内核开发带来方便和高性能;Rust语言的生命周期管理机制极大地提高了程序的存储访问安全。
Rust可以像C语言一样,由开发者来完全掌控程序行为,这对内核开发来说是极端重要和必不可少的。
Rust语言的异步编程机制还处于演进的过程中,在内核中使用异步机制来提高并发性能还有一些限制。
冯洋:
我简单总结了一下Rust语言的发展与优缺点:
Rust语言从最开始的个人项目发展至今,有接近20年的历史;从2006年开始,Rust语言由 Graydon Hoare 作为个人兴趣项目开发。
2009 年,Mozilla 赞助了这个项目,从而推动了它的发展。
2010 年首次公开发布。随后的几年中,Rust 语言的设计和编译器架构经历了多次更新,以提高性能和可用性。
2015 年 5 月,Rust 1.0 版本正式发布,标志着其 API 稳定下来,适合在生产环境中使用。
Rust语言的最大优势在于:
(1)内存安全:通过所有权、借用和生命周期的概念,Rust 在编译时防止各类内存安全问题;
(2)并发编程:Rust 的所有权和类型系统特性使得并发编程更安全,可以有效防止数据竞争等问题;
(3)性能优异:Rust语言性能极其优异,诸多实证研究报告表明其运行效率与 C++ 相当;
缺点:
(1)学习曲线陡峭:Rust 的所有权模型对初学者来说可能比较难以理解;
(2)编译时间较长:Rust 的编译时间相对较长,尤其是在大型项目中。但是目前逐渐采用了增量编译技术,所以可以缓解这个问题;
(3)生态系统还在发展中:虽然 Rust 的生态系统正在快速增长,但与 C/C++ 相比,可用的库和资源仍然较少。
徐辉**:**
我认为Rust的主要特点是安全可靠,它从设计伊始就把安全放在一个核心位置。例如,最为大家熟知的可能是Safe Rust的Ownership和Borrow Checker机制,这一点非常类似强制使用智能指针的C++;另外还有一些Trait Bound这类保障泛型API Soundness的机制,在C++ 20里面也以Concepts开始出现。虽然这些概念未必是最先在Rust语言中提出的,但确是Rust语言与生俱来的。Rust语言尝试从语言设计层面保障可靠性,这与传统的软件测试、程序分析、容错等软件可靠性保障思路都不同,因此也引起了我的关注和研究兴趣。
马全一:
从 Rust 语言社区发展角度看我把 Rust 发展分为两个阶段,最初是 Mozilla 资助下的社区治理模式,奠定了 Rust 语言社区的基础;在 Rust 基金会成立后,进入了到基金会+社区混合治理的模式,关注 Rust 语言发展的同时,也在大力推广 Rust 语言的应用。总的说来 Rust 逐渐走向成熟,成为最受开发者喜爱的编程语言。
Rust 语言是可以应用在很多领域的,并不限定于某一个方面。Rust 语言的核心是通过强大的类型系统保障内存安全,所以特别适用于基础软件领域的开发,譬如操作系统、数据库等大型软件。当然 Rust 还在发展的过程中,Rust 的生态没有办法和其它成熟的语言相比,这是所有开发者遇到的问题。
田洪亮**:**
我们现在所知的Rust语言跟它最初的样子可以说是大相径庭。Rust语言诞生于2006年,但直到2015年才发布1.0版,这中间Rust语言经历了非常大的变化和调整。2013年,Rust才决定去掉GC,取而代之的是现在为人称道的ownership机制;2014年又把Green Threads的特性从标准库移除,因为Rust认识到它的目标场景不能允许它有runtime。所以,我想我们可以这么下结论:Rust语言在设计之初并没有一张成功路线图,而是在成长过程中逐渐摸索出来一个真正属于它的特性和定位:即能取代C/C++的内存安全语言。从0.1版到1.0版,Rust语言用了几乎10年的时间。我非常庆幸和倾佩Rust语言的设计者们坚持到了它成功的那一天,带给计算机世界这么优雅的一门语言。
戴钎 :
我是站在大型复杂涉及底层的软件系统的角度来看待Rust的。Rust的设计目标是提供一种系统编程语言,兼具高性能、安全性和并发性。Rust的核心团队和社区不断发展,2015年发布了1.0版本,标志着语言的稳定性和成熟度。过去十年的微软安全报告中,大约有70%的漏洞是由于内存安全问题引起的,巧合的是,来自Google Android的安全漏洞统计也差不多是这个比例,包括缓冲区溢出、空指针解引用、释放后使用(use-after-free)、双重释放(double free)等。Mozilla作为Rust的重要推手,其工程师也在演讲中介绍了生存期达7年之久的一个顽固bug,基本上也是内存相关。可见对于大型C/C++系统来说,内存安全是一个非常重要的问题,不仅关乎系统本身的安全,也对系统的维护成本有着极为重要的影响。作为从安全性出发的Rust,同时平衡了性能、安全性及硬件访问的能力,从我个人的视角来看,Rust的出现其实为C/C++程序员提供了新的系统级编程解决方案,在这种解决方案下,代码的安全级别会得到极大的提升。
张汉东:
前面老师们都说的挺全面,我来补充一下 Rust 作者 在创建 Rust 语言的动机。
据 Graydon 在 2012 年的 infoq 采访文章指出, 因为 Graydon 自身的职业关系,他是一名编译器开发者,所以他了解这些语言的优缺点。比如 C/Cpp 性能好,但是它们不安全;Java 语言安全,但是性能不如 C/Cpp,还有一些函数式语言的特性,比如 OCaml/Haskell 。他就想创建一门语言,能融合这些语言的优点,这是他最初的目标。
至于现在Rust 所倡导的安全、并发、高效的编程语言,赋予每个人构建系统的能力,这是逐步发展过来的。准确来说是 Rust 1.0 稳定版正式发布之后确立的。
我眼里 Rust 的特点如下:
1.无标准内存管理模型而能保证内存安全性。Rust 没有像 Java 垃圾回收器那样的标准内存管理模型,而是通过所有权系统(ownership)和借用检查器(borrow checker)确保内存安全,避免了传统系统编程语言中的许多常见错误,如空指针、悬空指针和数据竞争的同时,还能保证和 C/Cpp 媲美的性能优势。
2.无惧并发:同样基于所有权和强大的类型系统,可以在编译期间检查到多线程数据竞争的风险,从而保证线程安全。并且 Rust 也是唯一一个提供异步并发的系统级语言,对高性能并发场景提供现代化特性支持。Rust 的异步并发也涵盖嵌入式领域。
3.零成本抽象与现代化工程能力:Rust的抽象不会影响性能,允许编写高效且易于维护的代码。虽然不是百分百的零成本抽象,但是 Rust 在朝这个方向努力。相比于 C/Cpp ,Rust 语言的抽象表达能力和工程能力都是非常现代化的,其中最知名的特性就是 trait,是吸取过去几十年 OOP 的教训,采用组合优于继承的思想引入的。
4.Rust 语言只是编译前端,可以后面整合不同的编译后端,比如 llvm / gcc / cranelift ,利用这些编译后端的优势来进行优化和扩大应用平台。
5.强大的类型系统,保证程序的正确性。
Rust 几乎是全能通用语言,基本能做到全栈 Rust :
1.系统编程:操作系统、驱动程序( Rust for Linux)、嵌入式系统()。
2.高性能计算:需要高效处理大量数据的应用,如游戏引擎、图像处理、实时系统。
3.网络和Web服务:由于其安全性和性能,Rust也适合用于构建高性能的Web服务器和后端服务。
4.大模型 AI:大模型基础设施、深度学习框架、大模型训练、ai应用辅助工具等。
5.机器人领域:围绕 ros 相关,数据传输。
6.云原生领域:数据处理、传输、数据仓储等
7.前端基础设施:打包编译工具、前端框架等。
8.GUI 框架:跨平台 GUI 框架
9.应用开发:替代 java/go/python 都能做到。
10.数字金融:量化交易、区块链
(补充一张图)
蓝登峰:
具体历史进程就不赘述了,各位老师的分享了很多细节。每一门编程语言都是在突出地解决了其他语言不能更好解决的实际问题中异军突起的。Rust也不例外,随着网络安全性日益突出、实际系统中安全性和性能的强烈需求成就了今天的Rust语言生态。
在系统架构中对内存安全、高性能、资源受限的项目都是首先可以考虑使用Rust的场景。系统软件特别是IT架构底层依赖的软件都是适合使用Rust来进行开发,比如操作系统、网络通讯层、嵌入式开发、后台服务。
对于一个组织是否采用Rust进行开发,除了技术方面还要考虑在这个项目所在技术领域可获得的依赖Rust组件、框架、工具是否丰富和成熟,这决定了需要自己造轮子或改造轮子的投入和周期。另外就是Rust人才的可获得性。
Rust的主要缺点是学习曲线,对于初学者来说需要更长的时间来掌握,其次,生态系统的完整性和成熟度需要社区的积极参与和持续贡献。
观点讨论
@彭鑫:@蓝登峰 是的,Linux特别是驱动中大量的bug就让大家感觉好像没法接受
Question 2
**主持人:**如何评估Rust语言在特定项目中的适用性?Rust语言在构建高性能系统软件方面的潜力和挑战是什么?Rust在嵌入式系统、操作系统等底层软件开发中的应用前景如何?Rust语言的应用对软件工程实践带来了哪些变化?在大型软件开发项目中应用Rust语言有哪些最佳实践?
陈渝:
如果特定项目是相对大型的项目,需要高性能、内存安全性和并发安全性,那Rust是一个可以选择的语言。
Rust语言在构建高性能系统软件方面的潜力是:接近C/C++的性能、内存安全保证、并发编程的安全性
挑战是:学习曲线陡峭、编译时间较长、还没形成成熟广泛的生态,某些领域的生态系统仍在发展中。
Rust在嵌入式系统、操作系统等底层软件中,可能聚焦在对安全和性能特别重视的应用场景,如智能机器人、自动驾驶、无人系统等。
Rust语言的应用对软件工程实践带来了一定的变化,比如基于Crate的开发方式,基于组件组合的开发方式等,在编译阶段对安全的重视,引入所有权和生命周期等新的编程关注点。
在大型软件开发项目中,还缺少基于Rust的Killer Application。
观点讨论
@韩文弢: 同意陈老师的观点,Rust的优点很多,是否选用我补充一个观点,从实践角度来说,可能还要考虑遗留代码的问题。
@田洪亮:@韩文弢 所以google给rust基金会捐了100万美元,用于提高rust和cpp的互操作性
向勇:
已有的一些Rust重写项目的结果,在一定程度上说明了Rust语言在系统软件方面的高性能潜力。挑战是会Rust语言的人员还比较少,需要大力的宣传和提供相关的课程资源。目前在高效中开设Rust语言课程的学校还很少。
Rust能进入Linux内核就说明了它在底层软件开发中的应用前景。
一些团队正在尝试用Rust语言来写各种操作系统内核模块,目标是实现内核代码模块的直接复用。希望能看到由此带来的内核开发效率提升。
冯洋:
我认为Rust语言提供了一个包括所有权在内的很强大的“安全编程理念”,来解决了过去很多工程实践编码中的常见问题。
例如,其提供了Some,Panic,Result 等组件以实现“安全编程”的理解,这对于一些安全攸关软件的研发具有极其重要的意义。
而就基于所有权机制的内存安全保障而言,Rust目前的实现从根本上解决了例如内存泄漏等过去在测试中很难检测到的一些bug,这显然是一个很大的提升;而从另一方面讲,Rust语言虽然存在一定的学习难度,但是其践行了一个重要的程序设计理念“错误越早发现其修复代价越小”。Rust将我们需要花在部署后去发现并且修复bug的成本,调整到了编码阶段,这是一个很重要的提升。
另外我认为目前的Rust编程的最佳实践:
从现有的生态系统来看,虽然 Rust 的生态在快速成长,但在某些领域,可用的第三方库仍然不如 C/C++ 丰富。因此在实践中,可以在一些大型项目中,逐渐引入 Rust,例如通过替换一些性能关键的组件来实现Rust的应用。其实现在Linux 就是采用的这个思路。
我认为Rust语言设计和标准库构建中,到处都体现着“安全编程理念”
马全一:
我认为评估 Rust 在特定项目的中的适用性从以下几个角度来分析:
1. 从产品设计的角度看 Rust 语言是否为产品带来价值
2. 从产品的生命周期角度看,Rust 语言的开发效率和维护成本是否符合产品的预期收益
3. 从团队的角度看,切换成本和学习成本是可以接受,是否会影响团队的稳定性
Rust 的内存模型和嵌入式系统、操作系统的内存模型存在差异,对内存的分配和回收如何保证安全是 Rust 面临的一个挑战。就像在问题 1 里面各位老师和专家讲的一样,如何平衡 Safe 和 Unsafe ,对于每个开发者都是一个巨大的挑战。
我认为 Rust 文档功能对于大型软件开发带来很多简便,尤其是文档中的 example 代码是在执行单元测试的时候进行测试,大大保证了文档和代码的一致性。
观点讨论
@蓝登峰:@马全一 领域开发效率确实是一个很重要的因素,Rust具备全栈能力,但对于灵活性要求比安全性要求高的场景,Rust的优势就不够明显了。
田洪亮:
我相信Rust是系统编程的未来。Rust会取代C和C++,正如C/C++取代汇编语言一样。我有15年C/C++语言开发经验,5年的Rust开发经验。我发起了两个基于Rust的开源OS内核项目Occlum和Asterinas,累计编写和评审的Rust代码超过10万行。我可以负责任地讲,Rust确实做到了它的承诺:“Safe, fast, productive --- pick three”。而就我个人感受,用了Rust以后,就再也不想回到C/C++,就像文艺复兴时代的人不愿意回到黑暗的中世纪...
观点讨论
@彭鑫: 👍👍👍
@冯洋: 👍👍👍
@蓝登峰: 👍👍👍
@徐辉: 👍👍👍
张汉东:
对于新项目可以从下面三方面评估 rust 的适用性:
1. 项目需求:评估项目对内存安全、并发性和性能的要求,以及项目周期。
2. 团队能力:考虑团队成员对 Rust 的熟悉程度以及学习新语言的意愿。以及团队的能力能否应对当前项目的开发周期,顺利交付。
3. 现有生态:评估项目所需的库和工具在 Rust 生态系统中的支持情况。这也是和团队能力相关,如果生态系统没有成熟的库,那只能有团队自己开发,这也需要耗费人月。
最终是否考虑使用 Rust ,应该根据上面三方面做综合的权衡。
对于遗留项目,是个比较头疼的问题,像华为 / Google 这种巨头,遗留大量的 C/Cpp 项目代码,他们考虑的问题就是如何让 Rust 与 Cpp 安全交互。这个问题,如刚才洪亮老师所说,google 在这上面就投给 Rust 基金会 上百万美元来解决。这个势头,是想要彻底解决。也是代表了这些巨头想要把 Rust 作为下一代系统语言的决心。
高性能系统软件:
• 潜力:Rust提供了媲美 C和 C++ 的性能,同时确保了内存安全和并发性,使其非常适合高性能系统软件开发。Rust提供了安全并发的强大工具,如Send和Sync trait,防止数据竞争和并发错误。Rust的异步编程模型(如Tokio)也非常适合构建高并发系统。Rust允许开发者在需要时进行低级别的内存和硬件控制,同时仍然保持高层次的安全性。这使得Rust非常适合编写操作系统、驱动程序和嵌入式系统。
· 挑战:至少来自三方面:
1. Rust 至少有三道学习曲线。
(1)要掌握所有权等安全管理内存模型。
(2)理解安全,要掌握和熟练应用好 Rust 的类型系统,以及 Unsafe Rust 安全抽象,以应对一些嵌入式系统或实时系统等极端性能要求的场景,以及和其他语言交互场景。
(3)工程和优化能力。熟练应用和了解 Rust 的特性,对系统进行逻辑建模和抽象,了解该特性的性能损耗和优化潜力,以达到一个架构良好且性能达标的系统。
2. 人才和社区。Rust社区在快速增长,但与其他成熟语言相比,Rust开发者的数量仍然较少。在招聘和培训Rust开发者时,可能会面临一些挑战。
3. 某些特殊硬件平台的支持性不足。现在龙芯和鸿蒙都已经是 tier 2 级支持了,但依然不是 tier 1,意味着 Rust 语言不保证这些平台运行没有问题。
嵌入式系统和操作系统:
补充国外的一些成功案例:
- Oxide Computer 公司开发的机架规模系统体现了垂直整合的特点。他们从零开始全面开发机架规模系统的方法。这一努力表明他们对通过 Rust 支持重新定义云计算基础设施的深刻承诺。与许多云计算提供商组装预制组件不同,Oxide 设计和构建其硬件和软件的每个方面。这种方法可以实现卓越的优化和定制,以满足特定的性能和安全需求。Oxide 机架规模系统是硬件和软件的统一,专为在场内数据中心提供云计算而定制。这种设计为企业提供了云性能的好处,同时又具备场内基础设施的控制和安全性。通过同时设计硬件和 Rust 软件组件,Oxide 确保了无缝集成和最大化效率。
- OxidOS:该公司基于 Rust 和 Tock 构建了一款安全的开源汽车操作系统,用于安全关键的汽车 ECU。他们的解决方案包括基于 Rust 的安全操作系统和用于汽车 ECU 内部的中型微控制器的 DevTools,专为安全关键应用而设计。OxidOS 生态系统提供了显著的安全性和安全性增强功能,同时将汽车 ECU 软件开发项目的开发和认证时间减少了一半。这是通过使用 Rust 实现的,Rust 在编译时强制执行内存和线程安全等优点。OxidOS 架构运行内存沙箱应用程序,这些应用程序具有加密凭据并进行了数字签名。
- Tweede Golf 是一家荷兰的软件咨询公司,专注于安全和隐私友好的软件。他们致力于关键项目,以创建安全的互联网基础设施,保护公民的隐私,并使用嵌入式 Rust 来保护连接设备。最近重新用 rust 编写了ntpd-rs ,这是一个开源的网络时间协议实现,完全使用 Rust 编写,旨在创建一个现代化、内存安全的 NTP 协议实现。Tweede Golf 也是法国某航空公司软件供应商,去年成功为该公司发射的太阳帆宇宙飞船提供了 Rust 模块。
- Matic 机器人吸尘器收集灰尘,但不收集您的个人数据。尊重隐私、真正智能的机器人。这家总部位于旧金山的初创公司最近完成了 2400 万美元的 A 轮融资。他们在 95%的代码使用 Rust,并使用摄像头视觉来导航、吸尘和拖地。
- AMP 机器人公司,赋予废物和回收领导者利用人工智能解决行业最大挑战的能力。该公司利用尖端技术帮助废物和回收设施改善运营并提高回收率。
对软件工程实践的变化:
- 软件工程质量的提升:Rust 语言确保内存安全方面的能力,在系统编程中尤为重要,特别是对于云计算和嵌入式系统,以及更多安全关键场景,安全性和稳健性至关重要。总的来说, Rust 提升了代码的质量,从而提升系统的品质。
- 开发效率的积极影响:虽然学习曲线陡峭,但从长远来看,Rust 可以提高开发效率和代码可维护性。
- 开发范式的转变:从纯面向对象或纯函数式两种范式流派,走向工程化混合范式。Rust 是一个很好融合了 OOP/FP 编程范式的语言,吸收了其他语言的优秀特性,让开发者的专注于工程实现而非抽象范式的选择。
最佳实践:
- 模块化设计:充分利用Rust的模块系统和包管理工具 Cargo,及 Cargo 工具链(fmt/ clippy 等)。利用Rust的模块系统将代码组织成小的、独立的模块。这样可以提高代码的可读性和可维护性。尽量减少模块导出的公共接口,隐藏内部实现细节,只暴露必要的接口。
- 测试驱动开发:
- 良好的单元测试覆盖率;
- 性能基准测试覆盖,确保避免代码在团队协作演进过程中发生性能退化;
- 安全关键部分,需要模糊测试覆盖;
- 代码审查:
- 确保 Rust 代码质量,尤其是 Unsafe 安全抽象方面。
- 定期审查第三方依赖库,利用好第三方库比如 cargo vet 防止供应链安全问题。
- 文档化和知识共享:为项目编写详细的开发文档、架构文档和使用文档,确保新成员能够快速上手。
- 持续集成和持续部署。
戴钎:
作为一家手机厂商,为了适应未来IoT+AI万物互联的用户场景,高效、高可靠性、硬件友好是我们非常看中的一些核心要求。经过长期调研和对业界的感知,我们认为只有基于Rust的系统及生态最有可能满足我们的要求。因此我们在蓝河系统上All in Rust,非常果决,并以此为基础让我们的蓝河系统及生态从一出生就是安全的,即所谓的“天生更安全”
观点讨论
**@赵俊民:**目前Android Google在大力推广Rust,有20多个模块用Rust重写了。
@戴钎:@赵俊民 从结果来看也很鼓舞,Android新增的漏洞没有来自Rust模块的,我们自己的测试结果也差不多。
**@赵俊民:**后面Google也会持续重构用Rust
@张汉东:@赵俊民 android 里 Rust 代码量已经超 150万行了,google 在2022 年 12 月就发文宣传他们取得了内存安全成果:Rust 代码 0 Bug
@彭鑫:@赵俊民 那看来跟其他遗留模块(C/C++?)互操作性还不错,没有跨语言交互的性能损耗吧?
@赵俊民:@彭鑫Android做法是完全重写,基本交互的比较少
@马全一:@赵俊民 Android 13 中新增代码行数比较,Rust 和 C 接近,下个版本预计就超过了
**@张汉东:**Google 现在的问题主要是在遗留 Cpp 代码和 Rust 安全交互了
@韩文弢:@赵俊民 那 Go 怎么办?😂
@戴钎:Android的Binder模块用Rust全部重写了,google给出的报告是基本完成了所有功能,实际结果性能也是满意的
**@赵俊民:**这两年Google也在c和Rust成了专门基金支持
@彭鑫:@赵俊民 Rust 代码 0 Bug 还是 0内存安全bug?😊
@戴钎: android binder rust模块源代码我看过,也是ffi的一个思路,但是做的非常Rusty
@张汉东: 它们主要是关注内存安全
**@蓝登峰:**似乎已经在没落中,就看人才比例了
**@马全一:**在 Google ,Rust 还不是公司级的编程语言,估计快了;目前还是 Go、C++、Java、Python
@赵俊民:@戴钎 代码质量写的比较好
@戴钎: 是的,非常值得学习参考
@张汉东:@戴钎 鸿蒙这块也重写了
**@赵俊民:**Go本身在Android用于构建模块,业务比较少用
**@冯洋:**我们做过一个调研,在github上,Rust的项目中,每千行代码的bug率是远远低于其他语言的
@马全一:@冯洋 这是一个商业问题,前些年云原生一波带动了国内的 Golang 开发者发展;现在是一个基础软件领域重构的浪潮,必然 Rust 开发者会增加
@韩文弢:@冯洋 很有意思,有公开资料可以分享吗?
**@张汉东:**所以,Rust 现在的价值不止于内存安全,更多是代码正确性
@狄鹏:@张汉东 张老师,华为有计划吗?
**@张汉东:**已经实现完了,一年了
Question 3
**主持人:**当前Rust语言在开发库、框架、工具等方面的生态建设现状如何,存在哪些挑战?在构建可持续发展的Rust生态系统方面还存在哪些关键的缺失或不足?
陈渝:
在生态建设现状方面,Cargo作为Rust的包管理器,提供了优秀的依赖管理和构建工具。crates.io 作为中央仓库,为Rust提供了丰富的第三方库。Rust标准库正在不断完善,提供了许多核心功能。tokio为异步和网络编程提供了强大支持。提供了许多底层系统编程的库和工具。
目前的挑战和不足也有不少,与Python、JavaScript、C/C++、Java等语言相比,某些领域的库还不够丰富或成熟。Rust的独特概念(如所有权、生命周期)增加了学习难度。
缺失方面,主要是缺少需要更多的分析、调试和性能优化工具。虽然官方文档很好,但仍需要更多高质量的学习资源和实践指南。虽然有FFI,但与其他语言的无缝集成仍有改进空间。
我觉得Rust目前的一个瓶颈就是缺少类似C中的各种各样的工具!
补充:光有大量的软件包还不够,我们需要有各种工具支持的高质量的软件包。基于C语言的seL4 采用的形式化证明工具是 Isabelle/HOL,面向Linux kernel有Syzkaller fuzzing工具。基于Coq形式化证明的CompCert编译器,还有各种动态/静态分析工具,在Rust世界还缺少对应的工具。软件工程领域的老师看看能否尝试。
观点讨论
@韩文弢:@陈渝 我感觉 Rust 的生态建设方面有个问题,就是设计者把标准库覆盖范围定义的很小,希望把更多的事情留给社区第三方库来做。但是第三方库的发展没有统一的领导和组织,质量参差不齐,有时候都不知道该选用哪个。
向勇:
当前Rust语言生态建设正处在量的积累中,好的消息是一些原来用用C/C++的项目正在用Rust重写,更多的新项目采用Rust语言;但由于宣传和人才的原因,目前Rust语言项目的总体占比还很小。
对Rust生态有关键影响的,我认为是Rust社区治理的公开和公正。
徐辉:
我认为Rust的生态已经非常好了,Crates.io上发布的库已经超过了15万个,这得益于Rust吸引了很多顶尖的开源开发者都在为社区做贡献。要说不足的话我还是从可靠性方面谈一下自己的看法,就是这些库缺乏类似安卓应用商店式的安全认证。Rust语言的安全性取决于其API的Soundness,这点在标准库里尚且可以依靠核心开发团队的技术实力保障,但对于规模庞大的第三方库来说则较为困难。未来Crates.io如果能对提交的库作自动化的Soundness检查认证,对于Rust生态的健康发展应该很有必要。
观点讨论
@彭鑫:@徐辉 15万个三方库看起来数量已经很多了,不过估计质量参差不齐同时功能分布上可能也不均匀
@马全一:@彭鑫 现在大多数情况是大家根据引用数量来确定,这就更大的造成了供应链安全问题
@蓝登峰:@彭鑫 Python有27万个左右的软件包,还是有点差距的
**@张汉东:**生态建设现状:https://lib.rs/stats 这里有一些统计。我来补充一张图。15 万 crate,但下载总量达到 721 亿次。
**@冯洋:**另外有个问题是,目前的很多包或者库的维护是不足的
@马全一:@冯洋 之前有组织开发了一个 dagrs 的项目,没有宣传的情况下被很多人用,但是我自己现在根本无力维护。这个状况是很多开源贡献者都遇到的问题
冯洋:
Rust 的整个生态系统其实是在快速增长的,只是目前与C/C++相比还有较大的提升空间,其在开发库、框架、工具链等方面都有一些现成的工具,特别是在网络编程(如使用 tokio 和 hyper)、Web 应用框架(如 Rocket 和 actix-web)、以及命令行工具开发(使用 clap 和 structopt)等方面,Rust 提供了强大的支持。
其核心的缺陷在于,虽然有很多高质量的入门书籍和在线资源,但关于高级主题的深入讨论和实用案例仍相对较少;尽管 Rust 的库和框架在增长,但与成熟的语言(如 Python、Java 和 C#)相比,Rust 的某些领域仍缺乏成熟或广泛采用的解决方案;
Rust 需要更多大公司的支持和投入,这不仅能带来财政资助,还能增强其在商业环境中的可信度和应用案例;另外一方方面,Rust缺乏较为全面的教育和培训资源。另外,Rust语言迭代极快,两周就会更新一个版本,其MIR更新变化也很快,这使得相关的研究存在一定的困难;最后,Rust可能需要更广泛的平台和领域支持,虽然 Rust 在系统编程和Web开发方面表现出色,但其在数据科学、机器学习、桌面应用等其他领域的库和工具还不够丰富。
马全一:
整个 Rust 语言的第三方开发库及框架和 Rust 发展速度是不匹配的,尤其是当前 crates.io 中第三方库的质量并没有一个合适的评估方式,存在着供应链安全的巨大挑战。对于这个方面 Rust 基金会也在和 Rust 社区基础设施团队在进行合作推动,国内华为已经和开放原子开源基金会进行合作,着手建立国内的镜像为开发者服务。
Rust 还没有一个 Specification ,是限制 Rust 语言应用到更广泛环境中的一个重要问题,这影响了 Rust 在一些行业里面的推广,也影响了一些形式化验证的开发。当前 Rust 基金会已经有全职的工程师正在编写 Specification 。
田洪亮:
我认为Rust语言的生态还是非常健康和蓬勃的,常见的需求都有相关的crate可以直接复用。相对来说,我目前所工作的OS领域的Rust软件生态还比较匮乏,很多OS内核开发需求都无法找到对应的crate,相关的工具也比较欠缺。我们在这方面已经做了一些尝试,比如发布了名为OSDK的Rust OS开发工具箱(https://crates.io/crates/cargo-osdk)和名为OSTD的Rust OS开发核心库(https://asterinas.github.io/book/ostd/index.html),但还是有很大的提升空间。
戴钎:
1、我们看Rust的库和生态,主要还是和主流语言的对比,尤其是和C/C++的对比,由于C/C++流行已久,因此生态系统极度完善,几乎任何功能项都能找到成熟的代码和库加以利用。与之相比,Rust虽然也在不断完善中,但与C/C++相比仍然有很大的差距,这就是各种binding库和FFI得以存在的基础。
2、其次,Rust的crates生态也面临代码水准参差不齐,文档参差不齐的问题。就代码水准而言,很多crates的API在不同的环境下可能存在一定的问题,而文档方面来说,有时需要阅读源代码才能了解API的实际功能、约定和用途。
蓝登峰 :
是的,Rust语言在大部分领域的都具有了一定的生态,做的比较好的也是集中在系统软件层,比如操作系统、网络通讯、异步和并行、web框架、嵌入式等系统软件。Rust基本具备了全栈开发能力,但在很多其他同领域开发者不够聚集的领域,Rust的轮子会存在与其他语言相比完整性和成熟度不足的问题。有些项目文档不够完整或者与代码版本不匹配,需要花费不少时间去研究源码。
构建可持续发展的Rust生态,加强开源项目的社区治理,做好功能规划和代码规范的共识,鼓励更多的贡献者参与高质量项目的开源建设。特别要重视社区文档和最佳实践示例,降低介入门槛,让更多开发者能够使用、反馈、甚至参与到代码贡献中来。
张汉东:
但总的来说,可以将其分为两大部分:基础库和垂直领域的库或框架。基础库涵盖了广泛的通用功能,而垂直领域的库或框架则专注于特定的应用领域。我简单来列举下相关的工具。
基础库
1. 标准库(std):Rust的标准库(std)是相对成熟且功能丰富的。它提供了基本的数据结构(如Vec、HashMap等)、并发支持(如线程、通道等)、文件系统操作、网络支持等。标准库经过了多年的开发和优化,稳定性和性能都较高。
• 文档和示例:标准库有详细的文档和使用示例,官方文档(The Rust Standard Library)覆盖全面,易于查找和参考。
• 社区支持:标准库有广泛的社区支持,遇到问题可以在社区中迅速得到解决。
2. Cargo 工具链:Cargo是Rust的包管理和构建工具,非常成熟且功能强大。Cargo提供了依赖管理、构建、测试和发布等功能,已经成为Rust生态的核心工具。
• 文档和示例:Cargo有详尽的文档和指南,官方文档(The Cargo Book)易于理解和使用。
• 社区支持:Cargo是Rust开发者日常使用的工具,社区支持非常广泛。
3. rust-analyzer 是 Rust 生态系统中的一个重要工具,它提供了一组用于集成开发环境(IDE)的功能,使开发者能够更高效地编写、调试和维护 Rust 代码。
4. Async/await 生态
• Tokio:一个高性能的异步运行时,非常成熟,广泛应用于生产环境。
• async-std:另一个异步标准库实现,旨在与标准库 API 保持一致。
• 文档和示例:Tokio和async-std都有详细的文档和使用示例。
• 社区支持:两者都有活跃的社区支持,尤其是Tokio,许多高性能网络服务都基于Tokio构建。
5. 其他基础库:序列化反序列化/ 数据传输/处理/ 分布式/ 网络 等等都能找到现成的实现。目前已足够成熟,比如最基本的 http 库已经上亿次下载。
垂直领域的库或框架
1. Web开发:Axum / Actix / Poem / Rocket 等非常成熟
2. 嵌入式开发:TockOS,RTIC (实时并发框架),embassy(嵌入式异步框架),embedded-hal 等,成熟度依赖硬件厂商的支持,目前正在逐步发展,首当其冲的是乐鑫(esp-rs)等。
3. 数据库
• TiKV:一个分布式键值数据库,性能和可扩展性都非常好,已经在生产环境中得到广泛应用。
• SurrealDB:一个新兴的分布式数据库,支持多种数据模型和实时查询。
• 文档和示例:TiKV和SurrealDB都有良好的文档和使用示例,但SurrealDB的文档可能相对较新。
• 社区支持:TiKV社区非常活跃,有广泛的企业应用。SurrealDB的社区正在成长中。
4. WebAssembly
• wasm-bindgen:用于将Rust与JavaScript绑定的工具,非常成熟,广泛应用于WebAssembly项目。
• Yew:一个基于WebAssembly的前端框架,提供现代化的Web开发体验。
• 文档和示例:wasm-bindgen和Yew都有详尽的文档和教程,便于开发者使用。
• 社区支持:WebAssembly生态系统在Rust社区中非常活跃,相关库和工具不断更新和完善。
5. GUI开发
• makepad:一个跨平台GUI框架,正在快速发展中,但与传统的GUI框架(如Qt、GTK)相比,成熟度还不够高。
• Tauri:一个结合Rust和Web技术的桌面应用框架,成熟度较高,适合构建现代化的跨平台桌面应用。
• 文档和示例:Tauri的文档和示例较为完善,makepad的文档和示例相对较少。
• 社区支持:GUI开发在Rust社区中是一个相对较新的领域,Tauri的社区较为活跃,makepad 等其他 gui 框架还在成长中。
6. 大模型与 AI
- candle:huggingface 的 rust 实现的深度学习框架,面向万物大模型,支持 webassembly
- burn:新兴的用 Rust 实现的跨平台深度学习框架
- Rust 实现的多智能体大模型应用或客户端等,比如 bionicgpt
crates.io 和 github 还有很多领域库和框架,这里无法一一列举了。
目前的缺失和不足:
- 还未达到那种开箱即用的状态。尽管Rust生态系统中的库和框架数量众多,但部分库的成熟度和稳定性仍需提高。尤其是在一些特定领域(如OS、嵌入式、GUI开发和机器学习)中,现有的库和框架可能还不够完善或缺乏长期维护。
- Rust需要更多的企业级工具和服务支持,包括更完善的调试、性能分析工具以及其他开发辅助工具。这些工具对大型项目的开发和维护至关重要,但目前Rust生态系统中的企业级支持还相对有限。
- Rust相对较新,熟悉该语言的开发人员较少。企业在招聘Rust开发人员时可能会面临挑战,因此需要更多的教育和培训来培养Rust开发者。尤其是高校教育的支持。
Rust 的生态基本上是满足开发需求的,但是想要达到 java/go/js 那类开箱即用,估计还得很长时间。
Question 4
**主持人:**如何通过教育和推广帮助更多的人了解和使用Rust语言并参与到Rust软件生态建设中?在当前的大学教育中是否适合引入Rust语言教育,有哪些实践经验?如何在开源社区推广Rust语言和基于Rust语言的项目?如何能积极参与到Rust相关的国际交流与国际社区中去?
陈渝:
教育推广方面,可通过大学教育引入Rust语言课程,培养学生的兴趣和能力。例如,目前在国内发起的开源操作系统训练营,就是通过使用Rust语言编写操作系统的实践,培养操作系统开发技能。
在开源社区推广方面,目前在国内外已经有不少Rust相关的开源社区,大家可以积极参与开源社区,贡献代码和文档,分享项目经验。例如,Rust语言中文社区提供了友情链接和资源支持,促进了社区的交流和发展。
在国际交流方面,我们可以参与Rust相关的国际会议和活动,如RustConf、Rust China Conf, GOSIM等,与全球开发者交流心得,共同推动Rust语言的发展。同时,可以通过国际社区获取最新的Rust语言动态和教育资源。
在培训和认证方面,Rust基金会计划开发培训和认证计划,以满足商业对Rust课程的需求,并利用项目收益支持Rust社区的发展。国内的中国计算机学会、开放原子开源基金会等也可以做类似的培训和认证工作。
在实践经验分享方面,我们通过技术分享会、工作坊等形式,分享Rust语言的使用经验和最佳实践。例如,Rust China Conf 这几年的会议交流中,就包含了多个关于Rust语言在不同领域的应用和实践经验的分享。
在课程和教材方面,在大学中还比较欠缺,目前了解到有北大、清华、复旦、南大等开设了Rust相关的编程课程。如清华大学计算机系给大一新生开设的《程序设计训练(Rust)》暑期课程,涵盖了Rust语言的多个重要概念和编程实践。但还需要开发适合不同层次学习者的Rust语言课程和教材。
在企业合作方面,企业可以提供实习和工作机会,让学生和开发者有机会在实际工作中应用Rust语言,同时也为企业培养所需的Rust开发者。并利用在线教程、文档、工具等资源,帮助开发者学习和使用Rust语言。例如,GitHub上的Rust开源项目排行榜提供了许多受欢迎的Rust项目,可以作为学习和参考的资源。
通过上述多维度的推广和教育活动,可以有效促进Rust语言的普及和应用,吸引更多的人参与到Rust软件生态的建设中。
张伟:
俗话说,教育要从娃娃抓起。也许,可以在小学、初中或高中就开设Rust程序设计的课程。师父领进门,修行在个人。个人是否愿意参与到Rust软件生态建设中,就是个人的事情了;不宜做统一的规划。
关于“在当前的大学教育中是否适合引入Rust语言教育”,我想,没有什么“适合”或“不适合”的说法。大学教育本来就应该是一座五彩缤纷的花园;多了或者少了一朵名为“Rust”的花,都不重要。可以作为一门选修课先开设起来:开课老师确保自己深刻理解了Rust语言的特点,然后把正确的知识传递给学生;剩下的事情,交给学生自己去选择和发展吧。
Rust开源社区就在互联网上,没有人可以限制你不能或者必须参与其中。如果一个人对参与其中很感兴趣,那就多了解,多学习,尝试作出小的边缘性的贡献(例如,实现Rust标准库中某一个规划中的函数),然后再作出更大的核心的贡献(例如,参与到支持某个语言特性的编译器开发活动中)。
观点讨论
@彭鑫:@张伟 北大的RUST课选课人数变化趋势及学生评价如何
**@张伟:**每年有60~70名学生选课(为了教学效果,名额也就是70人)。对于很多学生的触动还是很大的。
**@韩文弢:**去年IOI比赛现场开会的时候讨论要不要在IOI中引入除了C++以外的其他编程语言,其中有一个建议是Rust,被我否了。😂
@陈渝:@韩文弢 韩老师也可说说清华的Rust编程课的情况?
**@张汉东:**一个可行的方案是:oj 算法平台支持 Rust ,这样可以促进初中生们开始用 rust 。 但面向大众来看,少儿培训机构开设 Rust 课程很难,因为家长的需求还是要看成绩或考试加分。
韩文弢:
我主要从事教学工作,谈谈这方面的经验和体会。Rust语言是一门很好的用来作为教学载体的语言,能够让学生体会如何根据任务要求进行合理的编程语言设计考虑,尤其是在学生学过程序设计基础类课程之后,在已经学过一门语言(国内一般为C/C++、Python或Java)的基础上,结合实际的任务背景讲解Rust比较有特点的语法特性(所有权机制、生命周期、类型系统、工具链等),通过对比让学生理解编程语言的进化趋势。本人从2022年开始在清华大学计算机系开设夏季学期课程“程序设计训练”中的Rust语言课堂(另外已有的两个课堂为Python和Java),起因是陈渝老师、向勇老师在操作系统课上使用Rust开发了教学操作系统rCore,希望学生在上操作系统课之前能有Rust基础。教学团队从头设计了讲义、课后作业、课程项目,让大一学生在暑假集中用4周时间学习Rust。经过两年的尝试,有部分学生在之后的学习中把Rust用作了主要编程语言,还有学生在今年提出想在课堂上给后面的学生讲一讲Rust语言的编程心得,取得了一定效果。
观点讨论
@蓝登峰:@韩文弢 数据结构课程是否也可以引入Rust?
@陈渝 :@冯洋 @徐辉 二位老师在南大和复旦是否也开了Rust编程课?
**@韩文弢:**大家感兴趣可以看我们的课程主页 https://lab.cs.tsinghua.edu.cn/rust/,最近正在开展第三轮的教学。
@冯洋:@陈渝我这边在编写一本rust语言程序设计的相关教材,计划明年春季学期开设相关本科课程。
@徐辉:@陈渝陈老师,我们有开,不过是在研究生阶段,课程名字是安全编程语言设计。这门课先分前五次课讲基础的内存安全知识,然后五次讲Rust特性,最后五节课是一些拔高的程序分析研讨。
@韩文弢:@蓝登峰 用 Rust 写树和图的数据结构,我想想就觉得酸爽。🐶
@张汉东:可以引入,但是最好在学生了解所有权之后,否则学生有可能放弃
**@冯洋:**是的,最好要先讲清楚内存管理
**@赵俊民:**我自己也学习了一段时间Rust。感觉最困难就是编程方式的转变。最让我无法好的处理的是,Result返回类型和lifetime注释很不习惯
向勇:
- 基于开源社区提供丰富的Rust语言学习资料和开源项目,为高校在开设课程和实践时提供选择的可能。
- 我们的做法是,在课程教学和实践中提供使用Rust语言的可能;组织面向高校学生的操作系统比赛,并提供基于Rust语言的参考示例;组织面向所有对用Rust写操作系统有兴趣人员的开源操作系统训练营。
冯洋:
C++之父Bjarne Stroustrup曾经说过,“一种语言的出现与繁荣一定需要解决一个具体的问题”,Rust语言在这方面做得非常好,其从根本上解决了经典的C/C++语言中存在的内存安全问题。所以我认为这个语言是可以快速成长起来的。
目前我国Rust用户似乎不是很多。我们后期其实可以在大学教育中引入Rust,并且鼓励学生在开源社区的各个项目中使用Rust,并在举办开展与Rust有关的研讨交流活动。
而在教学方面,我们正在编写Rust程序设计语言的教材,系统性讲解Rust的语法,并设计了实验和demo来让学生循序渐进理解Rust程序设计,未来还有机会编写和设计基于Rust的进阶编程课程,比如编译系统开发等。
我在这个问题方面,最大的经验是鼓励学生直接参与项目,其实参与项目有很多方式:
(1)贡献代码:参与现有的 Rust 项目,例如通过贡献代码、编写文档或修复 Bugs 来积极参与。这有助于提升个人技能的同时,也能增强 Rust 的生态系统。
(2)研讨活动:参与 Rust 相关的 Meetups、Hackathons、研讨会等活动,这些都是推广 Rust 的有效方式。
(3)贡献个人爱好的项目:就好像前面说的一样,Rust程序设计语言在最开始本身就是一个“个人兴趣项目”;启动新的基于 Rust 的开源项目,解决具体问题或填补生态系统中的空白,其实本来就是一种很好的学习、参与、交流的形式。
田洪亮:
作为工业界的人士,我以及我在蚂蚁的各位同事们在以各种方式在国内积极推广Rust语言,比如赞助Rust Conf China,协办Rust China Tour,下周我们将举办Rust OSDev Beijing Meetup。中国在Rust基金会和国际社区的存在感总体还是比较弱的,这方面我们希望未来也能出一份力。
马全一:
华为在已经在教育部新的智能基座项目中把 Rust 编程语言放入其中,目前有 50 多所学校的100 多位老师提出了开设 Rust 编程语言相关课程的意向,涵盖了语言、编译器、数据结构、网络和软件工程等多个方向。预计未来会有更多学校的老师会在教学中采用 Rust 语言。华为也会把这些教学资料收集起来,通过社区共享给所有的教师。
我认为推广 Rust 语言和 Rust 语言的项目最有效的方式,是通过 Meetup 把项目开发者和爱好者联系起来,让使用者去感染更多的人,这也是华为和蚂蚁两家公司当前在国内做的事情,我们共同发起了 Rust China Tour 活动,在开放原子开源基金会的支持下,目前已经吸引了很多开发者关注。当然现在 Rust 语言还没有一个明星项目,如果有一个像 Docker、Kubernetes 那样的明星项目,会更快的引起 Rust 编程语言的传播和发展。
目前 Rust 基金会和 Rust 社区是针对 Rust 语言本身的,参与者需要对编译器有一定的经验,所以直接参与到社区贡献存在一定的门槛。目前华为和中国科学院软件研究所已经是 Rust 基金会的成员,他们都有通过各种活动邀请国际社区的开发者到中国交流。今年中科院软件所举办的开源之夏活动就邀请到了 Rust 社区的 Team Leader 参与,通过任务辅导国内的高校开发者参与 Rust 语言本身的开发。当然还是需要大家共同的努力,跟国际社区建立多种连接,双向交互。
徐辉:
另外,我想谈一下在大学教育引入Rust的问题,我在复旦教编译原理本科课程、以及安全编程语言设计(Rust)研究生课程,可以说Rust作为选修课或研究生课程的话完全没问题,选课的学生都是对该语言有兴趣的学生;在编译原理课上也有同学表示想用Rust写编译器pj。问题的关键是“Rust有没有可能成为计算机专业本科生学习的第一门编程语言?”。我觉着还是有可能的,最早的程序员都从汇编学起,后来有了高级编程语言Fortan,再后来随着C和Unix操作系统的兴起,C语言逐渐成为主流。现在Rust在语言特性和项目管理方面具备了很多C/C++不具备的优点,非常值得作为第一门编程语言学习,目前主要的问题可能是缺少一个Killer Application,类似Unix之于C,Deep Learning之于Python。
观点讨论
@田洪亮:@徐辉 Rust好像确实还没有一个Killer Application哈,说明还是方兴未艾
@戴钎:@田洪亮 估计得有Killer OS,类似与C和UNIX
@徐辉:@田洪亮等待星绽😁
@张汉东:@田洪亮 我是觉得没到时候,现在大多是在基础设施领域采用 rust 。就好像一座百年大厦正在修缮地基一样。等基础修缮完毕,应用可能会爆发
**@田洪亮 :**Rust OS们可以加加油
**@张汉东:**这个可以有
**@马全一:**我有几个实习生,不同层次高校的都有,我都有问过他们学习 Rust 的体验,感觉他们都没有所谓的学习曲线问题
戴钎:
学生是未来的工程师,而学校是未来工程师的摇篮,对高校来说,针对Rust的推广对整个Rust生态完善有很大的帮助:
1、引入Rust语言教育,提供系统编程和安全编程的实践。可以在C++专业课之后增加Rust选修课,并在教学环节增加C++ Rust PK等趣味性挑战作业。
2、积极鼓励学生参与Rust编程大赛,参加Rust相关社区、会议,参与开源项目
张汉东:
关于第四个问题,我的建议是:
- 在大学课程中引入Rust,特别是系统编程、并发编程和安全编程课程。通过实际项目和实验室课程,让学生动手实践Rust的应用。
- 鼓励企业更多采用 rust ,开放更多 rust 岗位。
- 鼓励企业和开发者参与开源项目,贡献代码和文档,提高库和框架的成熟度和稳定性。
- 举办Rust编程比赛、工作坊和研讨会、行业交流会等,推广Rust的应用和最佳实践。
- 国际交流:参与Rust相关的国际会议、论坛和在线社区,分享经验和成果,了解最新的Rust发展动态。
<教育 - 岗位> 得形成良性循环。
蓝登峰:
在推动Rust语言的普及方面,我认为需求驱动加项目实践会是比较有效的方式。编程语言是实践性极强的知识和技能,许多学校的课程内容往往滞后于行业社区的发展。回顾20多年前的学习经历,我们当时课程开始的还是Fortran和Pascal,然而老师带领的实践项目指定使用C语言时,几位同学就自学了C语言,并迅速将其应用于实践中。
Java语言的情况也类似,在我即将毕业时,许多企业都期望应聘者具备Java的技能。面对市场需求,周边自学Java的就多起来,甚至参加专业认证考试,学校也开始增设相关课程。
近几年机器学习和人工智能的火热,让python变得流行,很多人包括学生都主动学习Python. 随之学校也开设了课程。因此,无论是在高校还是企业中,结合实际需求和吸引人的项目,无疑是推广Rust的最佳途径。
目前,开放原子开源基金会也在积极开展Rust的社区推广活动,包括线上直播和线下Meet up等。特别是在高校,我们通过“校源行”等活动与学校紧密合作,正在策划一些将开源项目与高校技术社团活动相结合的活动。这些开源项目不仅有助于活跃社区氛围,还能帮助学生掌握技术、积累社区影响力。
基金会已经有部分项目是使用Rust来实现的或适合用Rust来重构的,欢迎大家也参与到其中。基金会有不少很有潜力的项目,比如 https://dora-rs.ai/ , DORA是一个提供了比ROS2更高性能和安全性的机器人组件。这个项目陈渝老师也在很多生态连接工作。
张汉东:
建议:高校教育:推动Rust语言在高校中的普及,培养新一代的Rust开发者。
• 课程设计:将Rust纳入计算机科学课程,设计系统化的Rust编程课程,包括基础语法、系统编程、高性能计算等内容。
• 教材编写:编写和出版Rust编程教材和参考书,提供权威的学习资源。
• 实验室建设:在高校建立Rust编程实验室,提供实践机会和研究平台。
• 合作项目:鼓励高校与企业合作,开展基于Rust的科研项目和实习项目,提升学生的实践能力。
• 竞赛和活动:组织和赞助大学生编程竞赛、黑客松等活动,激发学生对Rust编程的兴趣。
观点讨论
@韩文弢 :@张汉东 课程这块我个人的想法更倾向于不要单独讲Rust语言,而是和系统编程结合起来讲,可能跟现在的培养方案会更契合。
Question 5
**主持人:**展望未来,Rust语言将会往什么样的方向发展,有望在哪些领域取得突破?对于Rust语言与系统及其生态未来的发展有哪些建议?
张伟:
可能的发展(研究)方向:Rust程序与形式化验证/证明技术的结合(例如,把分离逻辑与Rust语言进行有机结合)。
对生态发展的建议:继续保持社区参与者的多样性,坚持“人民是历史的创造者,是真正的英雄”这一基本原则。
陈渝:
我觉得Rust会向智能移动机器人、智能驾驶、无人机等对性能、安全、实时、高可靠等要求高的领域发展。这些领域也许不像现在的桌面 Windows,服务器 Linux那样,一个OS独霸天下,而是多种功能/性能/服务能力各异的OS共存。所以面向这些领域,开发出各种各样可灵活组合各种系统/应用软件的Crates是我们需要关注的。
韩文弢 :
我感觉Rust在目前发展阶段还更需要有组织地来开展,尤其是第三方库的整体规划和协调。这点可能会和能否出现 Killer Application 同样重要,成为 Rust 最终能走到哪里的胜负手。
向勇:
当一种有新特征的语言出现时,我们都从内核开发的角度来考察这种语言是否有可能用于内核开发,并带来开发效率和性能上的方便。从这个角度来说,我看上了Rust语言的异步机制,并预期它可以带来内核并发性和安全性的改善,也许还能对内核结构有一些好的影响。目前我们正在这方面进行一些尝试。
徐辉:
我觉着从现象上看,Rust语言的发展还是明显走上坡路的,近两年计算机领域顶会上Rust的论文开始逐渐增加,例如ICSE 2024就至少有5篇Rust相关的论文,说明这个领域关注的人开始逐渐增多。最后谈一下愿望吧,希望国内能出现越来越多Rust核心代码贡献者,能开发出一些真正有影响力的Rust项目。我个人并不是Rust的狂热爱好者,但是非常欣赏Rust的安全思想以及其新颖的设计。我们团队未来也会在这方面继续投入,针对Rust语言及其生态发展的关键问题进行研究,为Rust语言的发展贡献力量。
田洪亮**:**
Rust是一个以安全著称的语言,所以我很关注它继续提升安全性的一些努力。比如,制定Rust语言的官方specification(RFC 3355),期待这个spec能精确定义到底什么是undefined behaviors。再比如,稳定Rust ABI(搜索“Rust ABI Wiki”),目前Rust没有稳定的ABI,所以难以动态加载一个Rust原生模块。还有像Rust语言与形式化验证技术的结合,Rust crates的安全审计与软件供应链安全等问题。
马全一:
Rust 未来会在很多领域突破,像大前端的编译很多公司都采用 Rust 开发自己对工具集。当前可能产生突破的应该是操作系统的虚拟化领域,rust-vmm 项目已经在Google、Intel、华为、阿里等、AWS 等公司的参与下开发了7、8 年的时间,很多云计算的厂商都在使用 rust-vmm 构建自己的虚拟化解决方案,是目前能看到的成熟度最高的一个大型开源项目。
Rust 生态的发展还是需要更多的开发者,从学习计算机的最初阶段就学习 Rust 是最好的入门,这样学习曲线会更加平顺,所以高校教学对于 Rust 发展是重中之重。鼓励大家用 Rust 重写一切,Killer Application 一定会产生。
戴钎:
未来发展方向:
1、用起来:在更多领域(如AI、区块链)取得突破。类似Python作为AI主要语言存在性能问题,其业界也给出了平替Mojo,但其实直接可以用Rust,这也是马斯克曾经在X上发表的观点。
2、生态系统扩展:发展更多高质量的库和框架。此外针对存量的C/C++库进行Rust的转换而不是binding。
3、文档和工具改进:优化编译器和工具链,完善各种文档,提高开发效率。
建议:
1、社区建设:加强社区合作,共享资源和经验。尤其要针对Best practice进行汇集和沉淀,加速圈外开发者的转化和切入。
2、教育支持:提供更多教育资源,降低学习门槛。
3、持续创新:保持语言的现代化和创新性,满足未来需求。这一点要向现代C++的演化路径学习。
观点讨论
**@赵俊民:**Rust特点,尤其高的学习成本和理解成本,我个人理解注定是在一个特定领域有应用,成为一个广泛的应用很难
张汉东:
简单预测一下,未来 Rust 在下面这几个方向很有前景:
- 操作系统:面向新时代和细分垂直领域的操作系统。
- 嵌入式系统和物联网、汽车领域、数字金融:安全性和人们的生活密切相关了。
- 大模型基础设施:推理引擎、大模型应用性能和安全关键基础设施、大模型训练数据通信性能基础实施等。
- 跨平台应用基础设施:移动 / 桌面/ Web App 开发。
- WebAssembly:Rust 与 WebAssembly的紧密集成将推动其在 Web 开发、云原生、人工智能等领域应用。
- 企业级应用:随着生态系统的成熟,Rust将越来越多地被用于企业级应用开发。
发展建议:
- 开发新工具:根据企业需求开发新的调试工具、性能分析工具、监控工具等,提高开发和运维效率。
- 社区活动:组织线下和线上的技术分享会、黑客松、编程竞赛等活动,增强开发者之间的交流和合作。
- 在线平台:建立和维护Rust学习和交流平台,如论坛、聊天群组、博客等,提供一个活跃的交流环境。
- 认证体系:建立Rust开发者认证体系,为企业提供权威的技能评估标准,帮助企业识别和招聘优秀的Rust开发者。
- 岗位建设:推动更多企业采用Rust,提供商业支持和服务,增强 Rust 在工业界的影响力,提供更多 Rust 岗位。
- 社区贡献:鼓励开发者和企业贡献开源代码和文档,推动开源项目的发展。
蓝登峰:
我们正身处一个万物互联、人工智能大发展的时代,Rust以其卓越的高性能和安全性特性,预示着它将在操作系统、嵌入式系统、人工智能、数据处理、WebAssembly、云原生等多个领域占据重要地位。
Rust在技术生态系统中的发展可能采取多种形式。对于已经广泛使用的成熟软件(Linux/Android...),Rust会如同古希腊传说中的忒修斯之船,循序渐进地融入其中,这种融合是对现有技术的一种进化。通过这种逐步的、深入的采用,Rust将增强这些系统的性能和安全性,同时也为它们带来更强的生命力和可能性。
对于正在开发的系统软件项目应当主动拥抱Rust生态。
有效地进行需求引导,包括在一些关键领域优先采用内存安全型编程语言实现的软件,推动Rust生态发展。
观点讨论
**@赵俊民:**不太看好Rust成为类似c/c++/java这种应用广泛的语言
@陈渝:@赵俊民 编程语言的发展要有一个很长的历史阶段,我觉得Rust不会取代C/C++/Java,但热门应用会推动语言的发展,就像现在AI应用推动了Python的发展,网页应用推动了javascript的发展。如果安全+性能是未来热门应用(如机器人等)的关键要素,Rust可能会成为这些热门应用的底层支撑,那Rust会有很大的应用发展空间。
**@赵俊民:**安全领域应该会越来越用Rust,尤其机器人系统
**@李弋:**rust等强安全语言,对非kernel得系统编程,特别是运行时的开发,肯定有很大的帮助。如果做kernel编程的活,理论上应该不需要那么复杂的机制,这个主要还是靠人。
**@赵俊民:**美国政府最近发了不少文章在推动安全编程语言,一个国家层面都在推动。确实感觉有点匪夷所思。
**@李弋:**让开发人员用得开心,语言就能普及。
@张汉东:@赵俊民 这是对内存安全的需求,很正常吧
@马全一 :@赵俊民 工信部也有一些推动
@赵俊民:@李弋 Rust做不到😭
@戴钎:@李弋 这个感觉Rust不具备first glance的美感
**@张汉东:**美国一些公司已经把 Rust 用于国防了
**@戴钎:**这就是要社区推动的意义
**@李弋:**所以注定就是特定人群的工具了
@张汉东:@李弋 没有人想要一个脆弱的系统,是大众的需求
@戴钎**:**@李弋但是,对于资深程序员来说,很香!
@马全一:@张汉东Kubernetes 都能上战斗机,Rust 开发的程序进入国防这太正常了
**@张汉东:**Rust 的出现,已经把安全从可选项,变为了必选项
@陈渝:@李弋不久的将来大部分人是用自然语言编程,现在的编程语言注定都是面向特定人群的😊
**@戴钎:**如果让我再去写大型系统,绝对不可能回去用C/C++了
**@赵俊民:**我用了一些,就Rust那个错误返回就很不习惯
@韩文弢:@赵俊民 但是错误处理这点恰恰是 Rust 设计比较出彩的地方。
@李弋:资深,很多时候,希望把语言的约束去掉。因为大拿知道自己在干啥
**@张汉东:**Rust 程序分析领域还没有出现知名项目,但看到有些相关开源项目
@戴钎:@李弋不是一个概念上的问题,而是实际收益的问题,尤其针对工程实践来说
@冯洋:@李弋那就变成了C了😂
**@戴钎:**如果对于学术界其实体会还不那么深,但是对于工程人员来说,少加点班,发布更可控更安心的release,幸福感会提升。之前处理过CER崩溃问题,针对C、C++的大型系统,基本上很多时候是无解的。这也是为啥Mozilla工程师说他们那个bug活了7年解不掉
@马全一 :@赵俊民 我理解 Rust 并没有强制整个系统的错误返回机制,可以用 Result、Enum 等多种方式组合自己的错误处理逻辑,这是给了开发者一个自由度。
**@张汉东:**Rust 基金会之前想申请到瑞士失败了,但 Rust 是开源的,这个风险比较低。但是如果能把中国社区也推动起来,让 Rust 及其生态离不开中国的贡献,这个风险也会降低很多。
**@马全一:**所以社区里面有 thiserror 这样的库
**@李弋:**语言越复杂,大部分人写起来就不知道怎么回事。python常用的功能其实挺简单的,受众人群就多了。
**@马全一:**这个就是要说,国内做编译器方面开发的人太少了,能在国际社区影响力建立起来需要太多的外部资源推动了
@张汉东:@李弋刚才我们讨论的问题一,也说过了,Rust 的出现是为了解决长久的内存安全问题,不是为了让大众采用,本身问题领域就非常复杂,不可能设计得像 python 那么简单而达到它的目的
@李弋:@张汉东 赞同。所以语言的设计是目标导向的。但是复杂的语言,本身的正确性也挺难认证的。这应该是另外的问题了
**@戴钎:**我也赞同自动驾驶等AI相关领域,Rust机会很大,因为很多和人命相关的,不能出错。包括医疗相关的系统等等。
**@马全一 :**这个要靠国家,企业没有收益是不做事儿的,高校需要有国家项目的支持才行
**@张汉东:**你看 Mojo ,虽然有python 的皮,但实际用起来也不会很简单,你的心智负担不会比 rust 更轻
**@赵俊民:**c++也在反抗Rust,也在做安全特性增强😊
@戴钎:@赵俊民 有些东西是基因里带来的,C/C++很自由
**@赵俊民:**未来各个编程语言基本越来越类似。最近仓颉也是广泛吸收
@韩文弢:@赵俊民 趋同进化
**@戴钎:**刚开始我这里用Rust的时候,有时真想换成C++算了,太憋屈了,这也不行那也不行;现在不会这么想了,我们团队成员也是这个感想,初期都是抵触的。我的一个同事,直到Rust代码给他检查出一大堆线程安全问题之后,马上观念就转变过来了。
**@戴钎:**由于现代大型系统软件的开发,各个模块各有分工,各自在模块开发测试的时候都没问题,但是集成测试就各种鸡飞狗跳。内存问题和线程安全问题,往往是在最后发现的。也非常难以调试和定位。
@李弋:@戴钎 这种情况,啥语言也搞不定吧
@戴钎:@李弋问题是在于内存和线程这两个问题,很难调试定位,就给你丢个segment fault,或者直接崩溃、卡死,集成之后,无从下手。
@王俊吉:@戴钎 是的,并且对于Rust与C++历史代码并存的项目里面,还可能本来是C++的问题结果gdb进去停在Rust代码的。这种情况可能还需要一些内存隔离手段
@戴钎:@王俊吉 这里涉及到一个unsafe管控的问题
**@赵俊民:**能大规模使用还是挺不容易的,目前我们程序员都是忙着开发需求和解bug,让他们学习或者试点都找不到
@戴钎:@赵俊民 需要高层强推,我们其实也是高层强推的,当然之前要充分调研达成共识。有点当年任正非在华为强推IBM IPD的味道。
@赵俊民 目前我们希望推广的三个比较新的技术方向,eBPF可观测,Rust,LLM,就剩下Rust太难搞
@李弋:@赵俊民 先过函数语言关
李弋:
看到各位老师精彩的发言,学到很多。一直有个疑惑,正好借着这个机会问一下各位老师:
现代语言,包括Rust,在保持语法相对简单的情况下,实现比较高级的功能,通常都要靠运行时库来支持。
我们所谓的系统编程,其代码应该是运行在kernel空间里(这里不考虑微内核操作系统这种内核和用户态混合的操作系统)。那么语言运行时库就得满足kernel代码的要求。不知道这个如何解决?如果不用高级机制,写起来是不是跟C差不多?
C是比较纯粹的语言,可以不用标准库;用来写OS就非常合适,反正没有高级功能。Linux kernel中用的一些"标准函数",好像是重写过的。
观点讨论
@张汉东:@李弋 对,你可以把 Rust 看作是重新设计的 C
**@张汉东:**其实关于什么是系统编程,Rust 语言团队leader Niko / Cpp 之父 / D 语言之父 / Swift 之父,在 2014 年专门在一场圆桌论坛里讨论过这个问题
**@张汉东:**可以去油管搜一下。现在说的系统语言,应该不局限于只能在 kernel 空间里运行
@戴钎:@李弋 Rust的安全性体现在静态和动态两个方面,其中以静态为主,也就是说,很多安全检查是在编译期就做掉了,这一点C是做不到的。其次作为OS底层开发来说,仍然有core的相关基础库可以调用,而对std相关部分,可以依据自身OS的需求定制化实现,但是总体还是安全性非常高的。底层的Rust仍然是Rust,和C差别还是很大的
@田洪亮:@李弋 在用户态,Rust std就可以认为是你说的“在保持语法相对简单的情况下,实现比较高级的功能,通常都要靠运行时库来支持。”在内核态,是所谓的no_std环境,没有Rust std。为了解决这个问题,我们提出了ostd(https://asterinas.github.io/api-docs/0.6.0/ostd/),可以简单地理解为内核台的(非官方)Rust标准库,可以解决你说的需求。
**@李弋:**感谢各位老师的解答
@张汉东:@田洪亮 这个内核态 ostd,可以和 rust for linux 的 kernel-rs 兼容吗
@田洪亮:@张汉东 理论上,我们可以把ostd移植到linux。但实践中,这样做吃力不讨好,因为linux的rust需求由rust for linux满足最好
@张汉东:@田洪亮 了解
**@彭鑫:**Rust对很多人(包括我😊)而言都是都是比较新的话题,今天的访谈也让我们有了更多的理解。
访谈结束
CodeWisdom
一个有知识的软工公众号
发现智能化编程之道