第1章 Why Rust

zangxt發表於2018-03-19

在某些場合下,比如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開發者的反饋不斷演進。

相關文章