关于 Rust 的一点看法
前言
先说立场,我是全面支持 Rust 的。
最近看了一些讨论 Rust 的文章和评论。反对者的意见主要集中在 Rust “宗教” 原神式的“传教”、虚伪的内存安全、高昂的学习成本、要和编译器斗智斗勇这几点。然而这些批评并不能让我对 Rust 产生负面感受。
空指针异常
我写过 Visual Basic、Java、PHP、C#、TypeScript(JavaScript)、Python、Lua、Golang、Rust。但没写过 C/C++,一是项目中没用到过,二是 C/C++ 的指针非常自由又可以进行低级硬件操作,具有我不愿意承受的硬件损坏风险。
谈到指针,还记得我最初跟着视频自学 Java 时(甚至早于大学里学习 Visual Basic,因此没有任何编程经验),老师三番两次强调「空指针异常」,我不记得当时老师有没有提到为什么要强调了,但是显然,哪怕提到了我肯定也没有理解。
在我使用过这么多语言后,直到最近我才感悟到什么叫「空指针异常」。「空指针异常」的一切元凶,就是因为 Java 中的一切变量,都是写作 Type
实为 Type | null
。我突然就发现为什么我喜欢写 TypeScript 和 Rust,不是因为别的,就是因为强迫我处理空值。
事实上,哪怕是 TypeScript,你还是很容易遇到 Uncaught TypeError: Cannot read properties of undefined (reading 'something')
,比如从对象形式的 Map 中以不存在的字符串字段名的方式获取你以为它存在的元素,再调用这个“元素”上你以为有的属性或方法。
哪怕是 Golang 这种同为新时代的语言,我也只能说看到指针要记得处理空值,Golang 并不会强迫我去处理空值。
风险
我非常讨厌 Python 和 JavaScript。不光是空引用的问题,动态类型语言总是喜欢把风险留到运行时。我知道快速原型开发的情况下因为不是正式的交付内容所以无所谓运行时出问题,也有快速的优势,这也是我愿意用 Lua 写配置的原因。但我在这里讲的是面对所有的开发业务,讲的是主观感受。
我在这里要特别批评一下 Python 自以为易于理解具备可读性的缩进式代码块。难道自然语言写文章会讲究定义域吗?我写文章多写少写一个空格并不会导致文章崩溃。虽然我肯定是用等宽字体写代码的,但是一门编程语言会因为不等宽的字体而使书写效率受到制约,真的思之令人发笑。
Rust 不光是类型检查,包括强制空值处理、强制错误处理(哪怕是 unwrap
,起码你写的时候就知道 Panic 可能是哪些句子造成的)、生命周期和所有权检查等。Rust 反对者说这是和编译器斗智斗勇,这种人难道不是在自我介绍说自己从不主动写合格的程序吗?
我遇到有人只谈 Rust 书写时要花很多时间,闭口不谈 Python 和 JavaScript 运行时排错的时间成本,我很怀疑他们是不是不用亲自运行代码,要别人给自己擦屁股。
自由
有的人认为 Rust 只是做到了和 C++ 性能差不多,不能接受花时间学一套新的概念(他们经常说得仿佛 C++ 是不用花时间学的)。这么说吧,把内存管理交给用户自决不是信任,是不负责任。
工业生产讲的是让具备基础工业素质的劳动力能批量化地生产合格的产品,不是让一两个天才或者完人去创造工艺的桂冠。
在我看来,C++ 的内存管理,是美式的自由散漫、无法无天。Rust 的内存管理,是中式的井然有序、防微杜渐。
诚然,Rust 也有内存泄漏的问题和 unsafe 被人滥用的问题。但是鼓吹 C++ 的 Rust 反对者竟然嘲笑对优化内存管理的尝试,以不解决问题为荣。本质上是给不愿意离开舒适圈找借口。
结语
Rust 其他还有完善的项目管理工具、亲切的错误提示信息等优点,远不是只是在内存管理的优化上做出了尝试。但是我太困了,所以就不展开了,今后可能会补充。
最后我想说,“天行健,君子以自强不息”。我引用这句话不是因为我很积极向上,我是要说,地球不会因为保守主义者固步自封而停止转动。
保守主义者可以找出一万个理由抵制新事物的到来,一如《悲惨世界》中,对冉阿让义正辞严大谈法律的沙威,在面对人民法庭时说不承认你们的法律。但是希望保守主义者能认识到沙威的下场是什么。