欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

為什么要使用 Rust 語言、Rust 語言有什么優(yōu)勢

 更新時(shí)間:2022年10月09日 16:01:34   作者:人郵異步社區(qū)  
雖然 Rust 是一種通用的多范式語言,但它的目標(biāo)是 C 和 C++占主導(dǎo)地位的系統(tǒng)編程領(lǐng)域,很多朋友會問rust語言難學(xué)嗎?rust語言可以做什么,今天帶著這些疑問通過本文詳細(xì)介紹下,感興趣的朋友一起看看吧

Rust 是一種采用過去的知識解決將來的問題的技術(shù)。” ——Graydon Hoare

Rust 是一種快速、高并發(fā)、安全且具有授權(quán)性的編程語言,最初由 Graydon Hoare 于2006 年創(chuàng)造和發(fā)布?,F(xiàn)在它是一種開源語言,主要由 Mozilla 團(tuán)隊(duì)和許多開源社區(qū)成員共同維護(hù)和開發(fā)。

雖然 Rust 是一種通用的多范式語言,但它的目標(biāo)是 C 和 C++占主導(dǎo)地位的系統(tǒng)編程領(lǐng)域。這意味著你可以使用 Rust 編寫操作系統(tǒng)、游戲引擎和許多性能關(guān)鍵型應(yīng)用程序。同時(shí),它還具有足夠的表現(xiàn)力,你可以使用它構(gòu)建高性能的 Web 應(yīng)用程序、網(wǎng)絡(luò)服務(wù),類型安全的數(shù)據(jù)庫對象關(guān)系映射(Object Relational Mapping,ORM)庫,還可以將程序編譯成WebAssembly 在 Web 瀏覽器上運(yùn)行。Rust 還在為嵌入式平臺構(gòu)建安全性優(yōu)先的實(shí)時(shí)應(yīng)用程序方面獲得了相當(dāng)大的關(guān)注,例如 Arm 基于 Cortex-M 的微控制器,目前該領(lǐng)域主要由 C語言主導(dǎo)。Rust 因其廣泛的適用性在多個(gè)領(lǐng)域都表現(xiàn)良好,這在單一編程語言中是非常罕見的。

Rust 作為一門靜態(tài)和強(qiáng)類型語言而存在。靜態(tài)屬性意味著編譯器在編譯時(shí)具有所有相關(guān)變量和類型的信息,并且在編譯時(shí)會進(jìn)行大量檢查,在運(yùn)行時(shí)只保留少量的類型檢查。它的強(qiáng)類型屬性意味著不允許發(fā)生諸如類型之間自動(dòng)轉(zhuǎn)換的事情,并且指向整數(shù)的變量不能在代碼中更改為指向字符串。例如在 JavaScript 等弱類型語言中,你可以輕松地執(zhí)行類似“two = "2"; two = 2 + two;”這樣的操作。JavaScript 在運(yùn)行時(shí)將 2 的類型弱化為字符串,因此會將 22 作為字符串存儲到變量 two 中,這與你的意圖完全相反并且毫無意義。在 Rust 中,與上述代碼意義相同的代碼是“let mut two = "2"; two = 2 + two;”,該代碼將會在編譯時(shí)捕獲異常,并提示信息:“cannot add '&str' to '{integer}'”。

因此,強(qiáng)類型屬性使 Rust 可以安全地重構(gòu)代碼,并在編譯時(shí)捕獲大多數(shù)錯(cuò)誤,而不是在運(yùn)行時(shí)出錯(cuò)。用 Rust 編寫的程序表現(xiàn)力和性能都非常好,因?yàn)槭褂盟憧梢該碛懈呒壓瘮?shù)式語言的大部分特性,例如高階函數(shù)和惰性迭代器,這些特性使你可以編譯像 C/C++程序這樣高效的程序。它的很多設(shè)計(jì)決策中強(qiáng)調(diào)的首要理念是編譯期內(nèi)存安全、零成本抽象和支持高并發(fā)。讓我們來詳細(xì)說明這些理念。

