最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

原版豆瓣評分8.8,這本書講透了 Rust 的靈魂

2020-10-30 14:18 作者:圖靈社區(qū)  | 我要投稿


在某些場景,比如 Rust 的應用場景下,速度是競品的 10?倍,哪怕只是兩倍都是關系到生死存亡的大問題。速度決定了這套系統(tǒng)在市場上的命運,跟硬件市場絲毫不差。

——Graydon?Hoare


從開始使用高級語言編寫操作系統(tǒng)至今的 50 多年來,系統(tǒng)編程語言已經取得了長足的進步。然而,有兩個問題至今仍無法破解。

  • 要寫出安全的代碼并不容易。想用 C 和 C++ 恰當地管理好內存特別困難。幾十年來,用戶已經飽受安全漏洞的侵害,至少可以追溯到 1988 年的 Morris 蠕蟲病毒。

  • 編寫多線程代碼非常困難,而多線程又是充分利用現(xiàn)代計算機能力的唯一方式。即便是經驗豐富的程序員,在應對與線程有關的代碼時也必須多加留心,因為并發(fā)會導致各式各樣的新 bug,還會讓普通的 bug 難以復現(xiàn)。


那么有這樣一種語言,它不僅具有 C 和 C++ 性能,同時安全且支持并發(fā)。它就是 Rust。你可能 1 周入門 Python,兩周上手 GO,但是入門 Rust,似乎讓人皺了眉。不過這絲毫不影響大家對 Rust 的喜愛程度??v然在 2020 年?Stack Overflow 的報告中?Rust 被開發(fā)者評為「最愛」的編程語言,但是 97% 的人還是沒有真正使用過 Rust。

Rust 是一門怎樣的語言?


Rust 是由 Mozilla 和社區(qū)貢獻者共同開發(fā)的一種新的系統(tǒng)編程語言。與 C 和 C++ 類似,Rust 為開發(fā)者使用內存提供了完善的控制機制,在語言的原始操作與運行它的機器的操作之間維護著一種緊密的關系,讓開發(fā)者能夠預測自己代碼的運行成本。

Rust 承載著 C++ 之父 Bjarne Stroustrup 在他的論文“Abstraction and the C++ Machine Model”中明確提出的理想:

總的來說,C++ 實現(xiàn)遵循零開銷原則:不用的,不必為之付出代價;要用的,也不會有代碼比它更好。

在此基礎之上,Rust 又追加了自己內存安全和可靠并發(fā)的目標。

Rust 實現(xiàn)上述所有承諾的關鍵在于所有權(ownership)、轉移(move)和借用(borrow)機制造就的新型系統(tǒng),而編譯時檢查和認真的設計又成就了 Rust 靈活的靜態(tài)類型系統(tǒng)。

所有權機制為每個值規(guī)劃了清晰的生命期,從而讓核心語言不再需要垃圾收集,同時還為管理套接口(socket)和文件勾柄(handle)等資源提供了可靠而又靈活的接口。轉移把值從一個所有者轉移給另一個所有者,而借用讓代碼可以臨時使用某個值,同時又不影響其所有權。也可能你之前從未碰到過此類特性的這種形式。
同樣的所有權規(guī)則也是 Rust 值得依賴的并發(fā)模型的基礎。說到互斥量(mutex)與其所要保護數據的關系,大多數語言是靠注釋解決問題的。而 Rust 通過編譯時檢查可以發(fā)現(xiàn)訪問被鎖住的互斥量的問題。大多數語言只會告誡開發(fā)者要確保不訪問已經交給其他線程的數據,Rust 卻能通過檢查保證你沒有那么做。Rust 能夠在編譯時防止數據爭用。

Rust 并非真正的面向對象語言,它只是具有一些面向對象的特征而已。Rust 也不是函數式語言,雖然它可以像函數式語言那樣讓計算結果更容易推斷。Rust 在某種程度上類似于 C 和 C++,但 C 和 C++ 的很多慣用語法不能照搬過來在 Rust 中使用,所以典型的 Rust 代碼說到底還是不像 C 或 C++ 代碼。關于 Rust 到底是哪種語言,最好還是等你熟悉它之后,自己來下結論吧。

