Flutter教程(二) 瞭解Dart語言

wendux發表於2018-05-04

在上一篇教程中說了Flutter使用Dart語言開發。本篇教程整體介紹一下Dart語言,注意,本篇不會介紹Dart具體語法細節,也不會介紹Dart VM、dart2js,因為這些和Flutter無關。本文會從Flutter開發角度介紹一下Dart語言特點、生態、未來三個方面。

注:如果你想快速的瞭解Dart以進行Flutter開發,Flutter中文網有一個Dart語言的資源列表 ,按照順序看一遍,相信你就可以直接上手了。

Dart語言特點

首先我們看看為什麼Flutter會選擇Dart作為開發語言,下面是官方給出的理由:

Flutter在四個主要維度進行了評估,並考慮了框架作者、開發人員和終端使用者的需求等因素。我們發現不同的語言在不同的層面符合一部分需求,但Dart在所有評估維度上得分都很高,並且符合我們的所有要求和標準。

Dart執行時和編譯器支援Flutter的兩個關鍵特性的組合:基於JIT的快速開發週期:允許使用型別的語言進行形狀更改和有狀態的熱過載;以及AOT編譯器,可生成高效的ARM程式碼,可以快速啟動並擁有可預測的生產部署效能。

此外,我們有機會與Dart社群密切合作,Dart社群正在積極投入資源改進Dart在Flutter中的使用。例如,當我們採用Dart時,該語言沒有提供生成原生二進位制檔案的工具鏈(這對於實現可預測的高效能是很有幫助的),但是現在實現了,因為Dart團隊為Flutter構建了它。同樣,Dart VM之前已經針對吞吐量進行了優化,但團隊現在正在優化VM的延遲時間,這對於Flutter的工作負載更為重要。

Dart在以下主要標準上得到高分:

  • 開發人員的效率。Flutter的主要價值主張之一是通過讓開發人員使用相同的程式碼庫為iOS和Android建立應用程式,從而節省了工程資源。使用高效的語言可以進一步加速開發週期,並使Flutter更具吸引力。這對我們的framework團隊和開發人員都非常重要。大部分Flutter功能都是用Dart實現,因此我們需要在10萬行程式碼時能保持高效的而不會犧牲framework和widget的可讀性。
  • 物件導向。雖然我們可以使用非物件導向的語言,但這意味著要重新解決幾個難題。另外,絕大多數開發人員都具有物件導向開發的經驗,因此更容易學習如何使用Flutter進行開發。
  • 可預測,高效能。藉助Flutter,我們希望使開發人員能夠快速建立流暢的使用者體驗。為了實現這一點,我們需要能夠在每個動畫幀中執行大量的程式碼。這意味著我們需要一種既能提供高效能又能提供可預測效能的語言,而不會出現會導致丟幀的週期性暫停。
  • 快速記憶體分配。Flutter框架使用函式式流,它很大程度上依賴於底層的記憶體分配器,從而有效地處理小的、短期的記憶體分配會非常重要,所以在缺乏此功能的語言中Flutter無法有效地工作。

綜上所述,主要的資訊就是Dart在flutter中沒有VM,可以直接通過AOT編譯器編譯成原生程式碼,並且記憶體管理比較適合Flutter. 上面是官方說法,下面說些個人看法:從筆者對Dart的使用來看,Dart的設計目標應該是既對標Java,也對標Javascript。

Dart vs Java

先看看 Dart和Java,客觀的來講,Dart語法層面確實比Java更有表現力,在VM層面,Dart VM在記憶體回收和吞吐量都進行了優化,但具體的效能對比,筆者沒有找到相關測試資料,但是在我看來只要Dart語言能流行,vm的效能就不用擔心,畢竟Google在go(沒用vm但有GC)、javascript(v8)、dalvik(android上的java vm)上已經有了很多積累,值得注意的是Dart在flutter中已經可以將gc做到10ms以內,所以Dart和Java相比,決勝因素並不會是在效能方面,而語法層面,Dart要比java更有表現力,最重要的是Dart對函數語言程式設計支援要遠強於java(目前只停留在lamda表示式),而Dart不足的是生態,這會在下文討論。

