官术网_书友最值得收藏!

前言

A language that doesn't affect the way you think about programming is not worth knowing.

——Alan Perlis

Rust簡介

Rust是一門新的編程語言。

我想,大部分讀者看到本書,估計都會不約而同地想到同樣的問題:現存的編程語言已經多得數不清了,再發明一種新的編程語言有何意義?難道現存的那么多編程語言還不夠用嗎,發明一種新的編程語言能解決什么新問題?

俗話說,工欲善其事,必先利其器。在程序員平時最常用的工具排行榜中,編程語言當仁不讓的是最重要的“器”。編程語言不僅是給程序設計者使用的工具,反過來,它也深刻地影響了設計者本身的思維方式和開發習慣。

卓越的編程語言,可以將優秀的設計、先進的思想、成功的經驗,自然而然地融入其中,使更多的使用者開闊眼界、拓展思路,受益無窮。

A programming language is a tool that has profound influence on our thinking habits.

——Edsger Dijkstra

所以說關于這個問題,我認為,如果與現有的各種語言相比,新設計的語言有所進步、有所發展、有所創新,那么它的出現就很有意義。

最近這些年,的確涌現出了一大批編程語言,可以說是百花爭艷、繁華似錦。但是在表面的繁榮之下,我們是否可以自滿地說,編程語言的設計和發展已經基本成熟、趨于完美了呢?恐怕不盡然吧!

那些優秀的編程語言中,不少都有自己的“絕活”。有的性能非常高,有的表達力非常強,有的擅長組織大型程序,有的適合小巧的腳本,有的專注于并發,有的偏重于科學計算,等等,不一而足。即便如此,新興的Rust語言面市后依舊展現出了它的獨特魅力,矯矯不群,非常值得大家關注。

作為多年來鮮有的新一代系統編程語言,它的設計準則是“安全,并發,實用”。Rust的設計者是這樣定位這門語言的:

Rust is a system's programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety.

安全

是的,安全性很重要。Rust最重要的特點就是可以提供內存安全保證,而且沒有額外的性能損失。

在傳統的系統級編程語言(C/C++)的開發過程中,經常出現因各種內存錯誤引起的崩潰或bug。比如空指針、野指針、內存泄漏、內存越界、段錯誤、數據競爭、迭代器失效等,血淚斑斑,數不勝數。這些問題不僅在教科書中被無數次提起,而且在實踐中也極其常見。因此,各種高手辛苦地總結了大量的編程經驗,許多代碼檢查和調試工具被開發出來,各種代碼開發流程和規范被制定出來,無數人嘔心瀝血就是為了系統性地防止各類bug的出現。盡管如此,我們依然無法徹底解決這些問題。

教科書解決不了問題,因為教育不是強制性的;靜態代碼檢查工具解決不了問題,因為傳統的C/C++對靜態代碼檢查不友好,永遠只能查出一部分問題;軟件工程解決不了問題,因為規范依賴于執行者的素質,任何人都會犯錯誤。事后debug也不是辦法,解決bug的代價更高。

鑒于手動內存管理非常容易出問題,因此先輩們發明了一種自動垃圾回收的機制(Garbage Collection),故而程序員在絕大多數情況下不用再操心內存釋放的問題。新發明的絕大多數編程語言都使用了基于各種高級算法的自動垃圾回收機制,因為它確實方便,解放了程序員的大腦,使大家能更專注于業務邏輯的部分。但是到目前為止,不管使用哪種算法的GC系統,在性能上都要付出比較大的代價。要么需要較大的運行時占用較大內存,要么需要暫停整個程序,要么具備不確定性的時延。當然,在現實的許多業務場景中,這點開銷是微不足道的,因此問題不大。可是如果在性能敏感的領域,這是完全不可接受的。

很遺憾,到目前為止,在系統級編程語言中,我們依然被各種內存安全問題所困擾。這些年來,許多新的語言特性被發明出來,許多優秀的編程范式被總結出來,許多高質量的代碼庫被開發出來。但是內存安全問題依然像一個幽靈一樣,一直徘徊在眾多程序員的頭頂,無法擺脫。再多的努力,也只能減少它出現的機會,很難保證完整地解決掉這一類錯誤。

