Rust 安全、快速,并承诺消除代码库中臭名昭著的内存错误。但这是否意味着你应该用Rust重写所有的项目呢?不完全是。
在某些情况下,用Rust重写可能很好,但它并不是解决所有软件开发问题的通用方法。让我们通过一些代码片段、类比和一些笑料来深入了解其中的原因。
Rust的优势:为什么要大肆宣传?
1,内存安全:Rust的借用检查器消除了内存相关的错误,如空指针解引用和数据竞争。
2,性能:Rust的运行速度几乎和C或C++一样快,但崩溃要少得多。如果你正在构建高性能系统,Rust是最好的选择。
3,现代工具:与其他一些语言(例:JavaScript)相比,Rust的包管理器和构建工具:Cargo,使依赖管理变成一件轻松的事情。
Rust的信条是安全、快速和稳定。谁不想这样呢?现在,让我们来探讨一下,为什么这并不意味着应该使用Rust来重写所有当前的代码库。
重写谬误
Joel Spolsky的经典博客文章“你永远不应该做的事情”警告不要丢弃现有已工作的代码。为什么?因为重写会引入bug,浪费多年的调试知识,并减缓进度。用Rust重写会放大这些风险,因为Rust的学习曲线非常陡峭。
示例:重构与重写
假设有这样一个Python函数:
# Python: 计算阶乘
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
但是想要Rust的速度和安全性。代码是这样的:
// Rust: 计算阶乘
fn factorial(n: u64) -> u64 {
match n {
0 => 1,
_ => n * factorial(n - 1),
}
}
很好,但是重写值得吗?对于像这样的一小段代码,可能不会。Python代码运行良好,对于新开发人员来说更容易阅读和维护。如果性能成为一个问题,可以使用PyO3等工具使用Rust库优化这个特定的函数,而不是重写所有内容。
学习曲线:不是每个人都是Rustacean
Rust的语法可能会让习惯于更传统语言的开发人员感到陌生。像借用、生命周期和所有权这样的概念是强大的,但也令人生畏。如果你的团队还不熟悉Rust,那就做好项目延迟和混乱的准备。
考虑一下这个简单的任务:在Rust中修改一个向量
fn main() {
let mut numbers = vec![1, 2, 3];
for num in &mut numbers {
*num += 1;
}
println!("{:?}", numbers);
}
看起来很好,但是如果你忘记使用&mut或者用*解除引用,借用检查器会报错。来自JavaScript或Python的开发人员可能会觉得他们被欺骗了。
下面是Python中的等效函数:
numbers = [1, 2, 3]
for i in range(len(numbers)):
numbers[i] += 1
print(numbers)
简单多了,对吧?Rust在前期更加努力地工作以保证安全性,这对于系统编程来说是非常棒的,但是对于较小的、不容易出错的项目来说是多余的。
并非所有代码都需要Rust的特性
因为“Rust很酷”而用Rust重写你的个人待办事项列表应用程序,就像用工业级钢梁建造一个鸟舍,过度工程对任何人都没有帮助。
假设你正在编写一个脚本来重命名一些文件:
Python:
import os
def rename_files():
for filename in os.listdir("."):
if filename.endswith(".txt"):
os.rename(filename, filename.replace(".txt", ".md"))
rename_files()
Rust:
use std::fs;
use std::io;
fn rename_files() -> io::Result<()> {
for entry in fs::read_dir(".")? {
let entry = entry?;
let path = entry.path();
ifletSome(extension) = path.extension() {
if extension == "txt" {
let new_name = path.with_extension("md");
fs::rename(path, new_name)?;
}
}
}
Ok(())
}
fn main() {
rename_files().unwrap();
}
Rust的解决方案更加健壮,但是如果你的脚本只运行一次,那么额外的复杂性值得吗?对于快速的一次性任务,Python等高级脚本语言通常是更好的选择。
开发人员的生产力:权衡
Rust编写更多代码来实现与其他语言相同的结果。对于安全关键型系统,这种权衡是值得的,但是在开发速度比运行时性能更重要的环境中,这种权衡会降低项目开发的速度。
如果正在构建MVP或原型,应该使用一种能够快速迭代的语言。一旦验证了你的想法并需要扩展,就可以考虑在Rust中重写性能关键部分。
“完美工具”谬论
没有语言是完美的,Rust也一样。
Rust的优势为:
- 系统编程(例如,操作系统,游戏引擎)。
- 性能关键型应用程序。
- 在多线程程序中的安全性。
但不太理想的是:
- 快速原型
- 脚本和自动化
- 经验有限的Rust团队
总结:使用Rust,但要明智地使用它
Rust是一门具有突破性特性的非凡语言,它值得大肆宣传,但它也需要大量的时间和精力来采用。用Rust重写项目可能不是你想要的奇迹解决方案。
相反,应该考虑使用Rust的地方:关键的性能瓶颈、内存安全的api,或者稳定性至关重要的长期项目。
因此,不要把Python、JavaScript或Go代码库扔进垃圾桶。Rust可能是你需要的英雄,但不是每一场战斗都需要。