class: middle, center # Onboarding Training: Rust ![](./rust-vs-others/rustconf-footer-illustration.svg)
@weihanglo
--- ## 你是否曾有以下疑問? - Rust 是什麼鬼語言 - 感覺沒什麼人在用 - 應該下個月就死了吧 - 老子學不動了 - 台上的,你可以一天不提 Rust 嗎 🖕🏽 ![](https://intro.rustbridge.com/img/ferris.gif) --- ![](rust-vs-others/aws.png) [Why AWS loves Rust, and how we’d like to help](https://aws.amazon.com/blogs/opensource/why-aws-loves-rust-and-how-wed-like-to-help/) --- ![](rust-vs-others/choromium.png) [Rust and C++ interoperability](https://www.chromium.org/Home/chromium-security/memory-safety/rust-and-c-interoperability) --- ![](rust-vs-others/cloudflare.png) [Enjoy a slice of QUIC, and Rust!](https://blog.cloudflare.com/enjoy-a-slice-of-quic-and-rust/) --- ![](rust-vs-others/curl.png) [Project Hyper-as-a-HTTP-backend-in-curl](https://github.com/curl/curl/wiki/Hyper) --- ![](rust-vs-others/discord.png) [Why Discord is switching from Go to Rust](https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f) --- ![](rust-vs-others/figma.png) [Rust in Production at Figma](https://www.figma.com/blog/rust-in-production-at-figma/) --- ![](rust-vs-others/fuchsia.png) [Fuchsia Programming Language Policy: Rust](https://fuchsia.dev/fuchsia-src/contribute/governance/policy/programming_languages#rust) --- ![](rust-vs-others/microsoft.png) [Microsoft: Rust Is the Industry’s ‘Best Chance’ at Safe Systems Programming](https://thenewstack.io/microsoft-rust-is-the-industrys-best-chance-at-safe-systems-programming/) --- ![](rust-vs-others/sentry.png) [https://thenewstack.io/microsoft-rust-is-the-industrys-best-chance-at-safe-systems-programming/](https://blog.sentry.io/2016/10/19/fixing-python-performance-with-rust) --- class: middle, center # 看完實際案例後,覺得 Rust 是怎樣的語言?
--- **vs. C++ (memory safefy)**
--- **vs. JavaScript (move semantic/immutable)**
--- **vs. JavaScript (move semantic/immutable)**
--- **vs. Python (fibonacci sequence)** ![](https://i.imgur.com/1WPCHxn.png) --- **vs. Python (fibonacci sequence)**
--- **vs. Kotlin (expression-oriented/pattern matching)**
--- **vs. Kotlin (expression-oriented/pattern matching)**
--- **vs. Ruby (quick sort)**
--- ## 如何分類 Rust 這個語言 > A language empowering everyone to build _reliable_ and _efficient_ software. - 靜態強型別編譯語言(借助 LLVM 產生機器碼) - [無垃圾回收](https://steveklabnik.com/writing/borrow-checking-escape-analysis-and-the-generational-hypothesis) - [和 C 一樣快](https://benchmarksgame-team.pages.debian.net/benchmarksgame/which-programs-are-fastest.html) - 跨平台(包含瀏覽器與嵌入式)
--- ## Reliability: Memory Safety - 安全永遠是 Rust 的第一考量 - 為了安全,可以犧牲一點效能,例如 array boundary check,或是為了讓自引資料結構的記憶體位置不變,而引入令人費解的 [`core::pin::Pin`](http://doc.rust-lang.org/1.48.0/stable/pin/struct.Pin.html)。 ![](rust-vs-others/rust-features.png) _Image source: https://arxiv.org/pdf/2003.03296.pdf_ _Xu, H., Chen, Z., Sun, M., & Zhou, Y. (2020). Memory-Safety Challenge Considered Solved? An Empirical Study with All Rust CVEs. arXiv preprint arXiv:2003.03296._ --- ### Reliability: Stability Rust 提供給開發者極為穩定的開發體驗,除了六週發佈一個[小版號](https://forge.rust-lang.org/#current-release-versions) - 嚴格遵守語義化版號,1.5 版的 code 用現在(1.48)版編譯器仍能正常編譯 - 開出去的 API 不僅要向過去相容,[更向未來相容](https://github.com/rust-lang/cargo/blob/d484b65a/src/doc/src/reference/external-tools.md#information-about-package-structure) - 所有大型 Feature 都會經過[嚴格審核的 RFC 過程](https://rust-lang.github.io/rfcs/introduction.html)才會開始開發
--- ## Reliability: Community Trust - 所有 Roadmap、社群治理,團隊成員異動都公布在[官方部落格](https://blog.rust-lang.org/)和[官網](https://www.rust-lang.org/governance) - 為了 Rust 基金會成立,除了非同步收集意見,另外辦了[三場直播給不同時區的人即時與基金會籌備小組對談](https://blog.rust-lang.org/2020/12/07/the-foundation-conversation.html) - 到官方論壇、官方 Discord 和 Zulip,甚至非官方 Reddit,總是會有官方的人提供解答給你 ![](https://i.imgur.com/z8qYswD.png) --- ## Efficiency: Runtime Performance 隨意找個例子,不解釋 ![](https://devblogs.microsoft.com/aspnet/wp-content/uploads/sites/16/2020/10/grpc-perf-graph.png) --- ## Efficiency: Developing Performance Rust 注重開發者體驗,雖然仍有部分面向需加強,但整體已十分完善 - 不明確的編譯錯誤訊息視為 Bug,以增加使用者開發體驗 - 自帶 Cargo 套件管理工具 + 編譯工具,可上傳到 [crates.io](https://crates.io) - Docstring(註釋即文件)可用 markdown 編寫,並可生成的 API doc(官方 API doc 集中營 [docs.rs](https://docs.rs)) ![](https://i.imgur.com/E3tbFbK.png) --- ## Efficiency: Resource Economy - 零成本抽象,節能減碳救地球 - 奉行 C++ 的哲學**「you only pay for what you use」**
--- ## Rust 特性一覽 ![](https://i.imgur.com/RPm2Bxk.png) _Source:[2020 年度 Rust 官方問卷調查結果](https://blog.rust-lang.org/2020/12/16/rust-survey-2020.html)_ --- class: middle ## Variables ```rust let name = "Ashley"; let age = 30; println!("Hi, {}! You are {} years old.", name, age); ``` ---
--- `x` 宣告兩次,編譯會過嗎?
--- [原生型別](https://doc.rust-lang.org/stable/std/#primitives)
--- 函式這樣宣告
--- 為什麼陣列編譯不過?
--- 通常使用 [Vec](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html) 動態陣列
--- 迴圈這樣寫
--- ## [所有權 Ownership](https://rust-lang.tw/book-tw/ch04-01-what-is-ownership.html) - Rust 中每個數值都會有一個變數作為它的擁有者(owner)。 - 同時間只能有一個擁有者。 - 當擁有者離開作用域時,數值就會被丟棄。([RAII](https://en.wikipedia.org/wiki/RAII)) ```rust let s1 = String::from("hello"); let s2 = s1; // s2 is the new owner. println!("{}, world!", s1); // Error. Value is moved. ```
--- 函式參數也會進行所有權轉換
--- class: middle, center # 如果 Rust 不能共用變數,那寫屁 code??? ![](https://i.imgur.com/9lFEsjq.png) --- [可變引用與不可變引用](https://rust-lang.tw/book-tw/ch04-02-references-and-borrowing.html)
--- ## [可變引用與不可變引用](https://rust-lang.tw/book-tw/ch04-02-references-and-borrowing.html) 在同一個 scope 下,Rust 惡名昭彰的 borrow checker 會檢查所有的引用: - 同時有多個 `&T` 不可變引用,但無法與 `&mut T` 同時存在 - 只能有一個 `&mut T` 可變引用,且無法與 `&T` 同時存在 同樣地,引用與數值的所有權行為相同,出了作用域就會被丟棄([drop](http://doc.rust-lang.org/stable/core/ops/trait.Drop.html)) ```rust fn main() { let mut v = vec![1, 2, 3]; change_vec(&mut v); change_vec(&mut v); println!("v is {:?}", v); } fn change_vec(v: &mut Vec
) { v[0] *= 5; // `v` 這個 &mut 引用在此被 drop,但不影響原始的 `vec![1,2,3]` } ``` --- 前面的題目,改寫成借用形式
--- 可變引用再一題,嘗試改變 `Foo` struct 的資料結構
--- ### 沒有次回的次回預告:[Lifetime annotation](https://rust-lang.tw/book-tw/ch10-03-lifetime-syntax.html)
_Source: [Graphical depiction of ownership and borrowing in Rust](https://rufflewind.com/2017-02-15/rust-move-copy-borrow)_ --- 如何標註[生命週期](https://rust-lang.tw/book-tw/ch10-03-lifetime-syntax.html)(一般情況下你不會也不想做這件事)
--- ## FAQ - Q:Rust 主要想解決誰的痛點 最初是 Firefox 在平行處理 CSS 用 C++ 寫一直有各種 memory bug,不過最近 Mozilla 裁掉一堆 Rust/Servo 的人 😂 - Q:當初為什麼想學 Rust 原本是像學個有辦法摸記憶體配置的語言,看來看去選擇不多,加上對 Mozilla 社群開源理念的支持。 - Q:Rust 最為人詬病的地方 編譯速度沒有之一,跟 C++ 有得比。 - Q:為什麼 Rust 標準函式庫缺東缺西的,連 random 都沒有 Rust 團隊為了函式庫的穩定與相容性,非常嚴格把關進入標準函式庫的函式,像 regex 和 random 這種大家需求差異大,而且迭代更新快速的套件,就傾向由社群管理。以免發生像 urllib urllib2 等混亂或人力不足。 --- ## FAQ - Q:Rust ( 或 Rust 相關 io framework ) 的 io 處理機制與 Node.js/Go 的比較 我猜應該是想問 async IO 或是 web framework 這種 IO。 Rust 標準函式庫提供非同步計算的抽象 [trait Future](https://doc.rust-lang.org/stable/std/future/trait.Future.html) 和其他相關的功能,並且 Rust 支援 `async` 語法,可以讓 function 或 block 變成非同步,回傳任何 `impl Future`(可以想像是回傳 JavaScript 的 Promise)。由於沒有直接提供 runtime,所以 Rust 生態自幹輪子寫了很多套類似 libuv libev 等 async Runtime,最有名支援度最好的是 [Tokio](https://tokio.rs/)。Tokio 就幾乎類似 libuv,呼叫 epoll/kqueue/IOCP 然後有個 event loop 和各種 work-stealth mode 的 Schuduler(目前是這個模式)。 由於 Rust 原生支援 `async fn`,所以寫起來更接近 JavaScript,和 Go 自己實作 callstack 的 coroutine 反而不太一樣。不過受益於 Rust 強大的 Macro system,也有做出[類似 Goroutine 的套件](https://github.com/Xudong-Huang/may)。 - Q:現在入坑來得及嗎 絕對來得及,許多開源專案還有不少低垂的果實,台灣 Rust 生態也不完善,就缺你當社群大佬。 --- ## 學習資源 - [Rust 官網](https://www.rust-lang.org/zh-TW/) - [Rust 程式設計語言(正體中文版)](https://rust-lang.tw/book-tw)(這是官方教學) - [Rust 標準函式庫](https://doc.rust-lang.org/std/)(推薦閱讀!可以學到超多) - [Rust 超詳細非官方作弊表](https://cheats.rs/) - [Rust 版 Caniuse.rs](https://caniuse.rs/) - [Rust Taiwan Telegram 群組](https://t.me/rust_tw) - [致敬 A Tour of Go 的 Tour of Rust](https://tourofrust.com/00_en.html)(品質還行,但繁中翻譯有缺需加強) - 直接在 Twitter/GitHub/Telegram 聯絡我 @weihanglo