天天看點

為什麼物聯網領域使用Rust的項目越來越多?

  1. 概述
為什麼物聯網領域使用Rust的項目越來越多?

Rust是由Mozilla員工Graydon Hoare于2006年作為個人項目而創造,Mozilla于2009年開始贊助該項目。2012年,第一個Rust編譯器釋出,2015年第一個Rust1.0穩定版本釋出,目前,Rust已加發展到1.51版本。

2021年2月8日,Rust基金會成立,Rust商标及所有權移交給基金會。基金會創始白金成員包括亞馬遜、微軟、谷歌、華為和Mozilla,白金會員Facebook。
           

截止到2021年5月,Rust在TOIBE程式設計語言排行榜上排名24%,占比0.66%。

  1. Rust功能

2.1. 語言主要特性

類型推導

Rust支援表達式類型推斷,可根據代碼自動推動表達式類型。

舉例:

let x = 9.0;  //x是f64類型

           

零成本抽象

Rust中增加抽象定義,不會影響運作性能。

模式比對

通過match關鍵字,可以很友善的對變量的值、範圍、部分内容等進行比對操作,支援比對數字、字元串、函數調用等,支援邏輯與或比對。比對的作用可以簡單了解為C語言的Switch文法功能的增強。

match a {
        1 => println!("a is 1"),
        2...5 => println!(" 2<=a<=5"),
        6 | 8 => println!(" a=6 or a=8"),
        _ => println!("其它")
    }
 

           

所有權

記憶體所有權是Rust記憶體安全的核心基礎。記憶體在一個時刻,所有權隻能屬于一個變量,超出作用域後,會被自動釋放。所有權支援轉移和借用。該機制可以有效解決空指針、野指針、記憶體洩漏、記憶體重複釋放等記憶體問題。

...
    let b = a;  //所有權轉移到b,通過a無法再通路

           

錯誤處理

Rust支援統一并簡潔的錯誤處理方式。錯誤碼統一,且支援同時傳回值及錯誤碼。

Rust将錯誤區分未可恢複錯誤及不可恢複錯誤,支援可恢複錯誤傳遞。

fn main() {
    let f = File::open("hello.txt");
 
    let f = match f {
        Ok(file) => file,   // 成功處理
        Err(error) => println!("Problem opening the file: {:?}", error),  //錯誤處理
    };
    panic!("run here panic!"); // 不可恢錯誤
}
 

           

切片(Slice)

切片是指對資料的部分引用,比如數組、字元串等。與python等語言的切片功能類似。

let hello = &s[0..5];
    let world = &s[6..11];

           

泛型

類似于C++中的模闆(Templete),可用于實作對通用類型的操作,有效提到代碼抽象度,減少代碼量。

let mut mi = 0;
    let mut i = 1;
    while i < array.len() {
        if array[i] > array[mi] {
            mi = i;
        }
        i += 1;
    }
    array[mi]
}
 
 
fn main() {
    let a = [1, 3, 9, 7];
    println!("max = {}", max(&a));
    let b = [2.0, 4.1, 10.2, 8.3];
    println!("max = {}", max(&b));
}
 

           

特征(Trait)

Trait是對接口的抽象,可以指定接口的規則、預設接口實作,可以被繼承、重載,可以與泛型結合使用,可以作為參數傳遞,也可以作為函數傳回值。

pub headline: String,
    pub location: String,
    pub author: String,
    pub content: String,
 
}
 
 
impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}, by {} ({})", self.headline, self.author, self.location)
    }
}
 

           

運算符重載

與C++的運算符重載功能類似。Rust通過Trait實作運算符重載功能。

Rust隻支援有限形式的運算符重載。

閉包(Closure)

Rust的閉包與Java、Go、Python、Swift等語言中閉包概念類似,類似于這些語言中的Lambda表達式或者匿名函數。閉包通常不需要定義類型,支援對入參及傳回值類型的推導。閉包支援綁定到變量中使用。閉包中支援使用外部變量。

fv(10);

           

疊代(iterator)

用于對變量集合的循環周遊,與其它語言中的疊代器概念類似。

上面僅描述了rust語言的部分主要特性,完整介紹參見

https://doc.rust-lang.org/book/

2.2 Rust程式組成形式

一個Rust程式可以由Module、Carte、Package組成。Module是代碼邏輯層面的封裝,可以将實作一個功能的所有代碼放在一個Module中,比如網絡Module、檔案系統Module等。Carte是二進制可執行程式或者庫,是rust中的基本編譯單元。Package将多個carte打包在一起。

為什麼物聯網領域使用Rust的項目越來越多?

2.3 編譯建構

