NiQin (blog: 泥芹) shared the aphorism --
I returned and saw under the sun, that the race is not to the swift, nor the battle to the strong, neither yet bread to the wise, nor yet riches to men of understanding, nor yet favour to men of skill; but time and chance happeneth to them all. -- 《圣经》

[Rust] 让我们用 Rust 重写那些伟大的软件吧

💥 内容涉及著作权,均归属作者本人。若非作者注明,默认欢迎转载:请注明出处,及相关链接。

Summary: 20 世纪 20 年代,时代选择的语言可能是(也许已经是)Rust。这是一门罕见的,能让软件程序员和硬件程序员都满意的语言。目前,很多伟大的软件,都在用 Rust 进行重写。这些事情是潮流,并非 Rust 在炒作。

Topics: rust 安全编程 可信计算 安全代码 secure-code

本文摘选和整理自 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 都阐述过重写软件这种做法的愚蠢,重写软件也在圈子内被广泛嘲笑。但是,在软件行业里面,重写软件仍然是一项乐此不疲的运动。

各时代的编程语言

回顾过去,每一个十年,都有自己时代选择的编程语言,世界被一次又一次地改写。

  • 20 世纪 60 年代:Fortran(因为 IBM!)
  • 20 世纪 70 年代:BASIC(因为 Byte Magazine!)
  • 20 世纪 80 年代:Pascal(因为结构化编程!)
  • 20 世纪 90 年代:C++(因为面向对象!)
  • 21 世纪初:Java(因为万维网!)
  • 2010 年:JavaScript(因为……啥原因?!)

我们来玩预测游戏,哪一个编程语言将是 21 世纪 20 年代的选择,也就是说,世界将被哪一个编程语言改写?

显然不是 Java、C#、F#、Dart、Swift,或者 Kotlin。

是 Go 吗?显然不是,因为它在某种程度上被限制了,仅限于创造本地云工具或独立的跨平台命令行程序。

Rust 将改写世界

经过仔细分析,20 世纪 20 年代,时代选择的语言可能是(也许已经是)Rust。这是一门罕见的,能让软件程序员和硬件程序员都满意的语言。

Rust 显示了许多迹象(非全部):

  • 开源的,托管在 github,我们都知道:开放者总会胜利(open always wins)
  • 具备泛型特性,这是解决霍尔难题的基础选项(译注:托尼·霍尔,Tony Hoare,快速排序算法、霍尔逻辑、交谈循序程式设计者,图灵奖得主)。
  • 没有继承(inheritance)特性,而是由 trait 组合(composition)。
  • 不依赖异常来处理错误,而是 Result 泛型类型。
  • 没有垃圾收集器,而是在编译期间控制引用生命周期和所有权。
  • 包括流行的功能性编程结构,如:lambdas、map/filter/reduce,甚至做的更好。
  • 免费图书,以及在线演练。不必在本地计算机上安装任何东西,就可以学习 Rust。
  • 即使为了使代码看起来像脚本,而使用了类型推断,但 Rust 有一个强大的类型系统,可以在编译时解决缓冲区溢出问题。
  • 可以通过 curl 脚本安装在任何终端。
  • 现成的算法和抽象库,以“自带电池”的方式吸引了系统和应用程序开发人员。
  • 具有内置功能单元测试.
  • 变量在默认情况下是不可变的。
  • Rust 宏,C 语言宏的智能进化,混合了 C++ 模板元编程。
  • 数组,将长度作为其类型的一部分,可以很容易地在同一处初始化。
  • 编译器生成非常高效的代码,并且可以进行交叉编译。甚至可以生成独立的静态链接二进制文件,准备在 Docker 容器中使用。
  • 有年度开发者大会,名为 RustConf,有专有的 Rust 官方周报;有专有的 Awesome Rust 页面,在 Stack Overflow 上有很多问题和答案。
  • 使用大括号,并且 rustfmt 工具消除了因样式而造成代码冲突的风险。
  • goto 不是关键词,尊重迪杰斯特拉( Dijkstra)戒律。
  • ……

简而言之,Rust 会成为时代的选择。

Rust 生态系统

