客官,Dart瞭解一下

前言

Dart 是一個爲全平臺構建快速應用的客戶端優化的編程語言。--- Dart官方

Dart一開始定位和js一樣是作爲瀏覽器端的腳本語言。但是由於js在瀏覽器端以及因爲node.js的出現,成爲了全棧的開發語言,因此Dart在瀏覽器端並沒有太多的展現機會,徒嘆奈何。

但是Google內部孵化的移動開發框架Flutter以及操作系統Fuchsia中,Dart都是作爲官方指定開發語言而展露頭角。

JIT與AOT

JIT(Just In Time,即時編譯),在開發中使用,可以動態下發和執行代碼,開發測試效率高,但是運行速度和執行性能會因爲運行時即時編譯受到影響。比較有代表性的語言如JavaScript、Python等腳本語言。

AOT(Ahead of Time,運行前編譯),代碼在執行前可生成直接執行的二進制代碼,運行速度快,性能表現優秀,但是每次執行前都需要提前編譯,開發測試效率低。代表性的語言是C/C++。

Dart作爲後起之秀,重複借鑑了其他語言的優秀部分,同時支持了JIT和AOT。

因此Flutter在開發工程中使用JIT編譯,縮短開發週期,其熱重載功能正是基於此特性;而在打包發佈時採用AOT,提高了執行性能。所以Dart具有運行速度快、執行性能好的特點。

健全的空安全

像很多強類型的語言如Java等,變量必須被聲明和賦值後纔可以使用,可以防止出現null等異常情況。

Dart 語言已支持健全的空安全機制!

當您選擇使用空安全時,代碼中的類型將默認是非空的,意味着 除非您聲明它們可空,它們的值都不能爲空。有了空安全,原本處於您的 運行時 的空值引用錯誤將變爲 編輯時 的分析錯誤。

Dart 的空安全支持基於以下三條核心原則:

  • 默認不可空。除非您將變量顯式聲明爲可空,否則它一定是非空的類型。我們在研究後發現,非空是目前的 API 中最常見的選擇,所以選擇了非空作爲默認值。

  • 漸進遷移。您可以自由地選擇何時進行遷移,多少代碼會進行遷移。您可以使用混合模式的空安全,在一個項目中同時使用空安全和非空安全的代碼。我們也提供了幫助您進行遷移的工具。

  • 完全可靠。Dart 的空安全是非常可靠的,意味着編譯期間包含了很多優化。如果類型系統推斷出某個變量不爲空,那麼它 永遠 不爲空。當您將整個項目和其依賴完全遷移至空安全後,您會享有健全性帶來的所有優勢——更少的 BUG、更小的二進制文件以及更快的執行速度。

單線程

沒錯,Dart是單線程模型。很多高級語言,比如Java, C++以及Objective-C等都是支持併發線程,也就是多線程的,也就是採用搶佔式方式切換線程,如果涉及到共享資源, 更新線程間搶佔後就可能導致數據不同步的問題。

多線程解決此類問題就是加鎖保護資源, 但又可能帶來性能損耗,嚴重的可能導致死鎖問題。

而Dart採用單線程模式就不是導致資源競爭和狀態同步問題。

Dart中沒有線程,只有lsolate(隔離區)。lsolate之間不會共享內存,就像單獨運行在不同進程中的worker, 通過事件循環(Event Looper)在事件隊列(Event Queue)上傳遞消息通信。

異步支持

Dart 代碼庫中有大量返回 Future 或 Stream 對象的函數,這些函數都是 異步 的,它們會在耗時操作(比如I/O)執行完畢前直接返回而不會等待耗時操作執行完畢。

async 和 await 關鍵字用於實現異步編程,並且讓你的代碼看起來就像是同步的一樣。

內存分配及垃圾回收

Dart VM的內存分配策略簡單, 創建對象是隻需要在堆上移動指針,內存增長始終是線性的, 省去了查找可用內存的過程。

與JVM內存模型不同的是,dart中每個isolate都有自己的內存空間,其各自的GC不會影響到其他isolate的。所以我們可以通過把部分佔用內存空間較大且生命週期較短的對象放在其他isolate中,這樣即使另外一個isolate GC了,並不會對我們顯示UI的isolate造成影響。

Dart的垃圾回收也是採用了多生代算法,分爲新生代和老年代。

新生代中都是生命週期較短,經常需要創建回收的對象, 在進行內存回收時採用的是“半空間”機制,觸發回收時,通過(可達性分析算法)判斷是否需要回收,將前半空間中“活躍”對象拷貝到備用空間, 然後整體釋放當前空間內存。

老年代都是生命週期相對較長,多次回收依舊活躍的對象,老年代採用標記整理的方法來回收對象。

整個回收過程中,Dart只需要操作少量的活躍對象,沒有引用大量“死亡”對象則被忽略,這樣的回收機制很適合Flutter框架中大量Widget銷燬重建的場景。

總結

Dart是一個年輕且十分優秀的後起之秀,集合諸多優秀語言的優點,再有Google的Flutter和Fuchsia的加持推動,相信相關生態建設會更加迅速,也將進一步推動Flutter在全平臺的發展。

相關文檔:Dart中文文檔



--- End --- 

歡迎關注和投稿


本文分享自微信公衆號 - 君偉說(wayne90214)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章