微軟Azure CTO Mark Russinovich:應該立即棄用C/C++
他在推特上表達了這個觀點,并強調與微軟公司無關。“是時候停止用C/C++啟動任何新項目了,一切需要無垃圾回收語言的場景都該使用Rust。出于安全性和可靠性的考慮,業界應該立即棄用這兩種語言。”
Russinovich的言論值得關注,畢竟微軟自家的Windows、Office和SQL Server等核心產品,主要就是用C和C++編寫的。Linux也是如此,其同樣在Azure云平臺上得到了廣泛應用。但從目前公布的消息來看,Linux的部分內核似乎很快就將邁入Rust時代。結合開源峰會上的報告和Linus本人的郵件,“除非出現極特殊情況,否則Rust一定會現身Linux內核的6.1版本。”
這已經不是微軟第一次主張用Rust提升軟件安全水平了。三年之前,微軟安全響應中心(MSRC)就曾提到,“我們認為Rust是目前最理想的C與C++替代選項。”該響應中心團隊還強調,“由MSRC分配CVE編號的安全問題中,約70%與內存安全相關。也就是說,如果能用Rust編寫這些軟件,那這70%的安全隱患很可能不會出現。”
所謂內存安全,是指當應用程序代碼從內存中讀取數據時,這部分數據能夠保證有效。這個環節中出問題的原因有以下幾點:編程語言會為變量定義需要占用的特定內存空間。如果為變量分配的內存太小,代碼可能超出其上限,導致有隨機數據被注入應用程序。同樣的,如果代碼試圖讀取已被內存釋放掉的數據,那實際讀取到的可能是其他數據,同樣會引發難以預測的結果、甚至導致崩潰。另一個問題就是多線程應用程序中的多個線程同時寫入同一內存區,這時如果沒有內存鎖,就會引發內存數據損壞。
大多數業務應用程序都是用JavaScript、Java、Python和C#等高級語言編寫的,它們要比C或C++安全得多。但這些語言的問題是,它們的運行時或內存垃圾回收器(GC)具有無法預測的性能開銷,因此并不適合用作系統編程。Rust專為系統編程而設計,而且具備基于編譯器強制值所有權概念的內存安全功能。
當然,Rust也無法保證百分之百內存安全。使用unsafe關鍵字,Rust開發者也可以取消引用原始點、調用不安全函數、寫入可變靜態變量等等。在有些情況下,這些操作有其必要性,而且Rust會將這類代碼隔離到特定的標記塊當中,由此帶來遠超C或C++的安全水平。
盡管業界不乏支持Rust的聲音,但在Redmonk編程語言排名等主流調查中,Rust的人氣仍然遠遠落后于C和C++。其中C++排名第7,C排名第10,而Rust位列第19。為什么Rust人氣有限?主要原因包括開發者短缺、工具不夠成熟、語言學習門檻過高,以及與現有代碼的互操作性不佳等。