河南夢之網網絡科技有限公司
夢之網科技出品
掃描關注夢之網科技微信公眾賬號

掃小程序碼聯系客服

Rust:一個不再有 C/C+的,實現安全實時軟件的未來-鄭州網站建設

夢之網科技?2019-10-11?文章動態?

Rust 作為新興編程語言深受 Haskell 和 OCaml 等函數式編程語言的影響,使得它在語法上與 C++ 類似,但在語義上則完全不同。Rust 是靜態類型語言,同時具有完整類型推斷,而不是 C++ 的部分類型推斷,它在速度上可與 C++ 媲美的同時,也保證了內存安全。

索引的故事

在詳細介紹 Rust 之前,我們先舉一個例子。想象你是一個為新房子搭建煤氣管道的工人,你的老板想要你去地下室把煤氣管連到街上的主煤氣管道里,然而你下樓時卻發現有個小問題,這個房子并沒有地下室。所以,現在你要做什么呢?什么都不做,還是異想天開地妄圖通過把煤氣主管道連到隔壁辦公室的空調進氣口來解決問題?不管怎么說,當你向老板匯報任務完成時,你或許會在煤氣爆炸的土灰中以刑事疏忽罪起訴。

這就是在某些編程語言中會發生的事。在 C 里是數組,C++ 里可能是向量,當程序試圖尋找第 -1 個元素時,什么都有可能發生:或許是每次搜索的結果都不同,讓你意識不到這里存在問題。這種被稱作是未定義的行為,它發生的可能性并不能完全被杜絕,因為底層的硬件操作從本質上來說并不安全,這些操作在其他的編程語言里可能會被編譯器警告,但是 C/C++ 并不會。

在無法保證內存安全的情況下,未定義行為極有可能發生。漏洞 HeartBleed,一個著名的 SSL 安全漏洞,就是因為缺少內存安全防護;Stagefright,同樣出名的安卓漏洞,是因為 C++ 里整數溢出造成的未定義行為。

內存安全不止用來提防漏洞,它對應用程序的正確運行和可靠性同樣至關重要。可靠性的重要性在于它可以保證程序不會突然崩潰。至于準確性,作者有一個曾經在火箭飛行模擬軟件公司工作的朋友,他們發現傳遞相同的初始化數據,但是使用不同的文件名會導致不同的結果,這是因為有些未初始化的內存被讀取,因此模擬器就不同文件名的原因而使用了垃圾數值做基礎,可以說他們的這個項目毫無用處。

為什么不用 Python 或 Java 這些可以保障內存安全的語言呢?

Python 和 Java 使用自動垃圾回收來避免內存錯誤,例如:

釋放重引用(Use-After-Free):申請已經被釋放的內存。

多次釋放(double free):對同一片內存區域釋放兩次,導致未定義行為。

內存泄漏:內存沒有被回收,導致系統可用的內存減少。

自動垃圾收集會作為 JVM 或者 Python 解釋器的一部分運行,在程序運行時不斷地尋找不再使用的模塊,釋放他們相對應的內存或者資源。但是這么做的代價很大,垃圾回收不僅速度緩慢還會占用大量內存,而你也永遠不會知道下一秒你的程序會不會暫停運行來回收垃圾。

Python 和 Java 的內存安全犧牲了運行速度。C/C++ 的運行速度則是犧牲了內存的安全性。

這種讓人無法掌控的垃圾回收讓 Python 與 Java 無法應用在實時軟件中,因為你必須要保證你的程序可以在一定時間內完成運行。這并不是比拼運行速度,而是保障你的軟件在每次運行的時候都可以足夠迅速。

當然,C/C++ 如此受歡迎還有其他方面的因素:他們已經存在了足夠長的時間來讓人們習慣他們了。但是他們同樣因為運行速度與運行結果的保障而受到追捧。然而不幸的是,這樣的速度是在犧牲內存安全的前提下。更糟糕的是,許多實時軟件在保障速度的基礎上同樣需要注重安全性,例如車輛或者醫用機器人中的控制軟件。而這些軟件用的仍然是這些并不安全的語言。

在很長的一段時間里,二者處于魚與熊掌不可兼得的狀態,要么選擇運行速度和不可預知性,要么選擇內存安全和可預知性。Rust 則完全顛覆了這一點,這也是它為什么令人激動的原因。

Rust 的設計目標

無需擔心數據的并發運算:只要程序中的不同部分可能在不同的時間或者亂序運行,并發就有可能發生。眾所周知,數據并發在多線程程序中是一個常見的危險因素,這一點我們稍后再詳細描述。

零開銷抽象:指編程語言提供的便利與表現力并不會帶來額外的負擔,也不會降低程序的運行速度。

不需要垃圾回收的內存安全:內存安全和垃圾回收的定義我們已經了解了,接下來我們將詳細闡述 Rsut 是如何平衡速度與安全的關系的。

無需垃圾回收就能實現內存安全

Rust 的內存安全保障說簡單也很簡單,說復雜也是復雜。簡單是因為這里只包含了幾個非常容易理解的規則。

在 Rust 中,每一個對象有且只有一個所有者(owner),確保任何資源只能有一個綁定。為了避免被限制,在嚴格的規則下我們可以使用引用。引用在 Rsut 中經常被稱作“借用(borrowing)”。

借用規則如下:

任何借用的作用域都能不大于其所有者的。

不能在擁有可變引用的同時擁有不可變引用,但是多個可變引用是可以的。

第一個規則避免了釋放重引用的發生,第二個規則排除了數據互斥的可能性。數據互斥會讓內存處于未知狀態,而它可由這三個行為造成:

兩個或更多指針同時訪問同一數據。

至少有一個指針被用來寫入數據。

沒有同步數據訪問的機制。

文章關鍵詞
R
急速赛车国语 gta5线上怎么最赚钱 哪个看视频赚钱一月赚几千 养车容易赚钱难伴奏 造价工程师赚钱途径 dnf手游不能交易商人怎么赚钱 写网文能赚钱 主机gta5股票赚钱攻略 写网络小说最赚钱的作者 投资花呗怎么赚钱的 广州跑摩托车赚钱吗 字体录入软件能赚钱吗 开什么样的农庄赚钱了 看门狗2线上怎么赚钱 魔力宝贝带内心赚钱 南县农村种什么赚钱 魔兽世界拍卖行压价赚钱