1. 我們為什麼用Rust
Rust 是一門系統級編程語言,被設計為保證內存和線程安全,防止段錯誤產生。作為系統級編程語言,它的基本理念是 「零開銷抽象」。理論上來說,它的速度與 C/C++ 同級。Rust 可以被歸為通用的、多範式、編譯型的編程語言,類似 C/C++。與這兩門編程語言不同的是,Rust 是線程安全的!Rust 編程語言的目標是,創建一個安全和並發的軟體系統。它強調安全性、並發和內存控制。盡管 Rust 借用了 C/C++ 的語法,卻杜絕了空指針和懸掛指針,而這二者是 C/C++ 中系統崩潰、內存泄露和不安全代碼的根源。
雖然 Rust 是一門系統級編程語言,但並不意味著它只能寫底層程序(操作系統、驅動、工具、資料庫、搜索引擎等),它的抽象層次之高完全給人驚艷的感覺,實踐證明它對問題建模的能力和方便性不比 C++/Java/Python/Ruby 差。但 Haskell 這類超高抽象語言,也不是 Rust 的發展方向。Rust 力求在抽象與現實世界中找到一個平衡。
在向SCRY 項目研發負責人Peace交流時,他說到,當時選擇Rust,主要有兩個原因:一是有高性能要求時,原來好多人會選擇C/C++,現在多了一個Rust選擇,還解決了C/C++許多不足;二是Rust應用在區塊鏈有成熟的參考。最後Peace給了未來使用SCRY項目開源部分的學習者一些建議,「快速的學習能力,快樂地把小事做好,正確合理定義一個函數。」
Rust到底有多受歡迎呢?目前,Rust 已經在 StackOverflow 的年度語言評選中,連續 4 年榮獲「程序員最喜愛語言」第一名(2016, 2017, 2018, 2019)。以下是 2019 年調查的截圖:
但比起Python、C、C++ 等,Rust還只是個小年輕。調查顯示,更多的人不去學習 Rust 還是因為 Rust 沒有足夠的活躍商業項目讓它成為企業的一部分。
不過,Rust 在工作中的佔比也越來越高。過去一年間,Rust 在商業應用上有著令人驚訝的成長。下面是部分人們熟知的公司:
國內的網路,阿里,也已經在內部小范圍的使用上了Rust。
就在本月初,微軟還推出了基於 Rust 的 Windows 運行時項目 Rust/WinRT。該項目和 C++/WinRT 一脈相承,用標准語言和編譯器為 Windows 運行時構建語言投影,從而方便 Rust 開發人員調用 Windows API,更輕松地使用 Rust 構建各類 Windows 應用和組件。
(https://blogs.windows.com/windowsdeveloper/2020/04/30/rust-winrt-public-preview/)
2015年下半年,Gavin Wood 博士創立了 Parity Technologies,推出以太坊(Ethereum)客戶端 parity,而這個 parity 客戶端就是使用Rust寫的。實際在 parity 出現之前,MaidSafe項目就已經出現了。MaidSafe用 Rust 語言嘗試了很多東西。Rust語言本身強調的安全性以及MaidSafe這些前沿項目,可能給了 Gavin 充分的理由選擇 Rust 作為 parity 開發語言。
寫一個有效率的、符合習慣的Rust程序比寫一個有潛在危險的程序容易得多。下面是Linux內核在2018年一月到四月期間發現的bug:
而對於Rust而言,上圖右側佔比 51% 的部分,從語言層面就可以避免。也就是說,對Rust來說,根本不存在上圖右邊這些問題。
Rust在實現內存安全和並發安全的同時,並沒有以損失性能為代價。更牛逼的是,它甚至是用同一套抽象解決了內存安全和數據競爭這兩個不同領域的問題。
Rust的零開銷抽象讓你在享受安全性的同時,又不損失性能。這正是傳統的程序員夢寐以求的。
Solana的首席執行官Anatoly Yakovenko在一段采訪中提到剛開始項目的時候,他用了兩周時間使用C語言,但是當用到一些外部庫的時候,還得寫makefile,手動下載這些庫,比較麻煩。所以,他決定嘗試一下Rust。就在那一刻,「Holy shit, this is amazing.」「我才覺醒到,這是一個和C語言一樣快的語言,並且還給了我Haskell般的類型安全。Rust擊中了我,這真的很酷。」
今天Rust滿5歲了(2020年5月15日,是Rust語言正式發布5年生日)。Rust語言正在IT工業各個領域快速發展,而由於區塊鏈本身的特質,區塊鏈領域是較早接納Rust的領域之一。在區塊鏈領域,Rust正以勢如破竹之勢佔領區塊鏈新興項目市場,很多著名的老項目也在考慮轉向使用Rust重寫。
祝Rust 5周年生日快樂!
參考:
1. Why Rust?
https://www.parity.io/why-rust/
2. Meetup with Solana, Zcash, & Parity — Why Rust Is Ideal For Blockchain Development?
https://medium.com/solana-labs/solana-at-portland-dev-meetup-72e4dc7ad32c
3. Rust 2017 Survey Results
https://blog.rust-lang.org/2017/09/05/Rust-2017-Survey-Results.html
4. 微軟開源 Rust/WinRT,方便使用 Rust 構建 Windows 應用
https://www.oschina.net/news/115354/microsoft-winrt
5. Stack Overflow』s Developer Survey Results 2019
https://insights.stackoverflow.com/survey/2019#developer-profile-_-what-inpial-person-will-have-the-most-influence-in-tech-this-year
6. 當區塊鏈遇上Rust
https://rustcc.cn/article?id=289da7be-19ce-49fe-af6d-3a7946404ca6
2. 我為什麼要選擇Rust
你好,很高興為你解答。
專訪資深程序員庄曉立:我為什麼要選擇Rust?
Rust是由Mozilla開發的注重安全、性能和並發性的編程語言。這門語言自推出以來就得到了國內外程序員的大力推崇。Rust聲稱解決了傳統C語言和C++語言幾十年來飽受責難的內存安全問題,同時還保持了極高的運行效率、極深的底層控制、極廣的應用范圍。但在國內有關Rust的學習文檔並不多見,不久前,筆者聯繫上了Rust1.0版本代碼貢獻者庄曉立(精彩博文:為什麼我說Rust是靠譜的編程語言),請他分享Rust語言特性以及學習經驗。
CSDN:你是從什麼時候開始接觸Rust語言的?是什麼地方吸引了你?
庄曉立:我大概從2013年後半年開始深入接觸Rust語言。它居然聲稱解決了傳統C語言和C++語言幾十年來飽受責難的內存安全問題,同時還保持了極高的運行效率、極深的底層控制、極廣的應用范圍。
其ownership機制令人眼前一亮,無虛擬機(VM)、無垃圾收集器(GC)、無運行時(Runtime)、無空指針/野指針/內存越界/緩沖區溢出/段錯誤、無數據競爭(Data Race)……所有這些,都深深地吸引了我——這個十多年以來深受C語言折磨的痛並快樂著的程序員。
CSDN:在你看來,Rust是怎樣的一門語言?它適合開發什麼類型的項目?為何你會說Rust不懼怕任何競爭對手,它既能取代C語言地位;又可挑戰C++市場,還可向Java、Python分一杯羹?與這些語言相比,Rust有哪些優越的特性?
庄曉立:Rust是一門系統編程語言,特別適合開發對CPU和內存佔用十分敏感的系統軟體,例如虛擬機(VM)、容器(Container)、資料庫/游戲/網路伺服器、瀏覽器引擎、模擬器等,而這些向來主要都是C/C++的傳統領地。
此外,Rust在系統底層開發領域,如裸金屬(bare metal)、操作系統(OS)、內核(kernel)、內核模塊(mod)等,也有強勁的實力,足以挑戰此領域的傳統老大C語言。Rust豐富的語言特性、先進的設計理念、便捷的項目管理,令它在上層應用開發中也能大展拳腳,至少在運行性能上比帶VM和GC的語言要更勝一籌。無GC實現內存安全機制、無數據競爭的並發機制、無運行時開銷的抽象機制,是Rust獨特的優越特性。
其他語言很難同時實現這些目標,例如傳統C/C++無法保證內存安全,Java/Python等無法消除運行時開銷。但Rust畢竟還是很年輕的項目,它釋放影響力需要時間,被世人廣泛接受需要時間;它的潛力能否爆發出來,需要時間去檢驗。我們只需耐心等待。
CSDN:Rust在國內有沒有具體的實際使用案例?
庄曉立:因為Rust1.0正式版剛剛發布不足一月,在國內影響力還不大,我們不能苛求它在國內有實際應用案例。但是在國外,一兩年前就已經有OpenDNS和Skylight把Rust應用在生產環境。還有瀏覽器引擎Servo、Rust編譯器和標准庫、項目管理器Cargo等「兩個半大型應用案例」。這些足夠說明Rust語言的成熟和實用。
CSDN:你參與了Rust1.0版本代碼貢獻,目前該版本正式版已經發布,對此你感覺如何?這門語言是否已經達到比較成熟的階段?
庄曉立:我積極參與了Rust語言開源項目,多次貢獻源代碼,曾連續三次出現在Rust官方博客公布的Rust 1.0 alpha、Rust 1.0 beta和Rust 1.0正式版的貢獻者名單中。在Rust 1.0正式版出台的過程中及此前的很長一段時間,開發者付出了極大的努力,確保Rust 1.0正式版在Semver 2.0規范下,務必保持向後兼容性,除非遇到重大Bug不得不修復。
我認為,在1.0正式發布之後,Rust就已經進入了比較成熟的階段。而且,Rust還在快速迭代發展過程中,1.0發布6周後將發布1.1,再6周後將發布1.2,必然會一步一個台階,越來越成熟穩定。
CSDN:除了功能優先順序以外,在你看來,Rust正在朝什麼方向發展?未來的Rust可以期待什麼樣的特性?
庄曉立:Rust一定會沿著「確保內存安全、無運行開銷、高效實用」的既定方向持續發展。在短期內值得期待的語言特性有:動態Drop、偏特化、繼承、改進borrow checker、改進宏和語法擴展。短期內值得期待的其他特性有:增強文件系統API、提供內存申請釋放API、更好地支持Windows和ARM、更快的編譯速度、更方便的二進制分發機制(MUSL)、更實用的工具等等。
CSDN:據我了解,你之前也比較推崇Go語言,為何想到放棄Go轉向Rust?
庄曉立:推崇Go語言還談不上,不過我曾經嘗試努力接受Go語言,2011底年開始我曾經花費將近半年時間深度關注Go開發進程,提了很多具體的改進意見和建議,也曾經多次嘗試貢獻源代碼。後來考慮到Go語言的設計理念跟我偏差太大,其社區也不太友好,慢慢地疏遠了它。我曾經寫過一篇博客《我為什麼放棄Go語言》,談到了很多具體的原因。
CSDN:國內,參與Rust代碼貢獻的開發者多嗎?有核心的人員嗎?有哪些社區在維護Rust?
庄曉立:國內參與Rust代碼貢獻的開發者並不多,但也不少,官方的貢獻者名單中也偶見幾個貌似國人的名字。Rust的核心開發人員基本上都是Mozilla公司的員工,他們專職負責開發維護Rust語言和相關的項目,Rust社區也主要是他們參與組織和管理的。社區人員討論主要集中在GitHub項目主頁RFC/PR/Issue官方、Discuss論壇/IRC、Reddit、HN、StackOverflow等。