这些坑,Rust早填为妙!

编译 | 王瑞平、言征
使用Rust三年多了 , 我非常喜欢它 。Rust不仅帮助我完成了很多任务 , 还开发出极其可靠的软件 。Rust让推断代码的并发性和并行性变得更容易 。
我可以继续赞美Rust , 但这并非本篇文章的重点 。相反 , 这篇文章旨在揭露Rust的一些缺点 , 它有时会拖慢开发人员的进度 , 需要调用其它语言才能完成任务 。
1、ust需要调用其它语言完成任务Rust中没有具体调用系统命令的方法 , 得通过crates.io实现此功能 。7年前 , syscall crate进行了最后一次更新 , 支持以下平台:

这些坑,Rust早填为妙!

文章插图
毫无疑问 , linux在列表中出现次数最多 。
不过 , 如果你仍只使用FreeBSD操作系统而不使用x86_64 , 你就out了 。如果你只关?.NETBSD、OpenBSD或Solaris , 你只能get到普通的技能 。此时 , 你可以采取的措施是使用libc crate 。
我认为这些方式都不太好 , 这不是系统编程语言该有的状态 。系统编程语言应该可以与其它编程语言互操作 , 不需要通过调用C语言完成任务 。
2、内存模型:用Rust语言开发Linux内核的拦路虎上述列表中出现最多的当属Linux 。最近几年 , Rust For Linux项目随着Rust的火爆也开始逐渐升温 。但是 , Rust想深入Linux的真正核心仍有很长的路要走 , 最大的拦路虎是内存模型方面的问题 。
当Rust编写“无限接近计算机底层”的操作内核时 , 内存模型会变得很重要 。它是多线程环境能够可靠工作的基础 , 需要对多线程环境的运作细节进行完备的定义 。
Rust中的lock锁是与具体要保护的数据是有强绑定关系的 , 开发者需要调用data.lock将锁进行锁定 , 只有这样才能受锁保护的数据才能被访问 。
由于Rust的变量都是有严格的生命周期及借用机制的 , 因此 , 锁也很可能要在内存中移动 , 内存中对象的移动、所有权借用等除了造成移动锁之外还会有移动构造函数等问题 。
但是移动锁、还移动构造函数这些概念在之前的Linux中几乎是闻所未闻的 。这些问题在Rust只开发上层应用时都不是问题 , 但一旦深入到操作系统内核 , 这些就都成了问题 。所以 , Rust想真正深入到Linux的内核当中还有很多的路要走 。
3、麻烦:你只在Github上才能获得crates包一旦部分技术人员放弃使用crates包 , 随着时间的推移更多人会放弃 。我并不是唯一批判这个系统缺陷的人 。
最重要的是 , crates.io的注册列表只在GitHub上才能get到 。这意味着 , 为了使用crates.io , 你必须拥有一个GitHub帐户 。对于一些开发人员来说 , 这显然不是问题 , 但是 , 并不是所有程序员都能够适应这种形式 。
总之 , 就个人而言 , 我认为Rust在GitHub上托管他们的代码糟糕透了 。
4、不吐不快:Rust中那些突出的缺陷【这些坑,Rust早填为妙!】除了上述的“吐槽” , Rust编程语言还有一些明显的缺点 , 在这里做个总结:
1)编译时间
与其对等的编程语言相比 , Rust编译代码的速度相对较慢 。原因是它的“编译单元”不是单个文件 , 而是上文提到的crate包 。
crate可以包含多个模块 。因此 , 它们可以是大型编译单元 。虽然完成了whole-of-crate优化 , 但是 , 它还需要whole-of-crate编译 , 这很耗时 。此外 , 它还具有一个复杂的编译器工具链 , 该工具链包含多个中间表示 , 并向LLVM发送大量代码 。这些都是导致Rust编译代码速度变慢的原因 。
2)学习难度
真正学会Rust很难 , 为了理解它的主要部分 , 你需要先熟悉C++ 或任何面向对象的语言 。
3)过于严格
在编程方面 , 严格通常被认为是一件好事 , 但是 , Rust有时有点过于严格 , 使用它进行编程时很难偷懒 。直到一切都恰到好处 , 程序才会正确运行 。
五、替代品:Zig , 小巧而简洁除了Rust , 另一种真正引起我注意的语言是Zig 。它在编译时计算和执行命令 , 而不是像Rust一样在运行时执行命令 。很多程序员已经通过实践证明了这一点 。Zig不仅成为了完美的替代品 ,  对于维护任何类型的宏观系统也都游刃有余 。


推荐阅读