rust入坑指南之ownership

京東雲開發者發表於2023-02-22

作者:京東零售 王夢津

I. 前言

Rust,不少程式設計師的白月光,這裡我們簡單羅列一些大牛的評價。

Linus Torvalds:Linux核心的創始人,對Rust的評價是:“Rust的主要優點是程式碼的安全性和速度,很難在C++中實現這種安全性,而且Rust編譯器會捕獲很多C++難以發現的錯誤”。

Brian Kernighan:C語言的創始人之一,對Rust的評價是:“Rust是一門非常強大的程式語言,在資源管理、記憶體安全、多執行緒等方面具有很強的能力”。

Rob Pike:Go語言的創始人之一,對Rust的評價是:“Rust是一門很有前途的語言,它將許多最佳實踐和先進技術整合在了一起,是未來系統程式設計的重要選擇”。

越來越多大學的課程設計中也將rust作為了一個選項,

比如獲得國家精品課程的清華大學的作業系統: http://rcore-os.cn/rCore-Tuto...

如果上面這些讓你對rust感興趣了的話,可以移步官方學習連結:https://doc.rust-lang.org/book/

II. Rust Ownership概述

這篇文章我們介紹一下rust的一個核心概念 ownership

Ownership是Rust語言的一個核心概念,它決定了一個值在程式中的生命週期以及對其訪問許可權的限制。Rust的Ownership有以下幾個特點:

Rust有嚴格的記憶體安全性:Ownership規則決定了在程式中每一個值的生命週期,因此在Rust程式中不存在記憶體洩漏和資料競爭問題。

Rust是一種靜態語言:在編譯階段就可以確定程式中每一個值的生命週期,因此程式的效能是非常穩定的。

明確的資源管理:Ownership規則決定了程式中的資源如何被分配,釋放和管理,因此程式設計師不必手動進行記憶體管理。

總的來說,Rust的Ownership提供了一種透過明確的規則管理記憶體和資源的方式,從而避免了許多常見的程式設計錯誤,使程式設計師能夠開發出更安全,高效,可靠的程式。

III. Ownership的程式碼實踐

// Rust程式碼
fn main() {
 let v = vec![1, 2, 3];
 let _v2 = v;
 println!("{:?}", v);
}

上面的 Rust 程式碼會產生編譯錯誤,因為在 Rust 中一個變數只能有一個所有者。在本程式碼中,當將 v 賦值給變數 v2 時,v 就不再擁有它分配的記憶體,所以 v 不能被使用。相比之下,C++程式碼是這樣的:

#include <vector>
#include <iostream>
 
int main() {
 std::vector<int> v = {1, 2, 3};
 std::vector<int> v2 = v;
 std::cout << v[0] << std::endl;
 return 0;
}

這段 C++ 程式碼不會產生任何錯誤,即使 v 被賦值給 v2,v 仍然可以被使用。這是因為 C++ 使用垃圾回收機制,它在執行時才檢測到記憶體問題,而 Rust 使用編譯期所有權管理機制,可以在編譯階段發現記憶體問題,更安全。

IV. Ownership與記憶體管理

首先和c++相比

C++不提供類似於Rust Ownership的特性主要是因為C++語言的歷史和設計目標的差異。C++在更早的時代就已經存在,並且它的目標是在C語言的基礎上增加物件導向程式設計的支援。它的目標是提供最大的靈活性和可控性,以便開發人員可以最大限度地利用系統資源和高效的底層操作。因此,在C++中,記憶體管理的責任主要在開發人員的身上。

而Rust語言則在現代程式語言中引入了Ownership概念,其目標是透過對記憶體管理和資源管理的嚴格限制來提高程式碼的安全性和可靠性。在Rust語言中,Ownership機制可以防止很多常見的程式設計錯誤,例如懸空指標、陣列越界、使用已釋放的記憶體等。因此,如果C++也想要實現類似的特性,那麼它必須從語言設計的角度進行許多改變,而這在當前已經有大量C++程式碼存在的情況下是很困難的。

總之,C++和Rust語言的記憶體管理和Ownership特性之間的差異主要是由於兩種語言的歷史和目標不同導致的。C++更注重開發人員的靈活性和可控性。

和我們熟悉的jvm垃圾回收相比

設計目標:Rust Ownership 旨在在編譯時避免記憶體問題,例如空間洩漏和使用釋放的物件,並保證程式的安全性和效能。相比之下,JVM 垃圾回收則是在執行時管理記憶體的機制,旨在解決記憶體洩漏和碎片化問題。

程式設計體驗:Rust Ownership 需要程式設計師經常手動管理物件的生命週期,對語法要求比較高。相比之下,JVM 垃圾回收則不需要程式設計師進行記憶體管理,但是執行時可能會因垃圾回收帶來效能問題。

記憶體安全:Rust Ownership 透過在編譯時避免記憶體問題,提供了更高的記憶體安全保證。相比之下,JVM 垃圾回收可能存在記憶體問題,例如記憶體洩漏,但通常情況下還是比較安全的。

效能:Rust Ownership 可以透過避免編譯時避免記憶體問題來提高效能。相比之下,JVM 垃圾回收的效能可能會受到垃圾回收帶來的影響,但它仍然可以透過其他方式最佳化效能。

V. 總結

本文介紹了Ownership的概念、特點和優勢。

讓熟悉JVM生態的我們瞭解了另一個生態下更加顯式的記憶體管理、高效的記憶體分配以及程式碼安全性和可讀性的設計思路,也同時告訴了我們程式語言的設計上對於成本、效率永無止境的追求。

相關文章