本書總計9章,前6章對Dart的對象、庫、函數、類型、表達式與語句等基礎知識進行了詳細介紹;第7、8章對反射和isolate等進階內容進行了深入講解;第9章為總結。本書與眾不同之處是,除了介紹語言特性,更著重于講解語言背后的原理和思想。本書內容較為深入,不太適合初學者,讀者至少要具備基本的編程知識,*好是接觸過其他編程語言且對Dart有基本了解。
《Dart編程語言》由Java泛型作者、JVM規范核心制定者、Dart語言標準作者Gilad Bracha所著,全面介紹Dart的方方面面,包含基本語法和反射、isolate等進階內容,包含語言背后的原理和思想。
《Dart編程語言》包括如下內容。
·Dart的對象模型,萬物皆對象,甚至是數字和布爾量。
·Dart程序是如何由模塊化的庫組成的。
·Dart函數是如何構成的,以及是如何存儲于變量中作為參數傳遞,并作為結果返回的。
·Dart處理可選類型的創新方式。
·Dart如何處理表達式和語句。
·如何使用Dart實現的反射來對庫、類、函數和對象進行自省。
·Isolates及其他Dart支持的并發與分布式特性。
譯者序
Dart是一門由Google開發并被批準為ECMA標準(ECMA-408)的通用編程語言。它可以用于構建Web端、服務端和移動端應用程序。它是開源的,使用寬松的免費軟件許可證(修改版BSD許可證)。Dart是完全面向對象的,使用類和單繼承,可編譯為JavaScript,語法風格是類C的。它支持接口、mixin、抽象類、泛型和可選類型。
Dart目前在業界的認識度不高,社區規模也比較小,主要原因是Dart自身還在不斷地發展、完善中,而Google對外還沒有真正地對Dart做過推廣。幸好,近兩年Dart的發展開始步入正軌。Dart是2016年Google內部使用量增長最快的編程語言,多個重要項目如AdSense、AdWords等Web應用,正在用Dart重寫。Google正在研發中的跨平臺移動端開發工具Flutter,也正在使用Dart。Dart未來的發展值得我們期待。
本書雖然名為《Dart編程語言》,且內容也涉及了對象、類型、表達式與語句等基礎知識,但它總體還是著重于講解語言背后的原理和思想。這意味著本書并不適合真正的初學者,讀者至少要具備基本的編程知識,最好對Dart有基本的了解且使用過一門編程語言,例如JavaScript、Java或C#等。
作為一門新生的可選類型編程語言,Dart目前的關注者比較少,可參考的資料也非常匱乏,而本書內容具有一定深度,加上筆者水平有限,翻譯時出現錯誤或偏差在所難免,歡迎讀者朋友指正。
感謝出版社編輯的校對,特別感謝付睿編輯,讓我得到了翻譯(學習)本書的機會。翻譯工作耗費了我大量的業余時間。也感謝家人的支持與理解。
推薦序
在2006年的早春時節,我在博客上寫了一篇簡短的文章《Gilad是正確的》,主要內容是表述作為一名靜態類型主義者,我認同Gilad關于可選和分層類型系統的想法,靜態類型不能改變程序的運行時行為,不阻止非法程序的編譯或執行,是面向數百萬開發人員的編程語言必然要做出的設計權衡。當時我正在忙于學習VisualBasic語言,它通過OptionStrictOff語句已經可以支持可選類型,但該特性受到靜態類型支持者的猛烈抨擊。類型系統通常是高度非線性的,當它成長至某一節點之后,其復雜性將呈爆炸性增長,帶給開發者的價值卻很少,還使語言實現者的生活變得暗淡無光。可選和分層類型系統通過允許強制靜態類型與動態類型和平共存來實現一種更加緩和的處理方式。現在,近十年后,Gilad開創性的愿景已經化名為漸進類型并逐步成為主流。過去幾年中所誕生的許多編程語言,如Hack、TypeScript、Flow、Racket和Dart,都選擇了漸進類型。即使是學術界,也接受了這個想法,并用包含如“三人行”和“責備”等輕蔑字眼的標題,來編寫與之相關的論文。
Dart另一個務實且沒有被語言純粹主義者所接受的事實是,Dart的類型系統被故意設計為非嚴格的。用正常的語言來描述,這意味著Dart類型檢查器在編譯時不會標記某些類型錯誤,反而依靠運行時檢查來確保類型安全。Dart中類型非嚴格的主要來源是協變泛型。為了解釋其中的分歧,讓我們先看看一臺自動售貨機,我們只能從中取飲料。如果自助餐廳需要售賣汽水的自動售貨機,則我們可以合法地安裝售賣根汁汽水的自動售貨機,因為根汁汽水是一種汽水(但是在需要售賣根汁汽水的自動售貨機的地方,安裝售賣汽水的自動售貨機則是非法的)。在編程語言中,我們說自動售貨機是協變的。接下來讓我們看看只能用來裝填垃圾的垃圾桶。如果自助餐廳需要一個垃圾桶來回收垃圾,則我們可以合法安裝一個普通的垃圾桶,因為可回收垃圾是垃圾的一種(但對于需要普通垃圾桶的地方,安裝可回收垃圾桶是非法的)。在編程語言中,我們說垃圾桶是逆變的。你不是唯一對協變和逆變感到困惑的人,你會欣賞Dart的決定,使所有的泛型類型協變。這種選擇的后果是,如果你需要普通垃圾桶,則你可以合法安裝一個用于可回收垃圾的垃圾桶,但該垃圾桶會拒絕回收人們向其中投入的所有不可回收的垃圾。雖然理論上非嚴格,但對于大多數開發人員來說,不安全的協變實際上是很自然的,我贊賞Dart設計者在這里做出的選擇。作為曾經掙扎于選擇super或extends的人可以證明,選擇支持靜態類型安全的泛型語言,其付出的代價是建立在減少用戶之上的。
Dart語言設計者做出的其他務實選擇,使Dart的編碼過程變得流暢。例如,Dart沒有接口、抽象基類或“普通”類。相反,Dart只有作為接口的類,你可以實現它們,或者通過繼承它們來作為基類使用,或者通過mixin來重用它們的實現。Dart中的每個類型都是一個對象,所以基礎類型(如數字)和常規對象類型是沒有區別的。雖然Dart中的所有內容都是對象,但定義頂級函數和變量也是可以的,所以頂層類中不再需要可怕的publicstaticvoid咒語了。Dart允許用戶自定義算術運算符,但不支持基于類型的方法重載,這大大簡化了語言本身。其他支持基于類型重載的編程語言,它們的語言規范花費了大量不必要的篇幅來描述此特征的語義。null感知運算符(null也是一個普通的對象)和級聯為點操作符賦予了更多的能力,也使API的作者不費吹灰之力就能編寫出可讓用戶流暢使用的API。
因為所有類型都是可選的,所以Dart本質上是一種動態語言,雖然如此,與其他大多數動態語言相比,你很少有機會產生疑問。有null但沒有undefined,因此只有==但沒有===。只有true是true,所以也不需要使用(foo&&foo.bar())來檢查null。Dart有常見的整數和浮點數字類型,但是+和==不會產生令人驚訝的運行時類型轉換,類型轉換可能會是偉大的考試問題或有趣的會議演示,但都會帶來令人沮喪的錯誤。
在我看來,雖然我明顯存在偏見,但Dart成為我最喜歡的編程語言的原因是,它是我知道的唯一支持以下四種模式的編程語言。
也就是說,Dart通過使用sync*塊中的生成器和for循環,對同步數據流(Iterable<T>)的生成和使用提供良好的支持,使用async塊中的await表達式,生成和使用future(Future<T>),最后且最重要的是,使用async*塊中的異步生成器和for循環生成及使用異步數據流(Stream<T>)。內置對異步編程的支持在任何現代編程語言中都是必不可少的,雖然數據存在于內存中,但讓它們在網絡上傳輸,那是非常“遙遠”的,在如此高延遲下進行同步訪問的代價極高。類似于JavaScript,但又不同于其他支持生成器的語言,Dart擁有所謂的委派生成器,避免流的生成在嵌套和遞歸中呈現二次方規模的爆發性增長。
盡管有以上諸多優點,Dart在大體上是一門被設計得比較無趣的語言。由于支持getter、setter、lambda、enum、reifiedgeneric、模塊、一個精心設計的標準庫和一個簡單的包管理器,如果你用過Java或C#,則使用Dart會讓你感覺非常舒適,就像一雙合腳的鞋子;如果你用過JavaScript,那么你會覺得Dart像新鮮的空氣。本書將幫助你了解Dart的所有特性,了解為什么需要這些特性及它們是如何實現的,Gilad對細節的詳細講解和其獨特的方式,可讓你在短時間內熟悉Dart。
ErikMeijer
加利福尼亞州帕羅奧圖
2015年10月
前言
本書與其他Dart書籍有什么不同?其他Dart書籍都注重于實操,本書著重于講解原理和思想。
Dart的實操非常重要,但它們可能會逐年變化,并可能一直變化下去。相比之下,Dart背后的原理應該很少會隨時間而改變。如果你對激發Dart語言設計的想法及它們是如何實現的,還有如何權衡現實世界對Dart的需求等感興趣,那么你應該閱讀本書。
Dart的主要思想之一是可選類型。我在幾十年前就開始從事可選類型的工作,今天我們看到使用可選類型系統的語言在飛速增加,我對此感到非常欣慰。雖然Dart和它的任何競爭對手都不像我想要的那樣實現可選類型,但可選類型成為主流的事實才是最重要的。
更重要的思想是,Dart是一種面向對象的語言,這不等同于傳統意義上的類、繼承或其他大多數開發者所理解的概念,它的深層含義可以表述為,一個對象最重要的是它可觀察的行為。同樣,Dart對這個想法并沒有完美地實現,但比大多數主流語言要好。
本書中涉及的另一個關鍵思想是反射。大部分關于編程的書籍都沒有很好地討論反射。因此,我非常渴望在本書中探討反射。然而,Dart的反射歷史卻意外地曲折。
一方面,很多Dart用戶都渴望使用反射,有時只是為了用而用,但并不一定適用。另一方面,某些作為Dart編譯目標的平臺存在嚴重限制,使得對反射的支持異常昂貴,尤其是需要考慮代碼的體積。這種雙向壓力使Dart的反射陷入尷尬的境地。
我們從一開始就知道代碼體積和反射對其影響的敏感性。這個問題及其解決方案在2011年11月的第1個Dart反射設計文檔中被討論。然而,直到實現解決方案且開發者可以輕松使用時,已經花費了四年。
我希望本書有效地傳達上述及其他語言設計相關的想法,但它們的好壞由讀者來判斷。我們可能可以創造一門更加純粹的語言,并做得更好,但另一方面,我們也不清楚是否可以得到大家的認可。也許有一天我會進行那樣的嘗試。
本書的寫作歷時很久。直到我能完整講述一個關于反射的合理故事,我才完成本書。拖延本書寫作的另一個原因是,本書的主題發展得如此之快,以至于它總是面臨過時的風險。這種風險還沒有過去,但在某個時刻我們需要說“適可而止”。
Dart并沒有完美實現驅動其設計的思想。沒有人比它的設計者更了解這個事實。然而,它是一門真正的語言,已經被用來書寫數百萬行的關鍵任務代碼。它以某種方式推動了編程文化的發展,最引人注目的是在可選類型領域。正如有人在丹麥說的:“它本可能更糟”。
致謝
Dart編程語言是大團隊努力的結果。Dart
收起全部↑