- 概述

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%。
- 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打包在一起。
2.3 編譯建構
Rust使用rustc編譯代碼,編譯過程中會自動進行類型檢查。
rustc編譯依賴LLVM(Windows環境依賴MSVC),在嵌入式環境,還依賴于嵌入式交叉編譯工具鍊。
2.4 Cargo
Rust使用Cargo進行系統建構、代碼檢查及包(crate)管理,同時也可以從crate.io上下載下傳或者更新crate到本地。
- 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語言時間較短,一直處于快速發展中。
- 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.htmlRust目前已支援ARM、RISC-V,MIPS。目前已有幾十款MCU,上百種硬體驅動支援rust,詳見:
https://github.com/rust-embedded/awesome-embedded-rust4.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晶片。