編譯期內(nèi)存安全:Rust 編譯期可以在編譯時(shí)跟蹤程序中資源的變量,并在沒有垃圾收集器(Garbage Collectors,GC)的情況下完成所有這些操作。

這意味你不會遇到在 free、double free 命令之后調(diào)用指針,或者運(yùn)行時(shí)掛起指針等“臭名昭著”的問題。Rust 中的引用類型(類型名稱前面帶有&標(biāo)記的類型)與生命周期標(biāo)記隱式關(guān)聯(lián)('foo),有時(shí)由程序員顯式聲明。在生命周期中,編譯器可以跟蹤代碼中可以安全使用的位置,如果它是非法的,那么會在編譯期報(bào)告異常。為了實(shí)現(xiàn)這一點(diǎn),Rust 通過這些引用上的生命周期標(biāo)簽來運(yùn)行借用/引用檢查算法,以確保你永遠(yuǎn)不能訪問已釋放的內(nèi)存地址。這樣做也可以防止你釋放被其他某些變量調(diào)用的任何指針。

零成本抽象:編程的目的就是管理復(fù)雜性,這是通過良好的抽象來實(shí)現(xiàn)的。接下來讓我們來看一個(gè) Rust 和 Kotlin 的良好抽象示例。抽象讓我們能夠編寫高級并且易于閱讀和推斷的代碼。我們將比較 Kotlin 的流和 Rust 的迭代器在處理數(shù)字列表時(shí)的性能,并參照 Rust提供的零成本抽象原則。這里的抽象是指能夠使用以其他方法作為參數(shù)的方法,根據(jù)條件過濾數(shù)字而不使用手動(dòng)循環(huán)。在這里引入 Kotlin 是因?yàn)樗瓷先ズ?Rust 存在相似性。代碼很容易理解,我們的目標(biāo)是給出更高層面的解釋,并對代碼中的細(xì)節(jié)進(jìn)行詳細(xì)闡述,因?yàn)檫@個(gè)示例的重點(diǎn)是理解零成本特性。

首先,我們來看 Kotlin 中的代碼:

 import java.util.stream.Collectors  
  
 fun main(args: Array<String>)  
 {  
     //創(chuàng)建數(shù)字流 
     val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).stream()  
     val evens = numbers.filter { it -> it % 2 == 0 }  
     val evenSquares  = evens.map { it -> it * it }  
     val result = evenSquares.collect(Collectors.toList())  
    println(result)       // prints [4,16,36,64,100]  
 
    println(evens) 
    println(evenSquares) 
 }

我們創(chuàng)建了一個(gè)數(shù)字流(第 6 行)并調(diào)用了一系列方法(filter 和 map)來轉(zhuǎn)換元素, 以收集僅包含偶數(shù)的序列。這些方法可以采用閉包或函數(shù)(第 8 行中的“ it -> it * it”)來轉(zhuǎn)換集合中的元素。在函數(shù)式編程語言中,當(dāng)我們在流/迭代器上調(diào)用這些方法時(shí),對于每個(gè)這樣的調(diào)用,該語言會創(chuàng)建一個(gè)中間對象來保存與正在執(zhí)行的操作有關(guān)的任何狀態(tài)或元數(shù)據(jù)。因此,evens 和 evenSquares 將在 JVM 堆上分配兩個(gè)不同的中間對象。在堆上分配資源將會產(chǎn)生內(nèi)存開銷,這是我們在 Kotlin 中為抽象必須額外付出的代價(jià)。

當(dāng)我們輸出 evens 和 evenSquares 的值時(shí),確實(shí)得到了兩個(gè)不同的對象,如下所示:

java.util.stream.ReferencePipeline$Head@51521cc1  
java.util.stream.ReferencePipeline$3@1b4fb997 