Rust對自己的定位是接近芯片硬件的系統級編程語言,因此,它不可能選擇使用自動垃圾回收的機制來解決問題。事實證明,要想解決內存安全問題,小修小補是不夠的,必須搞清楚導致內存錯誤的根本原因,從源頭上解決。Rust就是為此而生的。Rust語言是可以保證內存安全的系統級編程語言。這是它的獨特的優勢。本書將用大量的篇幅詳細介紹“內存安全”。

并發

在計算機單核性能越來越接近瓶頸的今天,多核并行成了提高軟件執行效率的發展趨勢。一些編程語言已經開始從語言層面支持并發編程,把“并發”的概念植入到了編程語言的血液中。然而,在傳統的系統級編程語言中,并行代碼很容易出錯,而且有些問題很難復現,難以發現和解決問題,debug的成本非常高。線程安全問題一直以來都是非常令人頭痛的問題。

Rust當然也不會在這一重要領域落伍,它也非常好地支持了并發編程。更重要的是,在強大的內存安全特性的支持下,Rust一舉解決了并發條件下的數據競爭(Data Race)問題。它從編譯階段就將數據競爭解決在了萌芽狀態,保障了線程安全。

Rust在并發方面還具有相當不錯的可擴展性。所有跟線程安全相關的特性,都不是在編譯器中寫死的。用戶可以用庫的形式實現各種高效且安全的并發編程模型,進而充分利用多核時代的硬件性能。

實用

Rust并不只是實驗室中的研究型產品,它的目標是解決目前軟件行業中實實在在的各種問題。它的實用性體現在方方面面。

Rust編譯器的后端是基于著名的LLVM完成機器碼生成和優化的,它只需要一個非常小巧的運行時即可工作,執行效率上可與C語言相媲美,具備很好的跨平臺特性。

Rust擯棄了手動內存管理帶來的各種不安全的弊端,同時也避免了自動垃圾回收帶來的效率損失和不可控性。在絕大部分情況下,保持了“無額外性能損失”的抽象能力。

Rust具備比較強大的類型系統,借鑒了許多現代編程語言的歷史經驗,包含了眾多方便的語法特性。其中包括代數類型系統、模式匹配、閉包、生成器、類型推斷、泛型、與C庫ABI兼容、宏、模塊管理機制、內置開源庫發布和管理機制、支持多種編程范式等。它吸收了許多其他語言中優秀的抽象能力,海納百川,兼容并蓄。在不影響安全和效率的情況下,擁有不俗的抽象表達力。

有意思的地方是,在程序語言設計領域,按照傳統思路,有些設計目標是互相沖突的。而Rust的優異之處在于,它能游刃有余地游走在各種設計目標之間,揚長避短,保持良好的妥協和平衡。

本書結構

本書將詳細描述Rust語言的基本語法,穿插講解一部分高級使用技巧,并盡量以更容易理解的方式向讀者解釋其背后的設計思想。語法只是基礎,并非本書的重點,筆者更希望讀者能理解到這些語法設計背后的理念,讀完本書之后,可以從中受到一點啟發,對程序語言有更多的認識,從而對編程本身有更深的理解。

Learning a language that is signifi cantly different than you are used to is certainly tough at first, but it's a great way to expand your horizons a bit.

在本書中,筆者盡量避免要求讀者有很多的基礎知識。當然,如果讀者對其他的一種或多種編程語言有所了解更佳,其中包括C/C++的基礎知識、內存錯誤、手動內存管理、自動垃圾回收、多線程并發和同步、操作系統相關的基礎概念等。

本書共分為五個部分。

第一部分介紹Rust基本語法。因為對任何程序設計語言來說,語法都是基礎,學習這部分是理解其他部分的前提。

第二部分介紹屬于Rust獨一無二的內存管理方式。它設計了一組全新的機制,既保證了安全性,又保持了強大的內存布局控制力,而且沒有額外性能損失。這部分是本書的重點和核心所在,是Rust語言的思想內核精髓之處。