為了通過真正的項目獲得關于設計的反饋,Mozilla 用 Rust 開發(fā)了Servo,這是一個新的 Web 瀏覽器引擎。Servo 的需求與 Rust 的目標完美匹配:瀏覽器必須高性能,還要能安全地處理不受信的數據。

Servo 利用 Rust 的安全并發(fā)最大限度地挖掘機器潛力,在某些任務上實現(xiàn)了 C 或 C++ 不可能實現(xiàn)的并行處理。Servo 與 Rust 一直并肩成長,Servo 不斷應用 Rust 的最新語言特性,Rust 也基于 Servo 開發(fā)者的反饋不斷改進。

類型安全


Rust 是類型安全的語言,那么“類型安全”指的是什么?安全聽起來不錯,但要從哪里做 起呢?

以下是 C99,也就是 C 編程語言 1999 年標準中對未定義行為的定義:

來看下面的 C 程序:

根據 C99,因為這段程序訪問的元素超出了數組??a??的邊界,所以它的行為是未定義的。換句話說,執(zhí)行這段代碼可以出現(xiàn)任何結果。當我們在 Jim 的筆記本計算機上運行這段程序時,看到了以下輸出:

然后程序就崩潰了。Jim 的筆記本計算機上根本就沒有一個叫 .netrc 的文件。如果你在自己的計算機上運行這段代碼,很可能結果又不一樣。C 編譯器為這個?main?函數生成的機器碼恰好把數組?a?保存到返回地址前面 3 個字的位置,因此把?0x7ffff7b36cebUL?保存到??a[3]?,會把?main??的返回地址改為指向 C 標準庫中一段代碼的中間,該代碼會從某人的 .netrc 文件中讀取密碼。在??main??返回時,執(zhí)行并沒有恢復到?main??的調用者,而是轉到了庫中以下幾行代碼的機器碼:

C 編譯器允許數組引用影響后續(xù)?return?語句的行為是完全符合標準的。未定義操作并非只產生意想不到的結果,事實上這種情況下程序無論做任何事情都是被允許的。

為了生成更快的代碼,C99 授予編譯器全權。這個標準沒有讓編譯器負責檢測和處理可疑的行為(比如數組越界),而是讓程序員負責保證這種情況永遠不會發(fā)生。

從經驗來看,人類在這方面并不擅長。在猶他大學讀書時,研究員李朋(Peng Li)修改了 C 和 C++ 編譯器,讓它們編譯后的程序可以在執(zhí)行某種形式的未定義行為時發(fā)送報告。他發(fā)現(xiàn)幾乎所有程序都會發(fā)送報告,包括那些高標準嚴要求的備受推崇的項目。

實踐中,未定義行為經常會導致可被利用的安全漏洞。Morris 蠕蟲病毒就是利用前面代碼的原理并經過精心改造,將自己復制到不同機器的。而基于同樣原理的漏洞利用在今天仍然廣泛存在。

基于這個例子,可以定義幾個術語。如果將一個程序寫得不可能在執(zhí)行時導致未定義行為,那么就稱這個程序為定義良好的(well defined)。如果一種語言的安全檢查可以保證所有程序都定義良好,那么就稱這種語言是類型安全的。

如果足夠用心,用 C 或 C++ 應該也能寫出定義良好的程序,但 C 和 C++ 不是類型安全的:前面的程序中沒有類型錯誤,但出現(xiàn)了未定義行為。相對而言,Python 是類型安全的。Python 樂意花處理器時間來檢查和處理數組索引越界的操作,方式也比 C 更友好:

Python 拋出了異常,這不是未定義行為:Python 文檔指出,a[3]?這種賦值應該拋出?IndexError?異常(我們也看到了)。當然,ctypes?之類提供對機器無約束訪問的模塊可能會在 Python 代碼中引入未定義行為,但其核心語言本身還是類型安全的。Java、JavaScript、Ruby 和 Haskell 在這方面都類似。
注意,類型安全與一門語言是在編譯時還是在運行時檢查類型無關。C 在編譯時檢查,但它不是類型安全的;Python 在運行時檢查,但它是類型安全的。

