整理 | 蘇宓
Rust 這把火在微軟Azure CTO Mark Russinovich的助力下,似乎越燒越旺。而每當波及程式語言時,紛爭再起,這不,近日外媒 The Register 在發出「是時候在新程序中用 Rust 來讓 C、C++ 了嗎?」的問句,引發了不少開發者的熱議。

Rust vs C++
相比程式語言榜單的 Top 級語言,Rust 要稍顯年輕一些。最初,Rust 僅僅是由 Mozilla 的一位工程師 Graydon Hoare 開發的,隨後得到了 Mozilla 的贊助,目的是為開發他們的瀏覽器 Mozilla Firefox 創造一個更好的工具。
2010 年,Rust 首次對外公開開發這個語言的計劃。2015 年 5 月,Rust 1.0 版本正式發佈。作為一種多正規化的程式語言,Rust 專注於性能和安全,特別是安全併發。Rust 在語法上與 C++ 相似,但它提供更高的速度和更好的記憶體安全,不用自動垃圾回收,也無需手動釋放。
在安全的記憶體管理方面,不少開發者視 Rust 是一種更具創新性的系統級語言,因為它不允許懸空指針或空指針。它是為了在不影響性能和速度的情況下做到安全、可靠而創建的。多數情況下,Rust 被用來開發設備驅動程序和作業系統,如 BlogOS、intermezzOS、QuiltOS、Redox、RustOS、Rux、Tafflin 和 Tock。它也被用於瀏覽器,如 Mozilla Firefox、遊戲等方面。
Hello World 用法示例如下:
fn main() {
println! ("Hello World!")。
}
與之相對應的 C++,是由丹麥電腦科學家 Bjarne Stroustrup 開發的高級、通用的物件導向的程式語言,屬於一種 “類C”語言。C++ 的設計偏重於系統程式設計和嵌入式、資源受限的軟體和大型系統,性能、效率和使用的靈活性是其設計亮點。使用 C++,程式設計師可以對系統資源和記憶體進行高度控制,也可以為程序提供清晰的結構,並允許程式碼被重複使用。
從使用維度來看,C++ 方便開發者用較少的編譯和執行時間建立超級快速的應用程序,因為它有豐富的標準庫,稱為 “STL-庫”。你可以建立各種各樣的應用程序,從 GUI 應用程序到 3D 圖形、遊戲、桌面應用程序,以及核心計算機視覺應用程序。
Hello World 示例如下:
#include
int main() {
std::cout << "Hello, world!";
return 0;
}

相比 C、C++,Rust 有什麼樣的優勢?
整體而言,Rust 的設計是以性能和安全為前提,C、C++ 更注重在速度提升上,安全性可能要排到第二位。
The Register 也在文章中做出如此評價:的確,或許你總是可以寫出完美安全的 C 和 C++ 程式碼。只是,這對於大多數人而言,從來都不是一件容易的事。因為這兩種語言都太容易造成記憶體錯誤了,如帶來無效的堆和棧記憶體訪問;記憶體洩漏;不匹配的記憶體分配和反分配;以及未初始化的記憶體訪問。
現實中,也有不少企業在 C、C++ 的安全上「翻了車」。此前,英特爾技術諮詢工程師 Naveen Gv 表示,”記憶體錯誤在 C 和 C++ 應用程序中非常普遍,而且……可能難以重現,難以調試,而且糾正起來可能也很昂貴。”
早在 2019 年,微軟稱自 2006 年以來,所修復的 CVE 中約有 70% 是由於記憶體安全問題造成的。2020 年,微軟雲開發者 Ryan Levick 公開表示,「我們使用的語言很古老,來自不同的年代,無法為我們提供防範種種漏洞的能力。C++ 不是一種記憶體安全的語言,沒人會真的假裝它是記憶體安全的語言。」
除了微軟,Google 的開發者也在基於 Chromium 核心的網路瀏覽器程式碼中發現了同樣比例的記憶體問題。
相較之下,使用 Rust 雖然無法 100% 地杜絕安全錯誤的發生,但是它也不容易犯 C、C++ 應用程序中常見的記憶體錯誤。另外,Rust 還有一個優勢,就是使得編寫併發程序變得更加容易,這也有助於其在容器、雲中落地應用。

