关注了就能看到更多这么棒的文章哦~
June 8, 2021
This article was contributed by Ayooluwa Isaiah
DeepL assisted translation
https://lwn.net/Articles/857599/
随着内存安全(memory-safe)语言的发展(特别是 Rust 语言),我们应该来看一下目前在进行的将存在了几十年之久的 C 语言代码移植到 Rust 的大规模工作。uutils project 旨在用 Rust 重写 GNU Coreutils 项目中的所有实用程序(utilities)。该项目最初由 Jordi Boggiano 在 2013 年创建,旨在完美替代 Coreutils 程序,并且增加 Rust 所提供的 data-race 的保护以及内存安全特性。
许多读者都对 Coreutils 项目感到熟悉。它包括基本的文件操作、进程操作,以及文本操作的工具,这些工具在每个基于 GNU 的操作系统中应该都存在。Coreutils 项目创建出来就是为了整合以前单独提供的三套工具,即 Fileutils、Textutils 和 Shellutils,还有其他一些杂项工具。该项目中包括的许多程序,比如 rm、du、ls 和 cat,都已经存在了几十年,尽管存在其他实现了类似功能的工具。这些工具本身并不能直接在 Windows 等平台上运行。
总的来说,Coreutils 程序被认为是比较容易出成果的领域,应该可以在较短的时间内开发出基于 Rust 的替代版本。每个工具的要求都很明确,而且许多工具在概念上来看都是很简单的,但实际上工作并不一定很容易。虽然在使 uutils 进入可用状态方面已经取得了很大的进展,但要达到 Coreutils 现在相同的稳定程度和成熟程度还需要一些时间。
在这个项目中使用 Rust 本身可以加快开发速度,因为它可以完全消除许多可能的内存错误和其他未定义的行为。Rust 还为使用高效、无竞争的多线程执行(race-free multithreading)打开了大门,这可能可以在某些条件下加快程序运行的速度。重写 uutils 还提供了一个机会,在重新实现 Coreutils 的过程中还可以增强一些功能,从而在保持与 GNU 版本的兼容的前提下,提供更好的用户体验。例如,在 Coreutils 项目中长期未被接受的一些功能(比如为 mv 和 cp 等工具添加参数来显示进度条),目前正在重写为 Rust 版本的过程中被重新考虑。
在项目的 GitHub 页面上可以看到一个表格,其中的实用程序被分为三栏。"已完成"、"半完成(Semi-Done)"、"待完成(To-Do)"。在写这篇文章时,正在进行开发的 106 个实用程序中只有 23 个还没有进入 "完成" 状态,其中 16 个被标记为 "半完成",7个在 "待完成" 栏。在 "待完成" 栏下的实用程序,要么根本没有被处理,要么目前正在进行初步实现(如 pr 和 chcon)。那些在 "半完成" 状态中的工具都有一些尚未支持的选项参数,或者它们的行为在某些情况下与 GNU 的同类工具略有不同。比如说:
tail 不支持 -F 或 –retry 标志。
more 在用管道输入时会失败,如 "cat foo.txt | more"。
install 缺少 -b 和 -backup 标志的支持。
有几个工具不支持非 UTF-8 的参数,尽管当前通过把命令行参数解析从 getopts 迁移到 clap 已经缓解了这个问题。
切记,一个程序被标记为 "完成" 并不意味着所有的测试都通过了,也不意味着这个工具和 GNU 版本具有相同水平的性能和内存效率。例如,有一些尚未解决的问题是关于要改进 factor 的性能(当前大约慢 5 倍)和 sort 工具的性能(当前慢 1.5 倍到 6 倍)。其他有些情况下,uutils 版本的工具比对应的 GNU 版本要更快。其中一个例子是 cp 工具,它的性能有了明显的提高,这主要是由于使用了 sendfile() 和 copy_file_range() 系统调用,尽管 GNU 版本之前已经形成了一些方案,但一直没能真正用起来。
目前,Coreutils 测试套件中的 624 个测试只有 142 个是成功状态,而 GNU 版本则可以通过大约 546 个测试。然而,应该注意的是,许多错误是由于命令输出的细微差异造成的。
还有一个单独的表格,展示了 uutils 项目目前支持的所有平台和架构。几个主要的操作系统(Linux、macOS 和 Windows)在相应的各种不同架构中都有记录,尽管相当多的实用程序目前还没有在 Windows 上编译生成过。FreeBSD、NetBSD 和 Android 上大多数工具也已经有了编译好的二进制文件,除了少数实用程序(比如 chroot、uptime、uname、stat、who 等等)之外。Redox OS、Solaris、WebAssembly 和 Fuchsia 这几行的行目前都是空白,这反映了目前这些平台的优先级较低。
uutils 项目目前的版本是 0.0.6,已经被打包到各种 Linux 发行版和打包系统的仓库里了。值得注意的是,Sylvestre Ledru,Mozilla 的主管,同时也是 Debian 和 Ubuntu 项目的上贡献了许多工作的开发者,已经带头将该项目打包到 Debian 作为 GNU Coreutils 的替代品。它目前的状态被判定为足以让一个装有 GNOME 的系统能正常启动和运行、然后安装 1000 个最流行的 Debian 软件包、并构建 Firefox、Linux 内核和 LLVM/Clang。此外,uutils 也已经进入了 Arch Linux(Community 版本)、Homebrew for macOS 和 Exherbo Linux 发行版的软件库中。
需要关注 uutils 项目的许可证(Licensing)。该项目中的所有实用程序都是在 permissive MIT 许可下授权的,而不是 GNU Coreutils 的 GPLv3 许可。这可能会使它在那些不接受 GPLv3 许可的软件的地方(因为 GPLv3 不支持 Tivoization 即限制只能执行某些版本,等等)更有吸引力。使用 MIT 许可证这一决定有一些人提出过反对,他们在 GitHub 中相关的 issue 上对这个选择提出了异议,他们宁愿看到在这种项目上使用 copyleft license。
主要的批评意见同样还是类似过去对 FOSS licensing 的争论:non-copyleft license 对最终用户的自由是有害的,因为它允许个人或组织将项目中任意部分纳入设备或其他软件的发行版中,而不需要提供源代码,这样就导致其他人不可能研究、修改或改进它。还有人担心,许可证的选择出发点实际上是为了最大限度地提高 Rust 的使用,而没有考虑其他方面的影响。用更宽松的许可证下的替代品取代 GPL 许可的工具,在一些人看来是一种倒退。
关注 uutils 项目发展的最好方式是关注它的 GitHub 仓库和官方 Discord 讨论。要想知道如何开始为项目做贡献,可以在 git 仓库中的一份文件中看到介绍。
要使 uutils 准备好用在生产环境中的话,还有很多工作要做。该项目被定位为开始尝试 Rust 开发的一个很好的途径,并且已经有了一个 issue list,可以供新来者作为上手项目。该项目目前的重点似乎是达到与 GNU Coreutils 完全的兼容,并在解决其他问题之前计划先提高测试覆盖率。而诸如删除不必要的依赖项、提高性能、减少内存使用等问题,计划在消灭了兼容性问题之后再来解决。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~