用Rust重写数万行C代码,有必要吗?

2024年 3月 13日 95.3k 0

在过去的一段时间里,“用Rust重写”的趋势席卷了整个开发领域。作为一颗冉冉升起的新星,Rust不仅承诺更好的内存安全性和更高的技术稳定性,还可以兼顾开发和执行效率。这也使得越来越多的系统开发人员转向这种面向未来的编程语言。

就在最近,另一个知名的开源项目Ockam放弃了系统中数万行C语言代码,最终用Rust重写了整个项目。在完成这个庞大的项目后,Ockam的创始人Mrinal Wadhwa分享了他带领团队从C到Rust的历程。

1,C语言:迷人的陷阱

作为一个开源的开发者工具,Ockam在GitHub上有3.3万颗星。其核心功能是帮助用户构建可信的动态数据,并为用户应用程序添加端到端加密和认证通信;确保应用程序具有端到端的数据完整性、真实性和机密性。

研发团队希望Ockam可以在任何环境中运行,包括受限的边缘设备或强大的云服务器。除此之外,Ockam的另一个目标是可以在任何类型的应用程序中使用,而不管应用程序是用什么语言构建的。

这样的需求使得C语言成为构建Ockam项目的候选语言——它可以为大多数设备编译,并且所有流行的语言都可以通过某种形式的接口调用C库。在这种情况下,Ockam能够为所有其他语言提供惯用的包装器。

该团队的想法是将以通信为中心的核心协议从硬件行为中分离出来,并为它想要支持的硬件提供可插拔的适配器。考虑到这个想法,开发人员在初始版本中将Ockam项目的核心实现为C库,并用其他语言包装器包装该库。

2,安全问题

然而,尽管基于Ockam内核实现的C库满足了项目到处运行的需求,但由于C语言内存管理的弱点,团队实现的C库中许多与加密相关的代码容易出现漏洞,一个小错误就可能导致系统变得不安全。

这与Ockam项目的目标完全相反,Ockam项目的目标是隐藏这些问题,并提供一个易于正确使用的开发人员界面。该团队开始尝试使用C语言构建安全简单的接口。但经过多次迭代,开发人员逐渐发现,他们必须掌握大量关于协议状态和状态转换的细节,即使他们非常小心,代码中也总会存在无法检测到的漏洞。

3,Elixir:不合格的继承人

面对极其痛苦的迭代工作,仍然无法解决内存安全问题的Ockam决定放弃C语言,寻找更适合这个项目的继任者——当时,他们把目光投向了基于erlang的Elixir语言。

Elixir程序在提供Erlang进程的Erlang虚拟机BEAM上运行。Erlang进程是轻量级的有状态并发参与者。由于参与者可以在保持内部状态的同时并发运行,因此很容易运行并发状态协议栈:Ockam传输 + Ockam路由 + Ockam安全通道。

但不幸的是,Elixir天生就是为支持高负载项目而设计的,不能像C语言那样在小型或受限的计算机上运行。此外,Elixir的生态还不够成熟,对于某些特定的语言管理包装器来说不是一个好的选择。

4,Rust

在经历了连续的失败之后,Ockam团队意识到他们的核心需求是在确保安全性的同时实现轻量级参与者,但是C语言和Elixir都无法完美地适应。从此,Wadhwa开始带领团队研究Rust,并很快发现了这门语言的独特魅力。

Rust库能够导出与C调用兼容的接口。这意味着任何静态/动态链接或从C库调用函数的语言都能够以完全相同的方式从Rust库调用函数。由于大多数语言都支持C中的本机函数,因此它们也支持Rust中的本机函数。从包装器的角度来看,Rust和C之间几乎没有区别。

Rust的内存安全特性消除了use-after-free、double-free、溢出、越界访问和许多其他常见错误的可能性。根据之前的调查,这些错误导致了C或C++库中60-70%的关键漏洞。Rust在编译时提供了这种安全性,这使得它在编写需要高性能、在受限环境中运行和高度安全的代码时具有很大的优势。

研发团队坚信Rust和Ockam是天作之合的最后一个原因是Rust中的async/await。Ockam需要轻量级参与者来创建简单而安全的协议栈接口。async/await意味着在tokio和async-std等项目中已经完成了许多创建actor的工作,团队可以在此基础上轻松构建Ockam的actor实现。

基于rust的async/await无论在大型机还是微型计算机上运行,都可以向用户提供完全相同的界面,位于Ockam Workers上的协议接口也可以呈现完全相同的简单接口。

最终,在Wadhwa的带领下,Ockam放弃了系统中数万行C语言代码,用一段时间完成了对Rust的全面改造。经过重写后稳定性的多次迭代,任何用户现在都可以使用重新激活的Ockam包,通过简单的函数调用,在任何设备上创建他们想要的端到端加密和相互认证的安全通道。

5,值得期待的未来

Ockam的故事实际上只是一个缩影。对于今天被内存安全问题困扰的绝大多数项目来说,使用Rust或基于Rust的重构不再是一个实验或赌注,而是一个足够实用和可靠的解决方案。

在Ockam之前,微软在4月份宣布,出于内存安全考虑,它将使用18万行Rust代码重写核心Windows库;Armin是Python web框架Flask的作者,他在一篇关于Python 2023发展趋势的文章中也提出了将Rust集成到Python项目和工具中的想法;Ruff的创始人在成立新公司时,也曾宣称未来将通过Rust彻底改变Python生态系统。

更令人欣慰的是,Rust的进化还在继续。根据其发布的Rust 2024路线图,官方团队将在未来继续努力,降低学习门槛,加强生态连接。帮助Rust尽快摆脱饱受诟病的“高门槛”标签,让它尽快在更多场景中发挥价值。在这方面,Rust的未来确实值得我们每个人的期待。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论