第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非同步程式設計
- WhyASMLIBandwhynot?ASM
- Why TypeScript?TypeScript
- Why NoSQL?SQL
- Why React HooksReactHook
- WHY review code?View
- Why Redis 4.0?Redis
- [譯] WebAssembly: How and whyWeb
- WhyRedis4.0?Redis
- why use dynamic SQL?SQL
- whystea2
- whystea1
- why app_start startAPP
- why does angular js rockAngularJS
- Why MVC is Better?(翻譯)MVC
- 2 Why Firms Work Together
- Why would a reverse index be useful ?Index
- Why Java is better than .NETJava
- What are Windows ACLs and why are they important?WindowsImport
- erlang學習: why OTP
- [Javascript] Why need arrow function?JavaScriptFunction
- why you can be in netherland
- 設計模式 what? why? how?設計模式
- 5 Why Worry About Research and Developmentdev
- Why MongoDB Never Worked Out at EtsyMongoDB
- Why Startups Should Not Choose NoSQLSQL
- Why MongoDB? It's the developers, stupidMongoDBDeveloper
- why Buffer Cache Hit Ratio < 0
- Why LA let Ariza go awayGo
- why to learn 計算機系統計算機
- Why are Realistic Diplomas highly wanted?
- AMD and CMD are dead之Why Namespace?namespace
- Web效能優化:What? Why? How?Web優化
- Why Do People Commit Suicide?MITUIIDE
- Why Archive, FRA Diskgroup Gets Mounted / DismountedHive
- Why mobile web apps are slowWebAPP
- [譯]使用 Rust 開發一個簡單的 Web 應用,第 1 部分RustWeb
- RPC:authentication error:why = server rejected credentialRPCErrorServer