@之后的十六進(jìn)制值是 JVM 對象的哈希值。由于哈希值不同,所以它們是不同的對象。在 Rust 中,我們會做相同的事情:

 fn main() {  
     let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter();  
     let evens = numbers.filter(|x| *x % 2 == 0);  
     let even_squares = evens.clone().map(|x| x * x);  
     let result = even_squares.clone().collect::<Vec<_>>();  
     println!("{:?}", result); // 輸出 [4,16,36,64,100]  
     println!("{:?}\n{:?}", evens, even_squares);  
 } 

接下來將解釋上述代碼的細(xì)節(jié)。在第 2 行中,我們調(diào)用 vec![]創(chuàng)建一個(gè)數(shù)字列表,然 后調(diào)用 into_iter()方法使其成為一個(gè)數(shù)字的迭代器/流。使用 into_iter()方法從集合中創(chuàng)建 了一個(gè)包裝器的迭代器類型(這里 Vec<i32>是一個(gè)有符號的 32 位整數(shù)列表),即 IntoIter([1,2,3,4,5,6, 7,8,9,10]),此迭代器類型引用原始的數(shù)字列表。然后我們執(zhí)行 filter 和 map 轉(zhuǎn)換(第 3 行和第 4 行),就像我們在 Kotlin 中所做的那樣。第 7 行輸出 evens 和 even_squares 的類型,如下所示(為了簡潔,省略了一些細(xì)節(jié)):

evens:        Filter { iter: IntoIter( <numbers> ) }  
even_squares: Map { iter: Filter { iter: IntoIter( <numbers> ) }} 

中間對象 Filter 和 Map 是基礎(chǔ)迭代器結(jié)構(gòu)上的包裝器類型(未在堆上分配),它本身是一個(gè)包裝器,包含對第 2 行的原始數(shù)字列表的引用。第 4 行和第 5 行的包裝器結(jié)構(gòu)在分別調(diào)用 filter 和 map 時(shí)創(chuàng)建,它們之間沒有任何指針解引用,并且不會像 Kotlin 那樣產(chǎn)生堆分配的開銷。所有這些可歸結(jié)為高效的匯編代碼,這相當(dāng)于使用循環(huán)(語句)的手動(dòng)編寫版本。

支持高并發(fā):當(dāng)我們說 Rust 是并發(fā)安全的時(shí),其含義是該語言具有應(yīng)用程序接口(Application Programming Interface,API)和抽象能力,使得編寫正確和安全的并發(fā)代碼變得非常容易。而在 C++中,并發(fā)代碼出錯(cuò)的可能性非常大。在 C++中同步訪問多個(gè)線程的數(shù)據(jù)時(shí),需要在每次進(jìn)入臨界區(qū)時(shí)調(diào)用 mutex.lock(),并在退出它時(shí)調(diào)用 mutex.unlock():

// C++  
mutex.lock();          // 互斥鎖鎖定 
 // 執(zhí)行某些關(guān)鍵操作 
mutex.unlock();        // 執(zhí)行完畢

在大量開發(fā)人員共同協(xié)作的大型代碼庫中,你可能會忘記在多線程訪問共享對象之前調(diào)用 mutex.lock(),這可能導(dǎo)致數(shù)據(jù)訪問沖突。在其他情況下,你可能忘記解開互斥鎖(Mutex),并使其他想要訪問數(shù)據(jù)的線程一直處于等待狀態(tài)。

Rust 對此有不同的處理方式。在這里,你將數(shù)據(jù)包裝成 Mutex 類型,以確保來自多個(gè)線程的數(shù)據(jù)進(jìn)行同步可變訪問:

// Rust  
use std::sync::Mutex;  
fn main() {  
    let value = Mutex::new(23);  
    *value.lock().unwrap() += 1;         // 執(zhí)行一些修改 
}                                        // 這里自動(dòng)解鎖

