前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >让我们用 Rust 重写那些伟大的软件吧

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

作者头像
niqin.com
发布2022-09-01 15:41:17
3.1K0
发布2022-09-01 15:41:17
举报
文章被收录于专栏:Rust 生态与实践

本文摘选和整理自 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 也会带来新的问题。

让时间来验证吧!

谢谢您的阅读,欢迎交流。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust 生态与实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于安全编程
  • 各时代的编程语言
  • Rust 将改写世界
  • Rust 生态系统
  • RIIR(Rewrite It In Rust),用 Rust 重写它
  • 结语
相关产品与服务
服务网格
服务网格(Tencent Cloud Mesh, TCM),一致、可靠、透明的云原生应用通信网络管控基础平台。全面兼容 Istio,集成腾讯云基础设施,提供全托管服务化的支撑能力保障网格生命周期管理。IaaS 组网与监控组件开箱即用,跨集群、异构应用一致发现管理加速云原生迁移。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档