Dart vs JavaScript

JavaScript的弱型別一直被抓短,所以typeScript、coffeescript甚至是facebook的flow(雖然不是javascript的一個超集,但也通過標註和打包工具提供了靜態型別檢查)才有市場。其實在筆者看來,目前最強大的動態化最好的指令碼語言就是javascript,支援動態擴充套件屬性、建立函式等,用起來超爽。但是你可能聽過另一個聲音,javascript的強大的動態化是把雙刃劍,畢竟有些人總是對自己寫的程式碼不放心,他們期望有一套靜態型別檢查系統來幫助自己減少錯誤,而Dart就有靜態型別檢查(Dart2.0後加入了動態型別檢查,這在最新版的flutter中已經啟用了),並且可以通過dart2js將dart程式碼轉成js程式碼,在這個層面來說,Dart和typeScript、coffeescript是差不多的,所以單獨來看,dart並不比typeScript、coffeescript有什麼明顯優勢,但綜合起來看,dart既能進行服務端指令碼、APP開發、web開發,這就有優勢了。

Flutter中的Dart

Flutter能夠執行大多數不會直接或間接匯入dart:mirrors 或 dart:html的dart程式碼。Flutter中dart程式碼會通過AOT編譯器編譯成原生程式碼,沒有vm,並且dart團隊專門針對flutter進行了優化。

Dart生態

一個語言的成敗,重要的一點還是在於生態。而生態的好壞,有兩個主要指標:第三方庫的數量和開發者數量。

Dart目前第三方庫還是較少,並且有質量不高,即使是Dart SDK,裡面也有很多bug,dart-sdk github現在開啟的issue一直維持在5000左右,在最近10天內,我提過一個P0 bug和多個features,由此可見Dart目前還是不怎麼完善。 但值得慶幸的是,目前Dart更新迭代快了很多,這是受flutter和Fuchsia的帶動。

至於開發者,目前大多數dart使用者是flutter使用者,用dart 寫服務端指令碼的應該非常少,畢竟現在在dart社群沒有一個比較著名或經過時間驗證的web server框架。從stackoverflow上dart相關的問題來看,用dart 開發js的開發者也有一些,但大概估計不會超過dart開發者的20%。

Flutter中文社群貢獻

Flutter中文網發起了一個開源專案計劃,旨在開發一系列Flutter SDK之外常用(實用)的Package、外掛,以豐富Flutter第三方庫,為Flutter生態貢獻來自中國開發者的力量, 目前社群已有幾個開源專案開始公測,詳情請檢視: Flutter中文網開源專案 (ps:目前Flutter中文網開源專案組正在尋找有實力、有夢想、熱衷於分享的開發者加入,如果你有興趣,點進去,獲取聯絡方式)。

Dart未來

雖然Dart生態目前還不完善,但可喜的是增速很快,pub上的每天都有5個以上的新包釋出,這個數量你也許不以為然,但事實上java 中最常用的包也就200個左右。雖然Dart語言本身自有亮點,但是在其對標的領域,目前都有成熟的並且不賴的解決方案,所以我覺得Dart是否成功目前來看還是主要看flutter和 Fuchsia是否能成功。

Flutter在沒有釋出第一個正式版的情況下,目前Github上star將近23K,熱度相當高了(當然不能和vue等前端web框架相比,都要上100k了,兩者開發者群體規模不同,開源時間不同)。 從Flutter自身來看,開發的應用程式效能確實流暢很多,比weex、rn 有明顯的效能提升。

還有,隨著Google Fuchsia OS的釋出, DART 及flutter成為一等公民,也就是說將來具有Fuchsia OS的裝置,Dart 都會成為主要的開發語言。

最後

一些資源:

  1. Flutter資源教程,請訪問Flutter中文網
  2. Flutter http請求庫dio
  3. Flutter教程

相關文章