在本系列文章中,咱們探討了主動採起一些措施消除一類漏洞的必要性,並介紹了在 Microsoft 的代碼中發現的一些內存安全問題的例子,這些問題能夠用其餘語言避免。如今咱們來看看爲何咱們認爲 Rust 是目前可用的 C 和 C++ 最好的替代品。程序員
雖然,已經有許多很是好用的內存安全語言,普遍應用於微軟內外,包括 .NET 語言(如 C# 和 F#)和其餘語言(如 Swift, Go, and Python)。 咱們鼓勵正在使用 C 或 C++ 的人考慮使用這些語言中的一種。然而,咱們正在討論對安全的系統編程語言的需求(即,能夠構建其餘軟件運行的系統的語言,如OS內核)。此類工做負載須要 C,C ++ 和 Rust 提供的速度和可預測的性能。經過垃圾回收實現內存安全的語言不是系統編程的理想選擇,由於它們的運行時會致使不可預測的性能和沒必要要的開銷。編程
在考慮爲何Rust是一個很好的替代方案時,最好考慮一下咱們不能由於從 C 或 C++ 轉換而放棄什麼——即性能和控制。 Rust,就像 C 和 C++ 同樣,有一個最小的和可選的「運行時」。Rust 的標準庫依賴於 libc 來支持它的平臺,就像 C 和 C++ 那樣,可是標準庫也是可選的,因此在沒有操做系統的平臺上也是能夠運行的。安全
Rust 與 C 和 C++ 同樣,也爲程序員提供了對什麼時候分配內存以及分配多少內存的細粒度控制,從而使程序員可以很是清楚地瞭解程序運行時將如何執行。這對於原始性能,控制和可預測性的性能意味着什麼,Rust,C 和 C ++能夠用相似的術語來思考。編程語言
Rust 與 C 和 C++ 的區別在於其強大的安全保障。除非經過使用「unsafe」關鍵字明確選擇使用,不然Rust徹底是內存安全的,這意味着咱們在上一篇文章中說明的問題是沒法表達的。 在之後的文章中,咱們將從新討論這些示例,以瞭解 Rust如何在不添加任何運行時開銷的狀況下防止這些問題。正如咱們所看到的,MSRC 分配給 CVE 的大約70%的安全問題是內存安全問題。 這意味着若是軟件是用 Rust 編寫的,那麼70%的安全問題極可能已經消除。咱們並非惟一一家報道這一發現的公司。工具
在系統編程中,有時程序員必須執行沒法靜態驗證爲安全的操做。Rust 爲程序員提供了將這些操做包裝在安全抽象的工具中,這意味着Rust編譯器能夠靜態地強制執行那些曾經屬於代碼註釋或約定的操做。必須顯式地標記內存不安全操做,從而極大地減小了安全專家必須仔細檢查內存安全漏洞的面積。性能
雖然 Rust 最初由於上述緣由引發了 MSRC 的興趣,可是微軟的其餘團隊已經由於其餘緣由開始採用 Rust:學習
根據一項內部調查,採用的首要緣由是「正確性」——這是 Rust 安全保障的延伸,能夠實現「if it compiles, then it works」的格言。
Rust 靜態地強制執行程序的許多特性,這些特性超出了內存安範圍,包括空指針安全性和數據競爭安全性(即,不容許從兩個或多個線程非同步地訪問一塊內存)。
微軟的許多團隊都發現 Rust 的豐富類型系統使編寫富有表現力的程序成爲可能。具備相關數據的枚舉和強大的特徵系統等概念進一步強化了 Rust 的目標,即儘量使程序減小 BUG。
Rust 現有的社區對該語言有巨大的好處。語言的大部分功能來自於其核心以外的庫、工具和學習資料。 Rust 仍然是一個年輕的語言,可是它擁有一個健康的生態系統,擁有一個活躍的、開放的編譯器和語言的開發過程,而且它顯示出了強大的促進開源社區和支持用戶生產力的能力。這給了咱們更多的理由相信該語言有一個光明的將來。
全部這些都解釋了Rust過去四年在Stack Overflow最受歡迎的語言列表中高居榜首的記錄。 雖然如今說採用 Rust 的規模和微軟的工程組織同樣大還爲時過早,但早期採用 Rust 一般是很是積極的。操作系統
咱們相信 Rust 會改變編寫安全的系統軟件的遊戲規則。Rust 提供編寫低級系統所需的性能和控制,同時容許軟件開發人員編寫健壯、安全的程序。線程
在研究 Rust 的過程當中,咱們發現了一些問題,這些問題一直困擾着咱們。其中一些問題包括如何規範Rust的「不安全」超集的使用,缺少與 C ++ 一流的互操做性,以及與現有Microsoft工具的互操做性。 咱們將在之後的博客中討論其中的許多問題,由於它們對微軟的大規模採用構成了挑戰,咱們但願讓 Rust 和更普遍的軟件社區參與進來,幫助咱們找到適合全部人的解決方案。翻譯
但咱們對這些可能性感到興奮。雖然還有許多問題有待解決,好比 Rust 如何融入微軟的整個工程設計中,可是咱們鼓勵其餘人加入咱們的行列,認真研究這種語言,以知足他們的系統編程需求。
Ryan Levick, Principal Cloud Developer Advocate
本文翻譯於:Why Rust for safe systems programming