在上述代碼中,我們能夠在變量 value 調(diào)用 lock()方法之后修改數(shù)據(jù)。Rust 采用了保護(hù)共享數(shù)據(jù)自身,而不是代碼的概念。Rust 與 Mutex 和受保護(hù)的數(shù)據(jù)的交互并不是獨(dú)立的,這和 C++中的情況一樣。你無法在 Mutex 類型不調(diào)用 lock()方法的情況下訪問內(nèi)部數(shù)據(jù)。

那么 lock()方法的作用是什么?調(diào)用 lock()方法之后會返回一個(gè)名為 MutexGuard 的東西,它會在變量超出作用域范圍之后自動(dòng)解除鎖定,它是 Rust 提供的眾多安全并發(fā)抽象之一。

另一個(gè)新穎的想法是標(biāo)記特征的概念,它在編譯期驗(yàn)證,并確保在并發(fā)代碼中同步和安全地訪問數(shù)據(jù),第 4 章詳細(xì)介紹了該特征。類型會被稱為 Send 和 Sync 的標(biāo)記特征進(jìn)行注釋標(biāo)記,以指示它們是否可以安全地發(fā)送到線程或者在線程之間共享。當(dāng)程序向線程發(fā)送值時(shí),編譯器會檢查該值是否實(shí)現(xiàn)了所需的標(biāo)記特征,如果沒有,則禁止使用該值。通過這種方式,Rust 允許你毫無顧慮地編寫并發(fā)代碼,編譯器在編譯時(shí)會捕獲多線程代碼中的異常。

編寫并發(fā)代碼已經(jīng)很難了,使用 C/C++會讓它變得更加困難和神秘。當(dāng)前 CPU 沒有獲得更多的時(shí)鐘頻率;相反,我們添加了更多內(nèi)核。因此,并發(fā)編程是正確的發(fā)展方向。Rust 使得編寫并發(fā)代碼變得輕而易舉,并且降低了編寫安全的并發(fā)代碼的門檻。

Rust 還借鑒了 C++的 RAII 原則用于資源初始化,這種技術(shù)的本質(zhì)是將資源的生命周期和對象的生命周期綁定,而堆分配類型的解除分配是通過執(zhí)行 drop 特征上的 drop()方法實(shí)現(xiàn)的。當(dāng)變量超出作用域時(shí),程序會自動(dòng)調(diào)用此方法。它還用 Result 和 Option 類型替代了空指針的概念,我們將在第 6 章對此進(jìn)行詳細(xì)介紹。這意味著 Rust 不允許代碼中出現(xiàn)null/undefined 的值,除非通過外部函數(shù)接口與其他語言交互,以及使用不安全代碼時(shí)。該語言還強(qiáng)調(diào)組合,而不是繼承,并且有一套特征系統(tǒng),它由數(shù)據(jù)類型實(shí)現(xiàn),類似于 Haskell的類型類,也被稱為加強(qiáng)型的 Java 接口。

但同樣重要的是,Rust 社區(qū)非?;钴S和友好。該語言包含非常全面的文檔,可以在Rust 官網(wǎng)中找到。Rust 在 Stack Overflow 的開發(fā)者調(diào)查上連續(xù) 3 年(2016 年、2017 年和2018 年)被評為最受歡迎的編程語言,因此編程社區(qū)對它非常青睞。總而言之,如果你希望編寫具有較少錯(cuò)誤的高性能軟件,又希望感受當(dāng)前流行語言的特性和極佳的社區(qū)文化, 那么 Rust 應(yīng)該是一個(gè)不錯(cuò)的選擇。

