Rust語言:安全地併發

http://www.csdn.net/article/2014-02-26/2818556-Rustgit

http://www.zhihu.com/question/20032903程序員

Rust是近兩年Mozilla正在開發的一種新編程語言,以併發、安全和實用爲口號,主要使用場景是系統編程,用來取代C++語言的角色。它有頗多新穎之處,能幫助咱們瞭解編程語言設計的流行趨勢。github

Rust是近兩年Mozilla正在開發的一種新編程語言,它以併發、安全和實用爲口號,主要使用場景是系統編程,用來取代C++語言的角色。因爲Rust還在快速的開發和演進中,每一個版本都會產生一些不兼容的變動,如今也許並不是是學習這門語言細節,並真正使用它的最佳時機。不過,這並不影響咱們瞭解Rust語言:做爲多年來鮮有的新系統編程語言,它有頗多新穎之處,也能夠幫助咱們瞭解一些編程語言設計的流行趨勢。編程

併發安全

與如今流行的不少新語言同樣,Rust在語言層面支持了綠色線程(Green threads)——Task。Task做爲併發執行的單元,是用戶空間的「線程」,建立和調度成本較低,能夠大量共存。Task之間經過消息傳遞通訊,沒有直接共享數據。從最近的流行趨勢來看,綠色線程幾乎已成爲併發方案大戰的最終贏家。除了Rust,以前流行的Go、Erlang、Python的Gevent,以及最近Clojure世界裏正在發展的core.async,採用的都是這種綠色線程模式。服務器

綠色線程的程序與傳統多線程程序的寫法幾乎一致。在編寫服務器程序時,與事件驅動的回調機制相比,編寫更簡單、表義更清晰。當併發任務增多時,傳統的多線程程序因爲啓動線程和調度線程的成本高而使系統總體性能下降。而綠色線程能夠基本不受限制,隨意建立。Rust文檔指出,在32位系統上能夠支持數十萬個Task同時存在。多線程

Task也是Rust程序的基礎單元,一個Rust進程由多個並行的Task組成,main函數自己也是一個Task。Task之間經過一個(Port, Chan)元組傳遞數據。Port和Chan至關於管道的兩端,Port用於取數據,Chan用於發送數據。下面的例子裏,咱們經過do spawn語法(相似Ruby的block語法),啓動一個新Task,並打印收到的數據。閉包

引用系統併發

Rust語言設計的核心是安全性(這裏安全性是指Safety,而非Security)。Rust但願經過語言的機制和編譯器的功能,把程序員易於犯錯、不易檢查的問題解決在編譯期,避免運行時的Segmentation Fault。Rust的設計能夠說是到處當心。Clojure語言強調可變性給編程帶來的複雜性,在Rust語言中,設計者對這點也有格外的重視。除非特別聲明爲mut,全部Rust的局部變量默認都是不可變的,對不可變變量值的修改會致使編譯器直接報錯。Rust的安全性還經過獨有的引用類型系統來實現。async

Rust語言中對內存塊的引用類型叫作box。最新版本的Rust在語言層面只保留了一種owned box,它在使用時具備一種全部權(Ownership)的概念,只有具備全部權的變量才能夠訪問這段內存。owned box在同一時刻只容許一個變量做爲全部者,它的變量賦值稱爲move。一旦owned pointer被賦值,用戶就沒法經過原先的引用訪問這塊數據,這種錯誤會在編譯時檢查。下面是一個簡單的例子。

~表明owned box,這裏咱們把一個包含值爲50的owned box賦給owned pointera。而後把a的全部權經過賦值的形式move給b。最後咱們試圖經過*a訪問這個值。在C語言裏,這時a和b同時指向統一塊內存,能夠經過*a訪問到這裏的值。但Rust的全部權機制給予了這段內存額外的保護。編譯這段程序將失敗:

編譯器會明確地指出錯誤的引用在何處被move。事實上全部owned box的生命週期管理都是直接在編譯時完成的,編譯器經過靜態檢查跟蹤使用狀況,完成內存開闢和回收。這是Rust確保編程正確、安全的重要手段。

新版本的Rust在標準庫中提供std::rc::Rc(引用計數)和std::gc::Gc(垃圾回收)類型,取代了原先的managed box,用來提供能夠有限共享的引用類型。

在Task間傳遞數據,若是要避免數據拷貝,也有專門的引用類型:用於不可變數據的(atomically reference counted,原子的引用計數類型),以及用於可變數據的(帶讀寫鎖的原子引用計數類型)。在操做可變數據時,經過內在的讀寫鎖控制對共享數據的訪問,從而在API層面實現安全性。

Rust謹慎地定義如此繁多、各具功能的引用類型,就是但願用戶在編程過程當中,根據應用場景、引用的功能職責,選擇合適的類型,進而在引用類型系統和編譯器的保護下,減小在運行時出錯的機會。這一點也和Clojure的4種引用類型的設計初衷相似,不過Clojure並不能提供太多編譯時的安全保護。

更多

篇幅所限,我只選擇了Rust最具特色的兩個部分介紹。Rust是一門特色鮮明、設計精巧的語言,而絕非普通的「又一門編程語言」。在語法層面,它包含了模式匹配、閉包、泛型等流行功能,做爲系統編程語言,使用的溫馨度不亞於腳本語言。另外還能夠經過FFI(Foreign Function Interface)調用已有的C語言庫,知足了實用性的須要。

若是你也開始對這門新語言感興趣,能夠:

 

  •  經過它的文檔學習最新版本的語法和細節;
  •  加入rust-dev郵件列表瞭解開發者的討論;
  •  關注Rust項目代碼倉庫;
  •  關注Delicious和Reddit上流行的Rust連接;
  •  關注TheweekinRust,介紹每週Rust語言正在發生的變化(http://cmr.github.io/)。

 

做者孫寧,AVOS Cloud高級工程師,負責服務器端開發。Clojure語言愛好者,社區活躍成員,開發維護了多個Clojure開源項目。

相關文章
相關標籤/搜索