第1章 Why Rust
在某些場合下,比如Rust所定位的場合,比競爭對手快10倍甚至2倍,就能決定成敗。它決定了一個系統在市場上的命運,在硬體市場也是如此。
——Graydon Hoare
現在所有的計算機都是並行的…… 並行程式設計就等於程式設計。
——Michael McCool等,《Structured Parallel Programming》
TrueType字型解析器漏洞被某些國家的攻擊者用於實施監控;安全問題對所有軟體都非常重要。
—Andy Wingo
從我們開始用高階語言編寫作業系統以來,系統程式語言在50年間已經有了長足進展,但是有兩個問題一直難以解決:
- 難以編寫安全的程式碼。在C和C++中,要正確管理記憶體,非常困難。由此導致的問題一直以安全漏洞的形式困擾著使用者,至少可以追溯到1988的莫里斯蠕蟲。
- 難以編寫多執行緒程式碼,而這又是充分發揮現代機器能力的不二之選。即時是最有經驗的程式設計師,編寫多執行緒程式碼時也是小心翼翼:併發會引入種類繁多的新bug,而且會使普通的bug更難復現。
來看Rust,這是一門安全、支援併發的語言,而且效能可以媲美C和C++。
Rust是由Mozilla和社群貢獻者開發的新程式語言。與C和C++類似,Rust支援開發者細粒度控制記憶體使用,還保持了語言中的基本操作與所依賴機器的緊密聯絡,開發者可以預期其程式碼的開銷。Bjarne Stroustrup在其論文《抽象與C++機器模型》(Abstraction and the C++ Machine Model)中曾清晰地闡述C++的設計目標:
一般來說,C++實現遵循零開銷原則:無須為未使用的東西付出代價。更進一步,用到的東西,手工優化也不會做得更好。
Rust也遵循這些目標。而且Rust在記憶體安全和可信賴的併發方面也加入了自己的目標。
Rust實現這些承諾的關鍵是其創新的所有權(ownership)、移動(move)、借用(borrow)和編譯時檢查(checked at compile time)系統,而且都精心設計,以配合其靈活的靜態型別系統。所有權系統為每個值建立了清晰的生命週期,使得核心語言不再需要垃圾收集,而且支援合理且靈活的介面,用於管理其他各類資源,如套接字(socket)和檔案控制程式碼(file handle)。移動(move)將值從一個所有者轉移到另一個,借用(borrow)允許程式碼臨時使用一個值,而不影響其所有權。因為很多程式設計師從沒遇到這種形式的特性,所以我們會在第4章和第5章詳細解釋。
同樣的所有權規則也是Rust可信賴併發模型的基礎。以互斥量(mutex)和它要保護的資料之間的關係為例,大部分語言將其留給comments;而Rust實際上會在編譯時檢查,確保你的程式碼訪問資料時鎖定了互斥量。大部分語言會警告程式設計師,將一個資料結構給了另一個執行緒之後,確保不再使用它;而Rust會檢查,確保不會。Rust能夠在編譯時防止資料競爭。
儘管提供了一些物件導向特性,但Rust實際上並不是一門物件導向語言。儘管像函式式語言那樣,Rust傾向於讓對計算結果的影響更明確,但它也不是函式式語言。某種程度上,Rust類似C和C++,但並不適用那些語言中的很多慣用法,所以典型的Rust程式碼和C或C++並不是那麼相似。至於Rust到底是什麼型別的語言,最好先保留意見,等熟悉了這門語言再看看自己怎麼想。
為獲得對語言設計的現實反饋,Mozilla用Rust開發了一款新的Web瀏覽器Servo。Servo的需求和Rust的目標完美匹配:瀏覽器必須表現良好,要安全地處理不可信資料。Servo使用Rust的安全併發機制,充分發揮機器的能力來執行在C和C++中難以並行化的任務。實際上Servo和Rust在共同成長,Servo使用Rust最新的語言特性,Rust基於Servo開發者的反饋不斷演進。
相關文章
- 001 Rust 非同步程式設計,Why AsyncRust非同步程式設計
- Why TypeScript?TypeScript
- Why React HooksReactHook
- WHY review code?View
- Why Redis 4.0?Redis
- why you can be in netherland
- [譯] WebAssembly: How and whyWeb
- [Javascript] Why need arrow function?JavaScriptFunction
- Why are Realistic Diplomas highly wanted?
- Why系列:0.1 + 0.2 != 0.3
- std::bind與std::ref, why and how
- why to learn 計算機系統計算機
- RPC:authentication error:why = server rejected credentialRPCErrorServer
- Why Object.prototype.hasOwnProperty.call(myObj, prop)Object
- [GO-LANG] Why is my trivial program such a large binary?Go
- 非同步 PHP:為什麼? ( Asynchronous PHP: Why?)非同步PHP
- [20190409]latch get 引數where and why.txt
- [譯]使用 Rust 開發一個簡單的 Web 應用,第 1 部分RustWeb
- 向豐田學習 “五WHY分析法”
- PostgreSQL DBA(56) - Why does checkpointer use so much memorySQL
- [20190409]latch get 引數where and why測試.txt
- 使用 Moq 測試.NET Core 應用 - Why Moq?
- Why do STM32 initialization peripherals need to turn on the clock first?
- 什麼是5Why分析法?(附案例)
- why this draw call can‘t be batched with the previous one for Unity2019.4+BATUnity
- 聽老外吐槽框架設計,Why I Hate Frameworks?框架Framework
- 2018-03-24 Why Don't Students Like School? 005
- 精益生產流程最佳化工具——5why
- “5Why分析法”的正確使用姿勢
- 閒聊系列之 5-why root cause分析法
- 一個函式讓你看懂 'Why 0.1+0.2!=0.3'函式
- yangwenmai/learning-rust: Rust 學習之路AIRust
- Rust : RUST_BACKTRACE=1錯誤提示Rust
- [Rust] GenericRust
- Rust 01Rust
- [Rust] OwnershipRust
- awesome rustRust
- S01E01-Buddy, Why do you keep getting stuck like this