Rust使用rustc編譯代碼,編譯過程中會自動進行類型檢查。

rustc編譯依賴LLVM(Windows環境依賴MSVC),在嵌入式環境,還依賴于嵌入式交叉編譯工具鍊。

2.4 Cargo

Rust使用Cargo進行系統建構、代碼檢查及包(crate)管理,同時也可以從crate.io上下載下傳或者更新crate到本地。

  1. Rust優勢與劣勢

Rust是一門賦予每個人建構可靠且高效軟體能力的語言[1]。他的優勢和劣勢非常明顯。

3.1 Rust優勢

Rust具備系統級語言的高性能,同時也具備一些現代動态語言的功能。

3.1.1 高性能

Rust語言具備C/C++等語言的高性能。

Rust運作速度快,記憶體使用率高,占用資源少,沒有垃圾回收及運作時,可以内嵌彙編,可以與其它語言混合程式設計,可以像C/C一樣作為系統級語言,用于作業系統、硬體驅動、嵌入式裝置等的開發。

3.1.2 安全可靠

Rust相比C/C++更安全可靠。

Rust通過所有權機制保證記憶體安全。

Rust具備豐富類型的強類型系統,編譯時編譯器可以做更多的類型檢查,将錯誤在編譯階段提前暴露出來,而不是等到運作時。

Rust通過unsafe關鍵詞将不安全的代碼與安全代碼隔離開。

3.1.3 支援現代進階語言特性

Rust支援泛型、閉包、疊代、切片、函數式程式設計、錯誤處理等特性。

3.2 Rust劣勢

3.2.1 語言複雜

Rust的文法相對比較複雜,強類型、記憶體所有權、unsafe機制等對于初學者上手比較困難。

3.2.2 庫較少

Rust目前官方及第三方庫較少,相關開源代碼較少,很多庫需要借用c語言庫,或者自己重新寫,對于建構複雜系統難度較高。

3.2.3 不夠穩定

Rust語言時間較短,一直處于快速發展中。

  1. Rust在物聯網上的應用與發展

Rust性能高,占用資源少,可移植性好,支援嵌入式開發,且可內建到現有的C代碼中,是以在物聯網裝置上,也可以使用Rust來開發。目前已加有一些公司在使用Rust實作RTOS系統、bootloader、傳感器驅動、網絡協定棧等。

4.1 硬體

Rust支援的嵌入式硬體裝置範圍從8bit單片機到64位4核Cortex-A53的樹莓派。

Rust支援對外設、中斷、異常、IO、記憶體、寄存器的操作,并提供了對應的庫(Crat)。

詳細文檔見:

https://doc.rust-lang.org/stable/embedded-book/start/index.html

Rust目前已支援ARM、RISC-V,MIPS。目前已有幾十款MCU,上百種硬體驅動支援rust,詳見:

https://github.com/rust-embedded/awesome-embedded-rust

4.2 嵌入式運作環境

1)hosted環境

在這種環境下運作時,裝置上已經運作了一個作業系統,并且提供了POSIX、檔案系統、網絡、記憶體管理、線程管理等系統接口。Rust的标準庫會依賴這些接口已支撐rust程式的運作,與在PC機上運作類似。

2)bare metal環境

這種環境,裝置本身沒有作業系統,由rust程式直接在裸機上運作。此時需要使用no_std庫。同時通過libcore獲得與硬體平台無關的代碼,并去掉嵌入式環境中不常用的功能,比如去掉動态記憶體配置設定器等。

使用該模式,可以編譯啟動代碼、核心等。

4.3 支援rust的嵌入式/物聯網項目

詳見

4.3.1 RTOS

Drone OS

支援Rust實時應用的嵌入式作業系統。

FreeRTOS.rs

基于FreeRTOS的rust适配層

FreeRTOS-rust

基于FreeRTOS.rs,增加了rust的改造,比如main的入口使用rust實作,FreeRTOS排程從rust啟動等。

Tock

支援在MCU上多應用并發運作的嵌入式作業系統,核心及驅動使用Rust編寫。

4.3.2 協定棧

runmqtt

使用rust實作的mqtt協定

rubble

使用rust實作的藍牙ble協定棧

4.3.3 其它

internet-of-streams

使用rust建立的iot無線傳感器平台。

rust-raspberrypi-OS-tutorials

基于rust和樹莓派硬體的嵌入式作業系統開發指導

boa

使用rust實作的嵌入式JS引擎。

rust_sqlite

使用rust實作的sqlite。

OpenSK

谷歌開發的基于Tock OS的FIDO2藍牙認證應用,目前支援Nordick nrf52840晶片。

上一篇: 高可用叢集
下一篇: k8s-pdb