第三部分介紹Rust的抽象表達能力。它支持多種編程范式,以及較為強大的抽象表達能力。

第四部分介紹并發模型。在目前這個階段,對并行編程的支持是新一代編程語言無法繞過的重要話題。Rust也吸收了業界最新的發展成果,對并發有良好支持。

第五部分介紹一些實用設施。Rust語言有許多創新,但它絕不是高高在上、孤芳自賞的類型。設計者們在設計過程中充分考慮了語言的工程實用性。眾多在其他語言中被證明過的優秀實踐被吸收了進來,有利于提升實際工作效率。

為了內容的完整性,本書并沒有嚴格按照知識點順序組織內容,少數地方會直接使用后續章節中的知識點。筆者相信對讀者來說,這不是一個很大的障礙,各位讀者在碰到這種情況的時候,可以自行前后參照來理解。

總結和勘誤

在計算機程序設計語言的領域中,一代又一代的語言潮起潮落,其興起和衰落的節奏往往并非取決于技術本身的發展。對于Rust這門新出現的語言來說,以后究竟會有多大的影響,是否會成為取代某種語言的“新時代的寵兒”,實在難以預測,而且毫無必要預測。

筆者認為,Rust語言是最近若干年內系統級編程語言領域的集大成者之一。不論其最終發展如何,它的許多設計思想和令人驚嘆的特性都值得大家學習。在本人的學習過程中,也時常為某些精彩的設計發出由衷的贊嘆。

Rust語言是一門優秀的語言,同時也是門檻較高的一門語言,要完全掌握它不是一件很容易的事。因此,筆者并不希望將本書寫成語言特性的逐一簡單羅列,而更希望向讀者解釋清楚這些語言特性背后的設計思想。

所幸的是,Rust語言是完全開源的,不僅代碼是開源的,而且整個設計過程、思辯討論都是對社區完全開放的。它的許多非常有價值的學習資料,如同星星點點,散落在各個地方,包括官方文檔、郵件列表、討論組、GitHub、個人博客等。在學習和寫作的過程中,能有幸一窺新語言創造者們的心路歷程,也是難得的機緣。

要想把Rust語言的方方面面講好、講透,實在是一個無比繁重的任務。動筆之際,方知“看人挑擔不吃力,自家挑擔壓斷脊”,誠惶誠恐,戰戰兢兢,生怕有誤人子弟之嫌。筆者水平有限,如有錯漏,在所難免,歡迎讀者批評指正。筆者將會在GitHub上發布最新的勘誤列表,網址為https://github.com/F001/rust_book_feedback。讀者可以在這個項目中新建bug提交問題,也可以通過郵件(rust-lang@qq.com)與筆者聯系。同時也歡迎讀者關注微信公眾號:Rust編程,后面還會發布更多關于Rust的文章。

致謝

感謝Rust設計組,為軟件開發行業創造了一份寶貴的財富。

感謝我所在的公司synopsys給予的大力支持。

感謝梁自澤導師對我的培養。

感謝林春曉博士撥冗為本書做了最后一輪審校。

感謝妻子的包容和呵護,否則本書不可能面世。

感謝楊繡國編輯細致的工作。

感謝各位老師、同學和同事對我的支持,正是因為你們的幫助,才使我技術水平更上一層樓。

范長春(F001)

中國,武漢,2018年3月

主站蜘蛛池模板: 洱源县| 冷水江市| 田东县| 南靖县| 留坝县| 阳原县| 胶州市| 南部县| 武功县| 海晏县| 平山县| 原平市| 武定县| 孟村| 青河县| 基隆市| 斗六市| 昌平区| 萨迦县| 营山县| 山西省| 石楼县| 溧阳市| 凤山市| 西峡县| 长子县| 彰化市| 西乌| 惠东县| 隆化县| 吴川市| 武安市| 蓝山县| 巍山| 陆川县| 河北区| 云霄县| 增城市| 镇坪县| 佛教| 泰兴市|