107.04.15 rust 之路 00 語言介紹

首先,這裡的 Rust 是一種程式語言,不是 steam 上的遊戲 @@
道路應該要沒有盡頭,就像學習,以此自勉能持續
Photo by Amanda Sandlin on Unsplash

前言


老實說我第一次接觸 Rust 已經很久了,是在去年的暑假
記得當時還只是 1.18.0 版,現在已經到 1.25.0 了
而且這語言還算是相當新的語言
因此有許多的功能都還在嘗試以及更新,偶爾更會有重大變更

而且 Rust 又是一個幾乎萬能的系統語言,表示其語法偏向繁雜
有點像 C++ 那樣全方位
而因為語言設計的特性緣故,使得 library 管理上更加容易,且有 Cargo 的加持
也有點像 python 那樣使用別人開發好的模組

老實說學習一個語言是需要大量接觸的
但是總有藉口指向學期間的課業繁忙,事實上空閒時間仍算是相當充裕
此篇文章是 Rust 之路的起點
希望盡量去解釋細節,所以產出可能會很久,請見諒 QuQ
其實還是有點小忙的QuQ
也歡迎有興趣的人可以一起學之類的,要也可以建一個共同編輯的 blog 來互相進步 OuO
有錯誤更正還是建議也歡迎 OuO
話說有些英文我覺得不用翻就不另外去創造奇怪翻法了 QuQ

簡介

Rust 是 Mozilla 主導開發的編譯型程式語言
主打安全 (safe)、並行 (concurrent)、實用 (practical)
2010年面市,2015年第一個穩定版本釋出
在 2011年完成自舉,也就是用 Rust 寫出 Rust 的編譯器 rustc
最受矚目的專案是 Servo 一個網頁瀏覽器排版引擎

跑的和C/C++幾乎一樣快,然後不會segfault!
-
为什么我说 Rust 是靠谱的编程语言
学一点Rust又不会怀孕(1) - 知乎专栏 - Rust的核心价值

新聞

就放一些在其他網站看到的新聞和介紹
This Week in Rust
開發者年度調查出爐,最賺錢和開發者最愛的程式語言全出列
2018年的Rust:使用起来更容易
2018年Rust發展計畫出爐,將聚焦提升生產力
強化WebAssembly與Javascript互通性,Rust向網頁語言再進一步
    -> GO官方將支援編譯成WebAssembly,目標取代Javascript

語言特性 (來自官網)

1. 零花費的抽象化 (zero-cost abstractions)

Bjarne Stroustrup 的定義
In general, C++ implementations obey the zero-overhead principle:
What you don’t use, you don’t pay for. And further: What you do use,
you couldn’t hand code any better.

Bjarne Stroustrup’s “Foundations of C++”
e.g.
Python sum(range(1000)) 真的執行 1000 次加法
Rust (0..1000).sum() 編譯後直接就是常數 499500
e.g.
Java 的 class,A 裡有 B 的 member,那要從 A 存取 B 的這個 member 就需要兩次的指針操作
Rust 的 struct,直接存在 heap 中所以可以直接存取
-
Zero-cost futures in Rust
Abstraction without overhead: traits in Rust
How to understand zero cost abstraction for Rust
Rust所宣称的zero-cost abstractions是怎么回事?

2. 移動語義 (move semantics)

什麼是"移動",更好理解應該是"非複製"
這在 C++ 11 也有,但是是為了性能
而在 Rust 是預設行為,主要是為了記憶體安全性
所以產生了一個 Rust 中的重要概念 -- ownership:資源只能允許一個擁有者 (owner)
例如下面例子就會編譯失敗,因為 x 的值已經移給 y 了,所以操作 x 就不合法
fn main() {
    let x = String::from("OuO");
    let y = x;
    println!("{}", x);
}
-

3. 保證記憶體安全 (guaranteed memory safety)

原理是使用所有權 (ownership) 和借用 (borrowing)
還有 Rust 的編譯器會提早警告錯誤的使用方式,雖然有點囉嗦但是為了你好 OuO
-
How does Rust guarantee memory safety and prevent segfaults?

4. 多執行緒下不競爭資源 (threads without data races)

Rust 保證不存在的資源競爭有三種情形
(1) 兩個以上的執行緒同時存取同一塊記憶體空間
(2) 其中一個執行緒正在寫入
(3) 其中一個執行緒是非同步
-
Data Races and Race Conditions

5. trait-based generics

trait (特徵) 有點像 Java 的 interface,但 trait 只定義了函式
而這個特性就是利用 trait 的方式支援泛型,並透過 trait bound 來確保這些型別能夠實現這個 trait
-
Traits
学一点Rust又不会怀孕(3) - 知乎专栏 - 特征(trait);trait object

6. pattern matching

有點像 C/C++ 的 switch case 但是更加彈性,例如 case 不限於數字或字元也可以是 struct
此設計也影響了 C# 7 的模式比對
-
Pattern matching - wiki
Patterns

7. 型別推論 (type inference)

指程式語言在編譯期中能夠自動推導出值的資料型別的能力
-
型別推論 - wiki

8. minimal runtime

這項主要應該是說 Rust 不需要像 Java 的 JVM 而可以直接執行
所以執行時期較有效率
-
Performance - Rust FAQ
A Guide to the Rust Runtime

9. efficient C bindings

可以用 C 來呼叫 Rust 產生的 library
由於這個特性使得很多原本 C 的專案
因此使用這個方法逐步地用 Rust 取代,不用承擔一次完全重寫的風險
-
Exposing a Rust Library to C
Criticizing the Rust Language, and Why C/C++ Will Never Die

結語

雖然好像少少的不過還是花了三天啊 QuQ
不過少少的讀起來比較沒壓力(x
下一篇 rust 之路 01 沒意外是環境建置 嗎

沒有留言:

張貼留言

^ Top