为什么使用Rust重写并不能解决所有问题

开发 前端
Rust是一门具有突破性特性的非凡语言,它值得大肆宣传,但它也需要大量的时间和精力来采用。用Rust重写项目可能不是你想要的奇迹解决方案。

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可能是你需要的英雄,但不是每一场战斗都需要。

责任编辑:武晓燕 来源: coding到灯火阑珊
相关推荐

2014-03-05 09:47:26

带宽应用性能

2009-01-28 09:13:00

服务器虚拟化刀片服务器

2018-11-06 12:53:24

网络安全网络安全投资

2020-03-23 07:15:35

物联网IOT物联网技术

2021-08-17 15:47:12

机器学习自然语言神经网络

2021-05-13 16:57:14

机器人人工智能技术

2010-09-07 14:08:11

2015-08-21 09:18:17

大数据技术解决问题

2012-02-19 21:16:00

大数据IBM

2009-10-19 14:16:48

惠普下一代数据中心设计

2017-10-10 09:58:44

人工智能 应用 临床

2023-08-14 07:39:40

2012-12-03 11:16:50

2019-01-21 09:27:03

2022-04-04 07:51:32

Web框架

2023-05-17 16:01:00

物联网数据治理

2021-08-02 15:23:16

Windows 10Windows微软

2022-04-11 10:43:33

供应链机器学习企业

2009-06-13 15:08:31

IDC虚拟化网络管理

2019-06-18 09:28:34

iOS 13手机黑暗模式
点赞
收藏

51CTO技术栈公众号