本文摘选和整理自 De Programmatica Ipsum 月刊的一篇由 Adrian Kosmaczewski 于 2021 年 3 月 3 日发表的文章 The Great Rewriting In Rust、Geoffroy Couprie 个人站点文章 Why you should, actually, rewrite it in Rust,以及 ansuz/RIIR 项目文章 Have you considered Rewriting It In Rust?。其中后两篇文章比较早了,朋友们可以直接略过,了解有这么个因果即可。
De Programmatica Ipsum 是一本月刊,由 Graham Lee 和 Adrian Kosmaczewski 合作主编,自称是“两个脑子被烧坏了的老家伙,呼喊着冲向 void *”。这个月刊介绍软件工程的工艺、软件开发人员的生活;重点关注程序员生活中的包容、倦怠/疲惫、创业生活;另外,此月刊也乐于炒作,以及一些不合常理,甚至“异端邪说”的话题——比如上面提到的文章。
2002 年,微软出版社出版了 David LeBlanc 和 Michael Howard 合著的书籍,《编写安全代码(Writing Secure Code),第二版》。此书曾是微软的必读书目,紧随着比尔·盖茨(Bill Gates)的“可信计算(Trustworthy Computing)”备忘录。《编写安全代码(Writing Secure Code),第二版》的第五章题为“第 1 号公敌:缓冲区溢出(Buffer Overrun)”,它从一个非常有趣的历史角度出发,阐述如何编写安全代码,防范缓冲区溢出。书中以 1986 年的莫里斯蠕虫(Morris Worm)为例,甚至可以追溯到 20 世纪 60 年代。
C 语言,通常被称为“可移植汇编(portable assembly)”,没有提供任何防范这种“公敌”的措施。如果你错误地(或有意地)分配了 N 字节的内存,但又写了 N + k(其中 k 是一个严格大于零的无符号整数)。那么,几乎会必然导致缓冲区溢出。比起修复 bug,你还不如重写正在运行的软件。
可以说,缓冲区溢出导致过行业数十亿美元的损失,每一代计算机科学家都为解决这个问题提出了新的想法。曾经寄希望于托管代码和 .NET
框架。关于此,《编写安全代码(Writing Secure Code),第二版》一书第 18 章是以一个轶事开始的:
在 2001 年 11 月的微软专业开发者大会上,我为两篇安全软件论文制作幻灯片时,一位朋友告诉我,我很快就会失业。因为一旦托管代码和
.NET
框架发布,所有的安全问题都会消失。这使我把 SQL 注入演示代码,从 C++ 转换成 C 语言,以证明他错了。
啊,软件从业人员!
安全编程方面,也曾将希望寄予 Java 和 C#,数以百万计的应用程序和数十亿行代码,被一次又一次地用这些现代编程语言重写。虽然 Joel Spolsky、Steve Blank,以及 Peter Seibel 都阐述过重写软件这种做法的愚蠢,重写软件也在圈子内被广泛嘲笑。但是,在软件行业里面,重写软件仍然是一项乐此不疲的运动。
回顾过去,每一个十年,都有自己时代选择的编程语言,世界被一次又一次地改写。
我们来玩预测游戏,哪一个编程语言将是 21 世纪 20 年代的选择,也就是说,世界将被哪一个编程语言改写?
显然不是 Java、C#、F#、Dart、Swift,或者 Kotlin。
是 Go 吗?显然不是,因为它在某种程度上被限制了,仅限于创造本地云工具或独立的跨平台命令行程序。
经过仔细分析,20 世纪 20 年代,时代选择的语言可能是(也许已经是)Rust。这是一门罕见的,能让软件程序员和硬件程序员都满意的语言。
Rust 显示了许多迹象(非全部):
trait
组合(composition)。Result
泛型类型。curl
脚本安装在任何终端。rustfmt
工具消除了因样式而造成代码冲突的风险。goto
不是关键词,尊重迪杰斯特拉( Dijkstra)戒律。简而言之,Rust 会成为时代的选择。
让我们来看看 Rust 在各个行业的使用。
即使不是所有人抱有同样的热情,但很明显,这些事情是潮流,并非 Rust 在炒作。
你可能经常在博客上、在 github issues 中、在朋友圈等地方看到一些“讨厌的”言论——用 Rust 重写它?现在,在 github 上 有个项目称作 RIIR(Rewrite It In Rust,用 Rust 重写它),星星数 300 左右;也有其 twitter 账户。另外,本文开头提到的后 2 篇文章中,阐述用 Rust 重写的合理性、可能性,以及示范先行项目。
说这个项目是个玩笑,但又有那么些真实性。毕竟现在,不少公司真的在用 Rust 重写一些久远的软件。
Rust 会解决今天的一些问题,比如安全编程相关。同时,我们也需要明白,虽然目前无法预料,但 Rust 也会带来新的问题。
让时间来验证吧!
谢谢您的阅读,欢迎交流。