让我们来看看 Rust 在各个行业的使用。

  • Mozilla(Rust 创造者)用 Rust 重写旗舰浏览器。
  • Linus Torvalds 确信 Rust 将接管 Linux 内核。同时,很多公司都在用 Rust 重写其软件或者游戏,如 coreutils(GNU)、alacritty(OpenGL)、……,甚至包括 LaTeX。
  • 微软,在“可信计算”演示后的 20 年,仍然认为内存安全问题占所有安全漏洞的 70%。因此 Rust 是目前安全系统编程的最佳机会。微软对 Rust 的兴趣如此之大,以致于它加入 Rust 基金会,促进 Rust 成为在 Kubernetes 上的应用程序的可靠替代方案。
  • 谷歌正在将 Rust 推向安卓(用于重写蓝牙部分),及其 Linux 内核。Rust 也用在谷歌的新操作系统 Fuchsia。
  • 英特尔说 Rust 是“系统编程的未来”。
  • 亚马逊使用 Rust 建造 AWS Firecracker 系统。
  • Dropbox 使用 Rust 重写它的同步引擎。
  • 苹果招聘了大量 Rust 工程师。
  • JetBrains 有支持 Rust 的IDE 插件(vsCode 也有,eclipse、vim 等同样有)。
  • IBM 开发者网站一直在进行 Rust 教授。
  • Stack Overflow,Rust 语言连续 5 年在“最想学语言排行榜”位列榜首。
  • Discord 切换到 Rust 语言。
  • Figma 在生产环境中,将 Rust 引入后端产品。
  • 云应用中,Linkerd(Rust 开发)比 Istio(Go 开发)更高效和受欢迎。
  • 甚至 JavaScript 和 npm 都正在使用 Rust 重建。
  • Python 和 Rust 的互操作已经较为成熟。
  • 有人在忙于开发 Java 和 Rust 的互操作。
  • 有人在忙于开发 .net 和 Rust 的互操作。
  • ……

即使不是所有人抱有同样的热情,但很明显,这些事情是潮流,并非 Rust 在炒作。

RIIR(Rewrite It In Rust),用 Rust 重写它

你可能经常在博客上、在 github issues 中、在朋友圈等地方看到一些“讨厌的”言论——用 Rust 重写它?现在,在 github 上 有个项目称作 RIIR(Rewrite It In Rust,用 Rust 重写它),星星数 300 左右;也有其 twitter 账户。另外,本文开头提到的后 2 篇文章中,阐述用 Rust 重写的合理性、可能性,以及示范先行项目。

说这个项目是个玩笑,但又有那么些真实性。毕竟现在,不少公司真的在用 Rust 重写一些久远的软件。

结语

Rust 会解决今天的一些问题,比如安全编程相关。同时,我们也需要明白,虽然目前无法预料,但 Rust 也会带来新的问题。

让时间来验证吧!

谢谢您的阅读!