Rust 為什麼突然爆火?
不過當論及 Rust 為什麼在短短几年後的今天突然崛起,目前據 Slashdata 最新資料統計,Rust 在過去一年中使用數量幾乎增加了兩倍,實則 Rust 的爆火的經歷與曾經 Python 的經歷有些雷同。也正如此前 MegaEase CEO 陳皓(左耳朵耗子)曾分享過具有競爭性的技術無外乎有三個特性:
- 有殺手級應用:無論是什麼技術,它一定要是能解決痛點問題的。
- 有大廠的支持:需要明白,大公司不會把錢浪費在一些「無用功」上,它一定會投資一些有價值的技術。譬如 Go 語言的背後是 Google、Java 的背後亦是很多巨頭公司支持的。
- 有強大的社區支持。
對於 Rust 而言,其得以迅速崛起,一方面,離不開諸多大廠的投入使用。譬如,微軟在 VS Code、Visual Studio 等工具都已經提供了對 Rust 的良好支持;Google 於去年也宣佈 Android 支持 Rust 語言來開發作業系統,並支持 Linux 核心引入 Rust 程式碼;亞馬遜為此更早之前還聘用了 Rust 編譯器團隊負責人之一的 Felix Klock,以及 AWS 從很早開始並宣佈贊助 Rust 開源項目等等。
另一方面,基於 Rust 語言自身雖然並沒有絕對的「殺手級應用」誕生,但是不乏頂級的項目引入。在 2022 Linux 核心維護者峰會上,Linus 提議將 Rust 支持合併到 Linux 6.1 中。隨後,微軟 Azure CTO Mark Russinovich 在 Twitter 上公開呼籲,「現在是時候停止在 C/C++ 中啟動任何新的項目了,一切需要無垃圾回收語言的場景都該使用 Rust。出於安全性和可靠性的考慮,業界應該宣佈這些語言已經被棄用。」

不過,Russinovich 並不是直接建議把所有已經用 C 或 C++ 寫好的東西都扔掉,其表示,「有大量的 C/C++ 將被維護和發展數十年(或更長時間)。昨晚我為 Handle 編寫了一個功能,添加到我編寫的大約 85,000 行 Sysinternals C/C++ 程式碼中。也就是說,對於新工具,我會偏向於 Rust。」

Rust 會取代 C、C++ 嗎?
其實,Rust 對標 C++,宛如 Kotlin 欲對抗 Java、TypeScript 對標 JavaScript、Carbon 對標 C++ 等,不過,對於 Rust 遲早取代 C++ 這一說法,不少人持懷疑態度。
一位名為 devjoe 的網友表示:
我需要指出的是,任何將 C 和 C++ 混為一談的人一開始就脫離了正軌。C++ 是為了使那些在 C 語言中不可能實現的事情成為可能,它是通過顯著地擴展 C 語言的語法和語義來實現的。這是兩種不同的語言,解決了兩種不同的問題。任何寫 “C/C++”的人如果混淆了這一點,我就懷疑這個人的能力。
Rust 的目標是解決一些問題,這很好。在我看來,最值得注意的問題之一是可靠的錯誤處理,在這一問題上,C++ 可以很好地解決,但是 Rust 不行。Rust 鼓勵一種忽略錯誤的編碼風格,因為通過返回值傳回錯誤是很繁瑣的。
相比之下,C++ 用異常來解決這個問題(這絕不是 C++ 發明的),這也是對合格的程式碼編寫有自己的一套要求。這並不是說你不能用 Rust 編寫好的軟體,其實你當然可以。很多偉大的軟體也是用 C 語言寫的,而且我確信在很多用途上,Rust 表現要比 C 要好一些。
但是說實話,對於需要在現實世界中工作的大規模應用來說,用 Rust 取代C++?當然,你可以做到這一點。只要有足夠的投資,任何事情都是可能的。但我不得不說,對於那些真正需要他們的軟體在任何時候都能工作的企業來說,我不認為這種大規模的應用會發生。
為此,你怎麼看?Rust 是否會取代 C、C++?
參考資料:
https://www.theregister.com/2022/09/28/is_it_time_to_retire_c/?td=rt-3a