为什么新流行的开源编辑器都在用Rust开发?
我大概能懂这种感觉...
我因为工作原因被逼着用了大半年rust,我寻思我是不是斯德哥尔摩综合征呢,怎么现在自己没事捣鼓的新项目也大半切到 rust 了?
原因无它,真的是好维护。
甚至即使 Rust 性能再衰退个70%,哪怕现在 Rust 很多特性极度缺失+本身有些点极度难用(点名 async closure/async callback type/context-based polymorphism/partial trait impl/panic处理),它已有的基础,对很多场景仍然有着致命的维护便利。而且我也认识到,单纯的“写代码爽”未必是一件很重要的事。
怎么描述 Rust 的使用感官呢,我想想哈。就比如说 Rust 无 gc 这件事怎么理解。如果单讲为了“性能提升”,那其实是很掉价的一件事,如果是是给工作或者布道过程中的外部沟通说辞,我能理解,但这些烂大街的说辞,要敞开聊的话就不算真诚且无趣。首先性能很多时候就不关键,其次 rust 的主场优势也不绝对在于性能。我们一个50w行rust的语言运行时项目,分配器从mimalloc换成bdwgc,跑基准性能居然可以提升10%,比rust默认分配器更是不知快到哪里去了。但最后我们不用bdwgc,为什么?要和其他更大的产品集成啊,没gc的话ffi做起来是真的方便,不用搞一堆对象池索引。像go语言写的动态库插件,通常一个进程只能加载一个否则崩溃,像c#aot 编译的多个动态库可以一起加载,但每个动态库里一套gc一套runtime(虽然相比java乃至java的aot方案算很精简)同时运行,插件一多也会有些麻烦事。
你能看到在这里 rust 很轻量,唉那种感觉我突然想到怎么形容了,就像是大晚上熬夜啃点东西想点很油腻的烧烤,结果想起尿酸变高就忍住没吃,整了两根酱黄瓜啃,不一会儿感觉整个腰子被清爽的蔬菜汁液洗涤了,什么杂质油脂体内废物都清理掉,就是这种感觉。
清爽。
有这种清清爽爽的感觉,Rust 做中大规模的框架性工作还是挺方便,写好的组件要给安卓啊ios以及各种奇怪的板子编译,眼睛都不眨一下。
明明我现在写 rust 集成 C/C++ 项目也是有一手的,但不知怎么就会尽量选用纯 rust 实现,否则就有点不踏实,这个我推测可能是c++运行时库的依赖问题以及unwind运行时库兼容问题的心理投射。但我回头一看,以前为了省事解决问题经常搞多语言集成方案,现在几乎不怎么主动愿意搞了,看到运行时打包就烦,还会觉得 boajs 比 deno/quickjs 更好维护之类的……
突然还想到一个词来形容 rust 维护项目,那就是整洁吧。虽然过程比较艰辛,但客观反馈的掌控感很强,质量很稳,最后出的东西,很顺溜。
但其实你要说好用吧真的 rust 有些事也挺弱智。我工作给计算仿真平台做软件,rust 那个煞笔 panic,人家用户写个大型高维数组分配会直接崩掉进程,进程里是用户还没有保存算了三天三夜算出来的实验数据,解决方案不在文档里要多爬爬资料。还有 stable rust 很难写 generator 抽象,为了惰性迭代一些全局信息,我上个月大概手动写了两个很要命的状态机来把很简单的 yield generator 转成 iterator。巨多问题,真的一大堆。
所以说真的也有很多不好用的地方,但倒也没有卡点。
而它解决的问题,比如发展到稳定阶段合并进入stable rust的特性,解决了就是解决了,含金量比较高,我觉着 rust 的整洁感也是来自这里。
除开清爽整洁之外,还有一些我估计是框架性工作比较喜欢的组件。就 rust 里锁/类似锁机制的生态真的比较丰富,LazyLock, LazyCell, once_cell::sync::OnceCell, RwLock, ArcSwap, 之类的还有各种无锁结构 boxcar, dashmap, crossbeam-* 等等,这些性能、成熟度、移植性、功能富足度、控制粒度,我以前在 c++ 里找一套是真的很麻烦很麻烦啊,难道大家都是 spinlock + mutex 走天下吗。。
我大概无法从rust做编辑器的优势上去分析的,我只能说就普遍意义而言rust对框架性开发工作的益处。还就是从我开头讲,开发者的习惯真的是能被训化的,曾经的曾经我也是能用notepad++一口气写1000行matlab不喘气一遍过而且不靠一丁点现代 ide 的。