Dart2.6正式版發佈,支持編譯爲mac,windows,linux三大系統native可執行文件

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。 juejin.im/post/5dc8d0…git

轉載請標明出處: juejin.im/post/5dc8d0… 本文出自 AWeiLoveAndroid的博客github


【Tips:】本文首發在公衆號 Flutter那些事,更多幹貨歡迎多多關注。後端


近日Dart發佈了最新版Dart2.6正式版。此次又有哪些新功能呢?咱們來一塊兒看看。api

Dart針對不一樣系統平臺提供了豐富的編譯器dart.dev/platforms:適用於Android和iOS的「Flutter」,用於Web開發的「Flutter Web」,適用於桌面端的「Flutter」(該功能處於實驗中),使用AngularDart angulardart.dev/ 進行Web開發等,這些都離不開Dart的編譯器。安全

最近Dart團隊推出了最新版本的Dart功能的更新,最大的亮點是:「dart2native」。它是現有編譯器基礎上的一個擴展,可以將Dart程序編譯爲包含預編譯(AOT)機器碼的self-contained的可執行程序。使用dart2native,您可使用Dart 經過macOS,Windows或Linux上的命令行建立工具。此功能的演示圖以下所示:bash

dart2native.gif


一、Dart Native 和 dart2native 編譯器

Dart支持將AOT(預編譯)編譯爲本地機器代碼已有多年,所以Dart Native是至關成熟的技術。可是,過去,Dart僅經過Flutter在iOS和Android移動設備上發佈了此功能。服務器

如今藉助dart2native,擴展了native編譯支持,以支持運行macOS,Windows和Linux的傳統桌面操做系統。因爲使用dart2native建立的可執行文件是獨立的,所以它們能夠在未安裝Dart SDK的計算機上運行。而且因爲它們是使用Dart的AOT編譯器進行編譯的,所以可執行文件僅在幾毫秒內便可開始運行。與其餘Dart編譯器和運行時同樣,當編譯爲native代碼時,Dart中可使用相同的一套核心庫 core libraries網絡

若是你之前使用過dart2aot,那麼從Dart2.6開始,你將使用dart2native,這個是dart2aot的超集,比dart2aot更完善。架構


二、dart2.6下載和安裝

dart官網已經支持dart2.6的文檔,網址以下: dart.dev/get-dart編輯器

首先咱們找到下載地址,能夠點擊:dart.dev/tools/sdk/a…,在Stable channel裏面,選擇你對應的系統(Windows、Linux、Mac),而後選擇根據你電腦對應的系統架構進行下載對應的文件,好比:X64是64位,ia32是32位。

下好以後,解壓縮,選擇一個英文的安裝路徑(不要是Flutter的安裝路徑,不然會出現錯誤),而後將安裝路徑添加到環境變量「path」裏面,重啓一下電腦,便可使用Dart命令行了。

注意:Dart SDK的安裝和Flutter內置的Dart SDK是不一致的,不能共用。須要單獨設置安裝文件夾分別存放。

輸入dart --version,查看Dart版本號,輸入where dart查看Dart安裝路徑。以下圖所示:

查看dart版本號和安裝路徑


三、使用dart2native編譯命令行應用程序

dart2native能夠用於構建和部署命令行程序。一般會使用諸如:dart:io(基本I/O)、package:http(網絡操做)、package:args(參數解析)之類的庫。下面看一下dart2native將「 hello,world」應用編譯爲可執行文件簡單的示例代碼:

hello.dart源代碼:

main(){ 
  print'Hello Dart'); 
}
複製代碼

編譯hello.dart爲hello可執行文件:

dart2native hello.dart -o hello
複製代碼

編譯過程以下圖所示:

編譯過程


四、dart2native對dart:ffi的加強及兼容

native應用程序一般須要從操做系統訪問本地API功能。這些系統api一般在本地的基於C的庫中存在,而Dart經過dart:ffi 支持與這些庫的互交互性,這是Dart 2.5的預覽版中推出的Dart與C交互的新功能。

