Dart2.6正式版釋出,支援編譯為mac,windows,linux三大系統native可執行檔案

AWeiLoveAndroid發表於2019-11-11

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 juejin.im/post/5dc8d0…

轉載請標明出處: juejin.im/post/5dc8d0… 本文出自 AWeiLoveAndroid的部落格


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


近日Dart釋出了最新版Dart2.6正式版。這次又有哪些新功能呢?我們來一起看看。

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上的命令列建立工具。此功能的演示圖如下所示:

dart2native.gif


1、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更完善。


2、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版本號和安裝路徑


3、使用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
複製程式碼

編譯過程如下圖所示:

編譯過程


4、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行程式碼。


5、使用少於500行的程式碼編寫7M的程式碼編輯器

使用Dart核心庫、dart:ffidart_console 庫,我們可以建立非常有趣的控制檯應用程式。dart_console庫包括一個完整的 Kilo 演示,這是一個用大約500行Dart程式碼編寫的控制檯文字編輯器。

使用新的dart2native編譯器,我們可以輕鬆地打包它,最後得到一個7MB的self-contained程式碼編輯器。下圖是一個編譯編輯器的演示,然後使用編譯的編輯器編輯自己的原始碼來修復錯誤:

dart_console演示.gif


6、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…


7、暫時還未解決的問題

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

dart2native編譯器僅支援為其執行的作業系統建立native程式碼。因此,如果要為macOS,Windows和Linux上這三個平臺的程式建立可執行檔案,則需要分別在各個平臺執行該編譯器。一種實現方法是使用能夠同時支援三種作業系統的CI(連續整合)程式。

  • 2.不支援簽名

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

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

8、其他功能

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那些事,更多幹貨歡迎多多關注。

相關文章