說起來還真有點尷尬,占有統(tǒng)治地位的系統(tǒng)編程語言 C 和 C++ 都不是類型安全的,大多數其他流行的語言則是類型安全的。
考慮到設計 C 和 C++ 的初衷就是用它們去實現(xiàn)系統(tǒng)的基礎部分、實現(xiàn)可靠的安全隔離,以及操作不可信數據,類型安全對它們而言好像恰恰是最有價值的特性才對。

Rust 要解決的正是這個沉淀了幾十年的老問題:它既是類型安全的,又是一種系統(tǒng)編程語言。Rust 的設計初衷也是用于實現(xiàn)那些要求高性能和對資源精細控制的基礎系統(tǒng)層,同時還能基于類型安全提供最基本的可預測性。本書后面的章節(jié)將詳細介紹 Rust 是如何做到這個統(tǒng)一的。

對多線程編程而言,Rust 特定形式的類型安全有著令人意想不到的影響。眾所周知,正確實現(xiàn)并發(fā)在 C 和 C++ 中非常困難。開發(fā)者通常僅在單線程實在無法滿足性能要求時才會考慮并發(fā)。

但 Rust 可以通過編譯時檢查保證并發(fā)不會發(fā)生數據爭用,并會捕獲任何對互斥量或者其他同步原語(synchronization primitive)的錯誤使用。使用 Rust 編寫并發(fā)程序,你再也不用擔心自己的代碼只有經驗非常豐富的程序員才能看懂了。

Rust 的安全規(guī)則也有一個“逃生閥”,用于必須使用原始指針的情形。這種情況下你寫的是不安全代碼,雖然絕大多數 Rust 程序用不到。

與其他靜態(tài)類型的語言相似,Rust 的類型除了可以防止未定義行為,還有很多優(yōu)點。經驗豐富的 Rust 程序員利用類型不僅可以保證安全地使用數據,也可以保證有意義地使用數據,即與應用的意圖保持一致。

特別地,Rust 的特型(trait)和泛型(generic),為描述一組類型的共性,乃至進一步利用這些共性提供了簡潔、靈活且高效的手段。

Rust 是系統(tǒng)編程發(fā)展史上的一個巨大進步,如果你想了解更多,這本比 Rust 官方「The Book」?還要好懂的 Rust 「螃蟹書」沒準可以幫到你。

這本不僅是教會你如何用 Rust 編寫程序,更重要的是要教會你如何利用這門語言寫出安全又得體的程序,同時還能夠預測程序的執(zhí)行。這是一本十分全面的 Rust 學習指南。如果你苦于怎么入門并學好 Rust,沒準這是你的機會~

本書由兩位具有數十年經驗的系統(tǒng)程序員撰寫,他們不僅分享了自己對Rust的深刻見解,而且還提供了一些建議和操作實踐,對 Rust 開發(fā)者和系統(tǒng)程序員十分有幫助。

  • Rust 如何在內存中表示值(輔以圖表);

  • 完整解釋了所有權、轉移、借用和生命期;

  • Cargo、rustdoc、單元測試,以及如何在 Rust 公共包倉庫上發(fā)布代碼;

  • 泛型代碼、閉包、集合和迭代器等高級特性;

  • Rust 中的并發(fā):線程、互斥量、通道和原子操作;

  • 不安全代碼,以及如何保持使用常規(guī)代碼的完整性;

  • 用豐富的例子展示了 Rust 各方面特性的綜合運用;

京東立即下單
享受 7.9?折優(yōu)惠



原版豆瓣評分8.8,這本書講透了 Rust 的靈魂的評論 (共 條)

分享到微博請遵守國家法律
如皋市| 仪陇县| 莎车县| 孝义市| 依安县| 丹棱县| 卢氏县| 四会市| 正镶白旗| 呼伦贝尔市| 句容市| 晋中市| 洪湖市| 苍梧县| 平阴县| 中宁县| 中江县| 武胜县| 南充市| 新兴县| 肃北| 云梦县| 山阳县| 固安县| 金川县| 长乐市| 黔江区| 石楼县| 青阳县| 鄂伦春自治旗| 静安区| 长海县| 加查县| 定州市| 香河县| 富锦市| 兴海县| 天台县| 台南县| 鹤岗市| 横峰县|