Dart2.6對許多dart:ffi的API進行了重大更改,使咱們的API易於使用,提供更多的類型安全性並提供對內存的便捷訪問。

dart2native編譯器與dart:ffi兼容,所以您能夠建立和編譯使用它的本地的dart應用程序。

Dart的某位團隊成員最近開始使用dart:ffi建立了一個用於控制檯應用程序開發的dart_console庫(pub.dev/packages/da…),它具備諸如獲取窗口尺寸、讀取和設置光標位置、管理顏色、讀取鍵和控制序列等功能。使用dart的能力:ffi使dart成爲一種很是強大的控制檯應用程序語言。dart_consoleKilo文本編輯器的Dart版本實現。Kilogithub.com/antirez/kil… 庫使用C語言編寫而成,大約有1000行代碼。


五、使用少於500行的代碼編寫7M的代碼編輯器

使用Dart核心庫、dart:ffidart_console 庫,咱們能夠建立很是有趣的控制檯應用程序。dart_console庫包括一個完整的 Kilo 演示,這是一個用大約500行Dart代碼編寫的控制檯文本編輯器。

使用新的dart2native編譯器,咱們能夠輕鬆地打包它,最後獲得一個7MB的self-contained代碼編輯器。下圖是一個編譯編輯器的演示,而後使用編譯的編輯器編輯本身的源代碼來修復錯誤:

dart_console演示.gif


六、dart2native的服務端構建性能大大提高

對於無服務器後端,服務快速啓動相當重要。傳統上,基於Dart的服務與咱們的JIT(即時)編譯器一塊兒運行,可是基於JIT的執行在啓動時會存在較高的延遲,由於須要對其進行編譯和預熱後才能開始執行代碼。經過將服務的代碼提早編譯爲native代碼,您能夠避免這種延遲並當即開始運行。此外,使用native代碼,您能夠建立具備較小磁盤佔用空間且獨立的Dart services,從而大大減少了運行Dart services的容器的大小。實驗代表,使用dart2native編譯器,可以將Docker鏡像的大小減小91%,從使用JIT編譯的220MB的代碼減小至使用native編譯的20MB的代碼!有關服務器端應用程序和軟件包的更多詳細信息,能夠查看如下文檔:

服務器端應用程:dart.dev/tutorials/s… 軟件包:dart.dev/server/libr…


七、暫時還未解決的問題

  • 1.dart2.6 不提供交叉編譯支持

dart2native編譯器僅支持爲其運行的操做系統建立native代碼。所以,若是要爲macOS,Windows和Linux上這三個平臺的程序建立可執行文件,則須要分別在各個平臺運行該編譯器。一種實現方法是使用可以同時支持三種操做系統的CI(連續集成)程序。

  • 2.不支持簽名

生成的可執行文件使用的格式與標準簽名工具(例如codesign和signtool)不兼容。

  • 3.不支持 dart:mirrorsdart:developer這兩個庫。

八、其餘功能

Dart 2.6還包含使人興奮的新語言功能 「靜態擴展方法」的預覽版本,該功能容許像在特殊靜態類型的表達式的實例成員同樣,調用特別聲明的靜態函數。可是此功能仍然須要完善,官方也表示在下一個Dart SDK版本中將會正式啓動這個功能。

Dart類具備虛擬方法。好比就像thing.doStuff()這樣的調用將調用thing表示的對象上的虛擬doStuff方法。向類添加方法的惟一方法是修改類。若是你是否是類的做者,你必須使用靜態輔助函數(functions),而不是方法(methods),所以使用 doMyStuff(thing) 代替 thing.doMyStuff()。這對於單個功能是能夠接受的。

更多關於「靜態擴展方法」的資料能夠查看官方的文檔介紹:github.com/dart-lang/l…


本文參考:medium.com/dartlang/da…


【Tips:】本文首發在公衆號 Flutter那些事,更多幹貨歡迎多多關注。

相關文章
相關標籤/搜索