Rust 程式語言

超簡單介紹

Rust 是 Mozilla Research 設計出來的程式語言。(千秋覺得)它最主要的特性是

  • 以安全為主要訴求

    藉著型別系統,實現資料所有權以及借用(Ownership & borrowing)的概念,在編譯的階段便可以確認資源的使用情況,讓開發者不需要介入資源的管理。

  • 強大的靜態型別系統

    利用 trait 達成多型、可以建造 algebraic data type 、此外,如上一點所描述,在型別系統中標示了資料的所有權等等。 Rust 利用此型別系統達成了資源管理安全,以及並行處理安全

  • 表達力強

    有 functional programming 等高階語言中可見的表達模式

  • 執行效率好

    利用 LLVM 直接編譯到機器碼。注意這個描述只限於 release 模式。

  • 可用於嵌入式系統開發

    您甚至可以利用 #[deny(box-pointers)] 來檢查您的程式是否使用了 heap ; C 語言的話,不要使用 malloc / free 就保證不會用到 heap ,但是沒人替您檢查這個…

千秋覺得 Rust 有許多和 Haskell 相似的地方(但是它們兩者事實上有非常大的差異)

  • 強大的靜態型別系統( algebraic data type 以及 trait / typeclass )

    帶來了 Option (Rust)以及 Maybe (Haskell),不需要使用 null 了。

  • Pattern matching

  • 資料預設為不可變(immutable)

    在 Rust 您必須明確指出某個資料為可變,方可改變其內容;而在 Haskell 裡面,如果沒使用奇怪的招數(像是利用 FFI 來修改資料),那資料都是不可變。

  • Operator overloading

    在 Rust 裡,藉著實作 trait 來賦予資料使用運算子的能力;在 Haskell ,運算子被視為函數。此外,使用 Haskell 時,您可以定義新的運算子(<, ., _>, >=> 等稀奇古怪的),也可以把一般函數當成運算子

    1
    2
    3
    4
    -- haskell code
    -- r1 is equivalent to r1
    r1 = add a b
    r2 = a `add` b
  • 簡易的 FFI (foreign function interface)界面

您可前往 其官方網站 一探究竟

開發工具

若透過 官方的安裝方式 來安裝,則已經取得建置系統 cargo 以及開發工具版本管理系統 rustup ,加上編譯器 rustc 。此時只要挑選順手的編輯器即可

  • 建置及包裹管理系統

    官方有 cargo (使用官方的安裝方式會一併取得)

    若需要在 Linux 建置 Windows 的執行檔,請參考 此文

  • 開發工具版本管理

    官方有 rustup (使用官方的安裝方式會一併取得)

  • 文字編輯器

    • IntelliJ IDEA + rust plugin

      目前只有這個文字編輯器使用的 plugin 不依賴 racer 來進行程式碼的自動完成

    • Atom

      language-rust + racer + linter-rust

    • Visual Studio Code

    • Emacs

    • Vim

  • 除錯器

  • 測試工具

    cargo test 即應可滿足大多數需求。值得注意的是,cargo test 會一併測試註解說明(//! 以及 ///)內的範例程式碼

學習資源

Rust 的學習資源(相對於甚至已有互動式做中學的 JavaScript 以及 Python 來說)似乎不多。您可以參考 https://github.com/ctjhoa/rust-learning 來了解現有的學習資源。

想學習 Rust 的人可以先用 The Rust Programming Language 來:

  • 能夠弄一個 hello world 程式

  • 弄懂大略的語法

    函數宣告、資料結構、方法宣告、trait 的概念、型別系統的概念

    您可以利用位在 https://github.com/carols10cents/rustlings 的小練習來熟悉語法

  • 稍加了解 ownership, borrowing 以及 lifetime 的概念

接著,利用 exercism 來做練習,讓自己更加熟悉 Rust 的語法以及設計哲學。把 exercism 內的練習做個九成之後,就可以考慮看看要不要弄個中小型專案啦!

程式庫

您亦可參考 Awesome Rust 來取得更多最新的程式庫資訊

  • 基礎輔助

    • 編譯系統

      • libc

        提供比較適用於 FFI 的型別,以及 C runtime 中的某些服務

      • gcc

    • 數學與計算

      • rand

        產生隨機數

    • 安全與加密

      • ring

        在 Windows 以及 macOS 使用作業系統服務;其他作業系統使用 OpenSSL

    • 日期與時間

      • chrono
    • 剖析器製作

      • nom
    • 多執行緒 / 多功 / 異步處理

      • actix

        Actor system in rust

      • mio

        Metal IO acync IO library

      • tokio

        Async IO library build on top of mio

      • may

        Corutine library in Rust programming language

  • 框架

    • 本機遊戲

      • piston

      • ggez

    • 伺服器以及服務設計

      • rouille

      • hyper

        • reroute

          利用 regular expression 提供 routing 的功能

      • pencil

      • iron

      • nickel

      • rocket

        目前(2017/10/26)需要使用 nightly 的編譯器方可使用

      • Gotham

  • 使用者界面

    • 設定參數處理(命令列或者設定檔)

      • 命令列

        • clap

          功能豐富的命令列參數處理程式庫

    • 文字

      • colord

        替您的 terminal 小工具添加色彩

    • 圖形

      • gtk-rs

      • conrod

        Part of piston

  • 網路通訊

    • HTTP

      • hyper

      • reqwest

    • FTP

      • ftp
    • TCP etc.

      • smoltcp

        Standalone, bare-metal-in-mind basic protocol library.

  • 資料格式處理

    • 資料序列化(serialization)

      • serde

        可以處理 json, xml 等諸多格式

    • 資料格式剖析以及輸出

      • serde

      • pikkr

        JSON parser

      • byteorder

        位元順序轉換、自位元陣列 (&[u8]) 讀取資料

      • quick-xml

        Streaming pull XML parser & writer

  • 文字處理

    • 國際化

      • fluent
    • 樣板引擎 (Template engines)

      • askama

        使用 macro 的樣板引擎

      • t4rust

        使用 macro 的樣板引擎

  • 其他

    • optional_struct

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      // Copy and modified from README of `optional_struct`
      #[derive(OptionalStruct)]
      struct Foo {
      meow: u32,
      woof: String,
      }
      // The following code are generated by the derived trait `OptionalStruct`
      struct OptionalFoo {
      meow: Option<u32>,
      woof: Option<String>,
      }
      impl Foo {
      pub fn apply_options(&mut self, optional_struct: OptionalFoo) {
      // Set fields according to `optional_struct`
      }
      }
      // End generated code region

自行撰寫之文章

(注意:文章轉移中)

其他高手的文章

文章目錄
  1. 1. 超簡單介紹
  2. 2. 開發工具
  3. 3. 學習資源
  4. 4. 程式庫
  5. 5. 自行撰寫之文章
  6. 6. 其他高手的文章