我想用Rust写一个大项目作为学习练习已经有一段时间了,实际上在2018年年底就开始了(一个FUSE服务器实现)。但后来生活发生了变化,我变得忙碌起来,再也没有带着它去过任何地方。由于特定的世界环境,我目前在室内呆了很长时间,所以rust-fuse(Docs)现在已经存在,并且足以编写基本的hello-world文件系统。我计划进一步完善它,目标是发布支持与libfuse相同用例的v1.0。
一路上,我做了一些笔记,记录给我留下深刻印象的东西是好是坏。总体而言,我相当喜欢铁锈的语言,对辅助工具的质量有复杂的感觉,并强烈反对包装系统(货物+crates.io)所做的一些决定。
我从事专业编程已经有15年了,主要是Linux上的网络服务器和GUI。大约在2009到2015年间,我尝试使用Haskell进行系统编程,用纯Haskell(Haskell-dbus,Anansi)和绑定(Haskell-ncurses,Haskell-cpython)编写了几个项目。然而,我不能实现我所希望的那种与基本的C++相比的可靠性改进:Haskell有很多工具来推理计算结构,特别是声明性I/O的Monad,但它对程序员解决非算法问题(如内存生存期)没有太大帮助。(译注:哈斯克尔有很多工具可以用来推理计算结构,特别是声明性I/O的Monad),但它对程序员解决非算法问题(如内存生存期)没有太大帮助。我花了很多时间调试悬挂指针和竞态条件。
我发现很难写出运行速度和C语言一样快的Haskell代码,避免分配、自动装箱等感觉需要对未记录或未指定的GHC行为有深入的了解。
在2015年末,我开始了一种新语言Funk的粗略草图,它将结合Haskell的类型安全性和C/C++的低级精确度。Funk受到谷歌内部方言C++的强烈影响,后者使用智能指针和SUM类型(例如StatusOr<;T>;)来提高内存安全性-它的许多功能后来成为C++11和C++14标准的一部分。在此基础上,我专注于Haskell风格的类型类和模块,然后开始编写基于Vala的Funk-to-C转换器。
在某个时候,我四处寻找如何处理内存分配的灵感(我计划使用作用域arenas作为基本的动态内存系统),我发现了Rust。这是一种正在解决与Funk相同的问题的语言,但是(1)设计得更好,(2)已经实现了,(3)得到了整个编译器专家团队的支持。就这样,Funk转到/dev/null,我记录了一个TODO来学习Rust。
在C++和Haskell之间寻找结合点的人喜欢Rust,这并不令人惊讶,但我想说清楚:我真的真的很喜欢使用Rust。它几乎是我在系统编程语言中想要的一切,它缺少的几个部分是由于合法的技术困难。我在它的设计中投入了大量的仔细思考-精心制作异步/等待在no_std环境下工作,或者新的内联汇编语法-已经产生了一种不仅比我可能设计的语言更好的语言,而且在阅读Rust RFC之前我甚至不知道存在的轴中它更好。
夜间发布频道是一个很好的想法,我希望更多的基础设施软件使用它。按照各自的计划稳定各个特性,可以让编译器保持强烈的发布节奏(每六周稳定发布一次!)。用户有权在维护/速度曲线上选择自己的首选点,选择更高的升级成本,以换取提前访问新功能。版本系统走得更远,去掉了会阻碍C++数十年的向后不兼容的语法更改(参见:三联图)。