Related Articles

  1. [Rust] RustHub.org:基于 Rust-Web 技术栈,及 image-rs、fluent-rs、rhai-script ……
  2. [WebAssembly] yew SSR 服务器端渲染
  3. [Rust] async-std 创建者对于最近“项目是否已死?”,移除对其支持等的答复
  4. [Rust] Rust 1.56.0 版本和 Rust 2021 版次发布,新特性一览,及项目的迁移、升级
  5. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 WebAssembly 博客应用的体验报告
  6. [Rust] Rust 官方周报 399 期(2021-07-14)
  7. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 web 前端(5)- 构建 HTTP 请求、与外部服务器通信的两种方法
  8. [Rust] Rust 官方周报 398 期(2021-07-07)
  9. [Rust] Rust 官方周报 397 期(2021-06-30)
  10. [Rust] Rust 官方周报 396 期(2021-06-23)
  11. [Rust] Rust 官方周报 395 期(2021-06-16)
  12. [Rust] Rust 1.53.0 明日发布,关键新特性一瞥
  13. [Rust] 使用 tide、handlebars、rhai、graphql 开发 Rust web 前端(3)- rhai 脚本、静态/资源文件、环境变量等
  14. [Rust] 使用 tide、handlebars、rhai、graphql 开发 Rust web 前端(2)- 获取并解析 GraphQL 数据
  15. [Rust] 使用 tide、handlebars、rhai、graphql 开发 Rust web 前端(1)- crate 选择及环境搭建
  16. [Rust] Rust 官方周报 394 期(2021-06-09)
  17. [Rust] Rust web 前端库/框架评测,以及和 js 前端库/框架的比较
  18. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 web 前端(4)- 获取 GraphQL 数据并解析
  19. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 web 前端(3)- 资源文件及小重构
  20. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 WebAssembly 标准的 web 前端(2)- 组件和路由
  21. [WebAssembly] Rust 和 Wasm 的融合,使用 yew 构建 WebAssembly 标准的 web 前端(1)- 起步及 crate 选择
  22. [Rust] Rust 官方周报 393 期(2021-06-02)
  23. [Rust] Rust 官方周报 392 期(2021-05-26)
  24. [Rust] Rust 中,对网址进行异步快照,并添加水印效果的实践
  25. [Rust] Rust 官方周报 391 期(2021-05-19)
  26. [Rust] Rust,风雨六载,砥砺奋进
  27. [Rust] 为什么我们应当将 Rust 用于嵌入式开发?
  28. [Rust] Rust 官方周报 390 期(2021-05-12)
  29. [Rust] Rust + Android 的集成开发设计
  30. [Rust] Rust 1.52.1 已正式发布,及其新特性详述
  31. [Rust] 让我们用 Rust 重写那些伟大的软件吧
  32. [Rust] Rust 1.52.0 已正式发布,及其新特性详述
  33. [Rust] Rust 官方周报 389 期(2021-05-05)
  34. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务(4) - 变更服务,以及小重构
  35. [Rust] Rust 1.52.0 稳定版预发布测试中,关键新特性一瞥
  36. [Rust] Rust 生态中,最不知名的贡献者和轶事
  37. [Rust] Rust 基金会迎来新的白金会员:Facebook
  38. [Rust] Rustup 1.24.1 已官宣发布,及其新特性详述
  39. [Rust] Rust 官方周报 388 期(2021-04-28)
  40. [Rust] Rust 官方周报 387 期(2021-04-21)
  41. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(4)- 变更服务,以及第二次重构
  42. [Rust] Rustup 1.24.0 已官宣发布,及其新特性详述
  43. [Rust] basedrop:Rust 生态中,适用于实时音频的垃圾收集器
  44. [Rust] Rust 编译器团队对成员 Aaron Hill 的祝贺
  45. [Rust] Jacob Hoffman-Andrews 加入 Rustdoc 团队
  46. [机器人] 为什么应将 Rust 引入机器人平台?以及机器人平台的 Rust 资源推荐
  47. [Rust] rust-lang.org、crates.io,以及 docs.rs 的管理,已由 Mozilla 转移到 Rust 基金会
  48. [Rust] Rust 官方周报 386 期(2021-04-14)
  49. [Rust] Rust 编译器(Compiler)团队 4 月份计划 - Rust Compiler April Steering Cycle
  50. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务(3) - 重构
  51. [Rust] 头脑风暴进行中:Async Rust 的未来熠熠生辉
  52. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务(2) - 查询服务
  53. [GraphQL] 基于 actix-web + async-graphql + rbatis + postgresql / mysql 构建异步 Rust GraphQL 服务 - 起步及 crate 选择
  54. [Rust] Rust 2021 版本特性预览,以及工作计划
  55. [Rust] Rust 用在生产环境的 42 家公司
  56. [Rust] 构建最精简的 Rust Docker 镜像
  57. [Rust] Rust 官方周报 385 期(2021-04-07)
  58. [Rust] 使用 Rust 做异步数据采集的实践
  59. [Rust] Android 支持 Rust 编程语言,以避免内存缺陷
  60. [Rust] Android 平台基础支持转向 Rust
  61. [Rust] Android 团队宣布 Android 开源项目(AOSP),已支持 Rust 语言来开发 Android 系统本身
  62. [Rust] RustyHermit——基于 Rust 实现的下一代容器 Unikernel
  63. [Rust] Rustic:完善的纯粹 Rust 技术栈实现的国际象棋引擎,多平台支持(甚至包括嵌入式设备树莓派 Raspberry Pi、Buster)
  64. [Rust] Rust 迭代器(Iterator trait )的要诀和技巧
  65. [Rust] 使用 Rust 极致提升 Python 性能:图表和绘图提升 24 倍,数据计算提升 10 倍
  66. [Rust] 【2021-04-03】Rust 核心团队人员变动
  67. [Rust] Rust web 框架现状【2021 年 1 季度】
  68. [Rust] Rust 官方周报 384 期(2021-03-31)
  69. [Rust] Rust 中的解析器组合因子(parser combinators)
  70. [生活] 毕马威(KPMG)调查报告:人工智能的实际采用,在新冠疫情(COVID-19)期间大幅提升
  71. [Python] HPy - 为 Python 扩展提供更优秀的 C API
  72. [Rust] 2021 年,学习 Rust 的网络资源推荐(2)
  73. [Rust] 2021 年,学习 Rust 的网络资源推荐
  74. [生活] 况属高风晚,山山黄叶飞——彭州葛仙山露营随笔
  75. [Rust] Rust 1.51.0 已正式发布,及其新特性详述
  76. [Rust] 为 Async Rust 构建共享的愿景文档—— Rust 社区的讲“故事”,可获奖
  77. [Rust] Rust 纪元第 382 周最佳 crate:ibig 的实践,以及和 num crate 的比较
  78. [Rust] Rust 1.51.0 稳定版本改进介绍
  79. [Rust] Rust 中将 markdown 渲染为 html
  80. [生活] 国民应用 App 的用户隐私数据窥探
  81. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(3)- 重构
  82. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(2)- 查询服务
  83. [GraphQL] 构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(1)- 起步及 crate 选择
  84. [Rust] Rust 操控大疆可编程 tello 无人机

