發表於2024-12-27
《Dart編程語言》由Java泛型作者、JVM規範核心製定者、Dart語言標準作者Gilad Bracha所著,全麵介紹Dart的方方麵麵,包含基本語法和反射、isolate等進階內容,包含語言背後的原理和思想。
《Dart編程語言》包括如下內容。
·Dart的對象模型,萬物皆對象,甚至是數字和布爾量。
·Dart程序是如何由模塊化的庫組成的。
·Dart函數是如何構成的,以及是如何存儲於變量中作為參數傳遞,並作為結果返迴的。
·Dart處理可選類型的創新方式。
·Dart如何處理錶達式和語句。
·如何使用Dart實現的反射來對庫、類、函數和對象進行自省。
·Isolates及其他Dart支持的並發與分布式特性。
本書總計9章,前6章對Dart的對象、庫、函數、類型、錶達式與語句等基礎知識進行瞭詳細介紹;第7、8章對反射和isolate等進階內容進行瞭深入講解;第9章為總結。本書與眾不同之處是,除瞭介紹語言特性,更著重於講解語言背後的原理和思想。本書內容較為深入,不太適閤初學者,讀者至少要具備基本的編程知識,*好是接觸過其他編程語言且對Dart有基本瞭解。
Java泛型作者、JVM規範核心製定者、Dart語言標準作者
戴虯,畢業於華東交通大學,現在在廣州聯億網絡科技有限公司任Web開發工程師,並且是Dartlang社區負責人。熱愛Dart編程語言,希望這門語言有很好的發展,並不遺餘力地推廣、維護。
目錄
第1章 簡介 1
1.1 動機 1
1.2 設計準則 2
1.2.1 萬物皆對象 2
1.2.2 麵嚮接口編程,而非麵嚮實現 2
1.2.3 類型是為開發者服務的 3
1.3 限製 4
1.4 概述 4
1.5 本書結構 10
1.6 相關語言及其對Dart的影響 11
第2章 對象、接口、類與mixin 12
2.1 accessor 13
2.2 實例變量 16
2.3 類變量 16
2.4 final變量 18
2.5 相同與相等 18
2.6 類與父類 20
2.7 抽象方法與抽象類 22
2.8 接口 23
2.9 對象的創建 24
2.9.1 重定嚮構造函數 28
2.9.2 工廠構造函數 29
2.10 noSuchMethod() 30
2.11 常量對象與字段 31
2.12 類方法 31
2.13 實例及其類與元類 33
2.14 Object與其方法 34
2.15 mixin 35
2.16 相關語言 46
2.17 總結 46
第3章 庫 47
3.1 頂層 47
3.2 腳本 48
3.3 隱私 49
3.4 導入 49
3.5 將庫拆分成part 54
3.6 導齣 55
3.7 鑽石導入 56
3.8 延遲加載 58
3.9 相關語言 59
3.10 總結 60
第4章 函數 61
4.1 參數 61
4.1.1 位置參數 61
4.1.2 命名參數 62
4.2 函數體 63
4.3 函數聲明 64
4.4 閉包 65
4.5 調用方法與函數 66
4.5.1 級聯 66
4.5.2 賦值 68
4.5.3 使用運算符 68
4.6 Function類 68
4.7 函數作為對象 70
4.8 生成器函數 72
4.8.1 迭代器與可迭代對象 72
4.8.2 同步生成器 73
4.9 相關語言 74
4.10 總結 75
第5章 類型 76
5.1 可選類型 76
5.2 類型之旅 78
5.3 接口類型 81
5.4 類型實踐:添加類型的錶達式問題 83
5.5 泛型 87
5.6 函數類型 93
5.6.1 可選位置參數 94
5.6.2 命名參數 95
5.6.3 重溫Call() 96
5.7 類型具體化 97
5.7.1 類型檢測 97
5.7.2 強製類型轉換 98
5.7.3 檢查模式 99
5.7.4 具體化泛型 100
5.7.5 具體化和可選類型 100
5.7.6 類型和代理 101
5.8 malformed類型 104
5.9 非嚴格 106
5.10 相關語言 108
5.11 總結 109
第6章 錶達式和語句 110
6.1 錶達式 110
6.1.1 字麵量 110
6.1.2 標識符 117
6.1.3 this 121
6.1.4 常量 121
6.1.5 創建對象 122
6.1.6 賦值 123
6.1.7 抽取屬性 124
6.1.8 方法調用 124
6.1.9 使用運算符 125
6.1.10 Throw 126
6.1.11 條件運算符 127
6.2 語句 127
6.2.1 block 127
6.2.2 if 127
6.2.3 循環 128
6.2.4 try-catch 130
6.2.5 rethrow 131
6.2.6 switch 131
6.2.7 assert 133
6.2.8 return 135
6.2.9 yield和yield-each 137
6.2.10 label 138
6.2.11 break和continue 139
6.3 總結 140
第7章 反射 141
7.1 自省 141
7.1.1 速度與大小的影響 144
7.1.2 例子:代理 146
7.1.3 例子:序列化 147
7.1.4 例子:解析器組閤器 158
7.2 為什麼使用mirror 168
7.3 元數據 169
7.4 通過代碼生成執行反射 169
7.5 自省之外 172
7.6 相關語言 173
7.7 總結 173
第8章 異步和isolate 174
8.1 異步 174
8.2 future 175
8.2.1 使用future 175
8.2.2 生成future 176
8.2.3 調度 177
8.3 stream 178
8.4 isolate 178
8.4.1 Port 179
8.4.2 spawning 179
8.4.3 安全 180
8.5 例子:客戶端-服務器通信 180
8.5.1 promise:更好的future 180
8.5.2 將isolate作為分布式對象 182
8.6 異步函數 187
8.6.1 await 187
8.6.2 異步Generator 188
8.6.3 await-for循環 189
8.7 相關語言 189
8.8 總結 189
第9章 結論 190
9.1 可選類型 190
9.2 麵嚮對象 191
9.3 反射 192
9.4 工具 192
9.5 總結 193
相關文獻 194
譯者序
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
Dart編程語言 下載 mobi pdf epub txt 電子書 格式 2024
Dart編程語言 下載 mobi epub pdf 電子書不錯的書
評分不錯的書
評分不錯的書
評分不錯的書
評分不錯的書
評分不錯的書
評分不錯的書
評分不錯的書
評分不錯的書
Dart編程語言 mobi epub pdf txt 電子書 格式下載 2024