CatCoding

为 Rust 做些小贡献

2022-08-18

有一段时间没有写文章了,最近沉迷于给 Rust Compiler 做些贡献,这里分享一下自己的收获和感受。

契机是那天 Rust Issue 到了 100000这个里程碑,我点进去看了看。想起去年花了一周业余时间做过一个去重复的 diagnostics PR,就顺便看了看些最近的一些 issue,我发现有一个看起来比较适合的 issue,就 assign 给了自己。

过了两天居然在 Teams 收到公司的同事的消息,他问我这个 issue 什么时候能解决,因为 raw-dylib 功能要稳定了,他还在等这个 issue。我平时工作基本不会被催,没想到随便接个开源 issue 会被催,哈哈。于是我很快发了 PR,另外看了看这个 raw-dylib 功能,这涉及到 Rust 链接 dll 相关的,Windows 上不少 Rust 问题依赖这个 RFC。

后面我接着做了几个 diagnostics 方面的 issue,这类问题是最适合 compiler 开发新手的,因为通常来说修复并不复杂。我在这个过程中基本看完了 Rust Parser 这部分的代码。

初学 Rust 一个很重要的技能就是理解 Rust 的报错信息,很多时候是编译器在提示我们写程序。编译器的报错信息特别重要,太少则说明不了问题,太详细则让人抓狂。Rust compiler 在报错这方面真的非常好,基本都是源自于开发者发现了更好的报错方式,自己加上去。

我在做的过程中,发现 Rust 编译器的提示很人性化,比如 Parser 发现你该写 pub 的地方写了个 public ,则会提示你是不是应该写 pub,比如你写了个 import mod,则会提示你是不是应该写 use,甚至发现不容易显示的 Unicode chars,则会提示这里要注意哦。关于生命周期的提示,有的还会加上各种好看的图线标识。

甚至,他们最近开始做 diagnostics 的语言本地化了Diagnostic Translation

另外 Rust 的提示在类型推导后也可以加上更多有用信息,如果我们确定这里的提示就是唯一的修复方法,则可通过 rust-fix 自动修复,所以你能看到 Rust compiler 这个 repo 的单元测试里面有很多 .fix 后缀的对比文件。

我最近在修的另外一个 Bug 是来自 Tikv 项目发现的,当函数参数中有 Arc::default()的时候,从类型分析的结果看,这个参数可以满足多个其他参数,这样在分析缺少的参数给出合适的提示时就会有问题,那个算法导致死循环。我花了比较多时间写出最小化的测试用例,最后给出了一个修复。我还挺喜欢分析这类 Bug,像小说一般充满了悬疑。

在这段时间里,我也和一些公司里全职做 Rust 相关的同事聊了聊,发现微软已经有几个组在全职做了,主要集中在 Rust 和 Windows、开发工具相关方面。另外和社区里其他几个开发者沟通了一下,华为的也有一些。

Rust 纯粹是互联网上自由生长出来的一门语言,创始人早已经退出主导,主要的核心成员都是社区自由组成的,这里并没有一个绝对意义上的独裁者。我碰到的几乎都是在凭热情做贡献,比如最近一年很活跃的 compiler-errors 这个开发者,有一次我催他 review PR,他说我不是全职在做 Rust,所以时间需要自己安排,不要催。我接着和他聊了聊,他的日常工作和 Rust 完全无关,花这么多时间就是爱好而已。

这里足够开放,基本上你想参与到 Rust 开发中来,这个门槛是不高的。

我并不是鼓吹 Rust 有多好,Rust 自然还有很多问题,学习成本比较陡峭,而且也并不适合很多日常项目。如果从功利角度考虑,投入产出比不高。

我只觉得 Rust 很好玩,又足够开放,吸收了多年编程语言方面的理论,完全出自开源社区和一线开发者,一切讲究实用,所以又没有 OCaml、Haskell 那种学究气,对编程语言感兴趣的朋友可以多关注一下。

为什么我能沉下去做一些看似繁琐的开源工作,这里有几个方面:

第一,我本身对编程语言的实现挺有兴趣的,几年前我基本看完了 EOPL 这本书,也做了很多里面的小解释器。可以说,编译这块算是程序员的一个小浪漫。带着问题看代码比较容易看进去,看完 Parser 这块之后,我打算再看看类型分析。

第二,Rust 这几年工具链有很大提高,比如 Rust compiler 这样的大项目,VSCode + Rust Analyzer 就能很好应对,几乎能做到所有的变量跳转,函数调用跳转和调用关系分析,类型提示等等。Rust 在这样的大型项目和多人维护的项目上能体现出优势,有编译器的和类型系统的帮助,查阅代码和写代码体验和效率都好很多,这与我日常工作中需要在一堆年代久远的 PowerShell 中翻来覆去爽太多了。

第三,最近两年在日常工作中,我接触到了大量历史悠久的代码,这些代码其实很丑陋,但每年能为公司赚不少钱。我们常说提高编程技能需要向优秀的代码学习,但我发现被迫接触一些丑陋的历史代码对编程的心性大有裨益,因为今后你看很多代码都美得很,编程和调试时候的耐心好了很多。

感兴趣的可以交流交流🙌

公号同步更新,欢迎关注👻