Topics

rust(84)

graphql(17)

rust-官方周报(17)

webassembly(16)

wasm(10)

tide(9)

async-graphql(9)

yew(9)

rust-web(8)

rust-官方博客(8)

this-week-in-rust(6)

mysql(5)

actix-web(5)

rbatis(5)

android(4)

mongodb(3)

json-web-token(3)

jwt(3)

cargo(3)

技术延伸(3)

rust-wasm(3)

trunk(3)

handlebars(3)

rhai(3)

async-std(3)

用户隐私(2)

学习资料(2)

python(2)

ai(2)

人工智能(2)

postgresql(2)

rust-compiler(2)

rust-基金会(2)

rust-foundation(2)

rustup(2)

rust-toolchain(2)

rust-工具链(2)

rust-游戏开发(2)

rust-区块链(2)

rust-2021(2)

graphql-client(2)

surf(2)

rust-game(2)

rusthub(2)

tello(1)

drone(1)

无人机(1)

隐私数据(1)

markdown(1)

html(1)

crate(1)

async(1)

异步(1)

旅游(1)

不忘生活(1)

葛仙山(1)

hpy(1)

python-扩展(1)

正则表达式(1)

解析器组合因子(1)

组合器(1)

regular-expression(1)

parser-combinator(1)

regex(1)

官方更新(1)

rust-工作招聘(1)

rust-技术资料(1)

rust-周最佳-crate(1)

rust-web-框架(1)

rust-web-framework(1)

rust-核心团队(1)

rust-core-team(1)

rust-language-team(1)

pyo3(1)

rust-python-集成(1)

python-性能改进(1)

迭代器(1)

iterator-trait(1)

国际象棋(1)

chess(1)

游戏引擎(1)

game-engine(1)

虚拟化(1)

unikernel(1)

rustyhermit(1)

linux(1)

virtualization(1)

sandboxing(1)

沙箱技术(1)

数据采集(1)

异步数据采集(1)

docker(1)

镜像(1)

生产环境(1)

rust-评价(1)

rust-2021-edition(1)

rust-2021-版本(1)

graphql-查询(1)

vision-doc(1)

愿景文档(1)

代码重构(1)

steering-cycle(1)

方向周期(1)

隐私声明(1)

机器人(1)

robotics(1)

rustdoc(1)

rust-编译器(1)

实时音频(1)

real-time-audio(1)

变更服务(1)

mutation(1)

查询服务(1)

query(1)

rust-贡献者(1)

rust-轶事(1)

rust-稳定版(1)

rust-预发布(1)

rust-测试(1)

安全编程(1)

可信计算(1)

安全代码(1)

secure-code(1)

rust-android-integrate(1)

rust-embedded(1)

rust-嵌入式(1)

rust-生产环境(1)

rust-production(1)

网页快照(1)

网页截图(1)

水印效果(1)

图片水印(1)

yew-router(1)

css(1)

web-前端(1)

wasm-bindgen(1)

区块链(1)

blockchain(1)

dotenv(1)

标识符(1)

rust-1.53.0(1)

rust-1.56.0(1)

rust-项目升级(1)

异步运行时(1)

ssr(1)

tokio(1)

warp(1)

reqwest(1)

graphql-rust(1)


Elsewhere

- Open Source
  1. github/zzy
  2. github/sansx
- Learning & Studying
  1. Rust 学习资料 - 泥芹