為什么使用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可能是你需要的英雄,但不是每一場戰斗都需要。