Rust語言教程

libchaos發表於2018-10-12

內容

  • 介紹
  • 特性總結
  • rust 語言的特性(零開銷的抽象移動語義
  • 結論

介紹

Rust是一門關注與安全,速度與併發的程式語言。它的設計理念就是比C或者C++開發更安全,比Python或者Ruby速度更快。Rust語言的絕大部分的安全檢查與記憶體管理都是在程式的編譯期完成,因此的程式的執行時開銷不會很大。這個特性使得Rust在以下用例(1. 程式需要可預測的資源申請, 2.嵌入式裝置,3.底層程式碼類似裝置驅動)下比java之類的語言更安全。Rust也可以被用來開發Web後端Server。

特性總結

Rust成功解決的一些問題。

  • 問題:由於虛擬函式(執行時動態確定)呼叫的高成本,更傾向於將重複程式碼抽象

  • 解決:零成本抽象(本人不理解。。。)零抽象應該說的是,只用只需要用的,不用不需要的,也就是說,不呼叫不多餘的東西,它並不說由編譯器生成的程式碼,肯定是最好的選擇,不會出現效能損耗。

  • 問題: 記憶體釋放後使用,兩次釋放同一記憶體,懸空指標

  • 解決: 通過智慧指標以及引用的使用避免這些問題以及通過編譯時期限制原始指標的使用

  • 問題:Null指標解引用的錯誤

  • 解決:Rust中提出Option型別作為null指標的替代品

  • 問題: 資料競爭

  • 解決: Rust在編譯期通過內建的靜態分析工具來檢測和預防可能的資料競爭

  • 問題: 未初始化的變數

  • 解決: 編譯器要求所有的變數在使用前都都必須初始化。

  • 問題: 標準庫中大量使用的實用程式型別的遺留設計(不瞭解)

  • 解決: 內建,可組合,結構化的型別: 元組,結構,列舉型別。模式匹配可以方便的使用結構化的型別,一些標準庫全面擁抱模式匹配。

  • 問題: 嵌入式裝置對程式的執行時開銷要求高

  • 解決: Rust的執行時開銷很低

  • 問題: 呼叫C語言或者其他語言的庫

  • 解決: 看不懂(Only header declarations are needed to call C functions from Rust, or vice versa。No overhead in calling C functions from Rust or calling Rust functions from C)

Rust語言的特點

零成本抽象

抽象是 Rust 開發人員用來處理複雜程式碼的一個很好的工具。 一般來說,抽象帶有執行時成本,因為抽象程式碼位元定程式碼更低效。 然而,通過好的語言設計和編譯器優化,一些抽象可以使執行時成本有效地為零。 這些優化的通常來源是靜態多型性(模板)和行內函數,兩者都被Rust完全包含。 迭代器是通常使用的抽象(因而是大量優化)抽象的一個例子。Rust的迭代器提供了許多內建的組合器來運算元據序列,使程式的表達更加簡潔。

    let data1 = &[3, 1, 4, 1, 5, 9, 2, 6];
    let data2 = &[2, 7, 1, 8, 2, 8, 1, 8];
    let numbers = data1.iter() // {3, 1, 4...}
                 .zip(data2.iter()) // {(3, 2), (1, 7)...}
                 .map(|(a, b)| a * b) // {6, 7, ...}
                 .filter(|n| *n > 5) // {6, 7....}
                 .take(4) // 總共取4個
                 .collect::Vec<_>();
    println!("{:?}", numbers);
複製程式碼

函式組合器(map, zip,filter之類)使用了閉包和匿名函式,如果compile natively(本地編譯,是啥?)會有明顯的執行開銷,但是由於LLVM的優化,使用這個程式碼執行效率和手編版的一樣。

    use std::cmp::min;
    let mut numbers = Vec::new();
    for i in 0...min(data1.len(), data2.len()) {
        let n = data1[i] * data2[i];
        if n > 5 {
            numbers.push(n);
        }
        if numbers.len() == 4 {
            break;
        }
    }
複製程式碼

相關文章