到此這篇關(guān)于為什么要使用 Rust 語言、Rust 語言有什么優(yōu)勢的文章就介紹到這了,更多相關(guān)Rust 語言優(yōu)勢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Rust生成隨機(jī)數(shù)的項(xiàng)目實(shí)踐

    Rust生成隨機(jī)數(shù)的項(xiàng)目實(shí)踐

    Rust標(biāo)準(zhǔn)庫中并沒有隨機(jī)數(shù)生成器,常見的解決方案是使用rand包,本文主要介紹了Rust生成隨機(jī)數(shù)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Rust 語言的全鏈路追蹤庫 tracing使用方法

    Rust 語言的全鏈路追蹤庫 tracing使用方法

    這篇文章主要介紹了Rust 語言的全鏈路追蹤庫 tracing,接下來就以 tracing 為例,介紹一下trace 的核心概念以及使用方法,需要的朋友可以參考下
    2022-12-12
  • Rust語言實(shí)現(xiàn)圖像編碼轉(zhuǎn)換

    Rust語言實(shí)現(xiàn)圖像編碼轉(zhuǎn)換

    image-rs庫是?Rust?社區(qū)中廣泛使用的一個(gè)開源庫,它提供了豐富的圖像編解碼功能,本文主要介紹了Rust語言實(shí)現(xiàn)圖像編碼轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • rust聲明式宏的實(shí)現(xiàn)

    rust聲明式宏的實(shí)現(xiàn)

    聲明式宏使得你能夠?qū)懗鲱愃?match?表達(dá)式的東西,來操作你所提供的?Rust代碼,它使用你提供的代碼來生成用于替換宏調(diào)用的代碼,感興趣的可以了解一下
    2023-12-12
  • Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法

    Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法

    在 Rust 中, 如果一個(gè)類型實(shí)現(xiàn)了 Iterator, 那么它會被同時(shí)實(shí)現(xiàn) IntoIterator, 具體邏輯是返回自身, 因?yàn)樽陨砭褪堑?這篇文章主要介紹了Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法,需要的朋友可以參考下
    2023-12-12
  • Rust?搭建一個(gè)小程序運(yùn)行環(huán)境的方法詳解

    Rust?搭建一個(gè)小程序運(yùn)行環(huán)境的方法詳解

    rust是一門比較新的編程語言,2015年5月15日,Rust編程語言核心團(tuán)隊(duì)正式宣布發(fā)布Rust?1.0版本,本文給大家介紹Rust?搭建一個(gè)小程序運(yùn)行環(huán)境,以iOS?為例介紹開發(fā)環(huán)境的準(zhǔn)備,感興趣的朋友跟隨小編一起看看吧
    2022-05-05
  • 詳解rust?自動(dòng)化測試、迭代器與閉包、智能指針、無畏并發(fā)

    詳解rust?自動(dòng)化測試、迭代器與閉包、智能指針、無畏并發(fā)

    這篇文章主要介紹了rust?自動(dòng)化測試、迭代器與閉包、智能指針、無畏并發(fā),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Rust語言之結(jié)構(gòu)體和枚舉的用途與高級功能詳解

    Rust語言之結(jié)構(gòu)體和枚舉的用途與高級功能詳解

    Rust 是一門注重安全性和性能的現(xiàn)代編程語言,其中結(jié)構(gòu)體和枚舉是其強(qiáng)大的數(shù)據(jù)類型之一,了解結(jié)構(gòu)體和枚舉的概念及其高級功能,將使你能夠更加靈活和高效地處理數(shù)據(jù),本文將深入探討 Rust 中的結(jié)構(gòu)體和枚舉,并介紹它們的用途和高級功能
    2023-10-10
  • 利用rust編一個(gè)靜態(tài)博客工具

    利用rust編一個(gè)靜態(tài)博客工具

    這篇文章主要為大家詳細(xì)介紹了如何利用rust編一個(gè)靜態(tài)博客工具,這個(gè)靜態(tài)博客的工具主要是把md文檔轉(zhuǎn)為html靜態(tài)網(wǎng)站/博客,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 使用Rust制作康威生命游戲的實(shí)現(xiàn)代碼

    使用Rust制作康威生命游戲的實(shí)現(xiàn)代碼

    這篇文章主要介紹了使用Rust制作康威生命游戲,初始rust項(xiàng)目,使用wasm的項(xiàng)目模板,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09

最新評論