【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】
宣佈推出 Dart 2.6 和 dart2native:將 Dart 編譯成獨立的原生執行檔
Dart 已經為行動裝置和網路提供了 廣泛的編譯器集,用於建構經過生產最佳化的程式碼。這些靈活的編譯器使我們的框架合作夥伴能夠鎖定各種形式:在 Android 和 iOS 上的 Flutter 應用程式、在 網路 和 桌面 上的 Flutter 應用程式、在 網路 上的 AngularDart 應用程式,以及在 嵌入式裝置 上的 Google 助理。
今天,我們宣佈推出 dart2native,它是我們現有編譯器集的擴展,能夠將 Dart 程式編譯成包含預先編譯機器碼的獨立執行檔。使用 dart2native,您可以在 macOS、Windows 或 Linux 上使用 Dart 建立命令列工具。此功能的宣佈圖片 是用此功能本身實現的 :-)
Dart Native 和 dart2native 編譯器
Dart 多年來一直支援 AOT(提前)編譯成原生機器碼,因此 Dart Native 是一項相當成熟的技術。然而,過去我們只透過 Flutter 在 iOS 和 Android 行動裝置上公開此功能。
使用 dart2native,我們正在擴展我們的原生編譯支援,以支援運行 macOS、Windows 和 Linux 的傳統桌面作業系統。由於使用 dart2native 建立的執行檔是獨立的,因此它們可以在未安裝 Dart SDK 的機器上運行。而且由於它們是使用 Dart 的 AOT 編譯器編譯的,因此執行檔只需幾毫秒即可開始運行。與其他 Dart 編譯器和運行時一樣,在編譯成原生程式碼時,Dart 中也提供了同一組豐富且一致的 核心函式庫。
我們聽到了許多客戶要求桌面作業系統的 AOT 編譯——這是我們議題追蹤器中 評分第六高的議題——因此我們很高興能夠提供此功能。
如果您以前使用過 dart2aot,那麼從 2.6 開始,您將使用 dart2native。它提供了 dart2aot 功能的超集。
使用 dart2native 建構命令列應用程式
dart2native 編譯器是建構和部署 基於 Dart 的命令列應用程式 的絕佳選擇。這些應用程式通常使用諸如 dart:io(基本 I/O)、package:http(網路)和 package:args(參數解析)之類的函式庫。讓我們回顧一下將「hello, world」應用程式編譯成執行檔的基礎知識:
原始碼 hello.dart:
1 | main() { |
將 hello.dart 編譯成 hello 執行檔:
1 | $ dart2native src/hello.dart -o hello |
運行 hello 並測量執行時間:
1 | $ time ./hello |
請注意命令如何啟動、列印到 stdout 並在僅 49 毫秒的組合時間內退出!
我們已經看到一些 Dart 開發人員嘗試使用 dart2native 開發命令列工具:
- 來自 SASS(一種流行的 CSS 擴展工具)團隊的 Natalie 報告說,在將他們基於 Dart 的 SASS 實作切換到使用 dart2native 編譯後,它的效能現在可以與基於 C++ 的實作 LibSass 相媲美。
- 來自 Dart DevRel 團隊的 Filip 使用 dart2native 重新編譯了他的 linkchecker 工具,並在檢查小型網站時發現 速度提高了 27 倍。
透過 dart:ffi 與 C 程式碼互通
原生應用程式通常需要從周圍的作業系統存取原生功能。這些系統 API 通常在基於 C 的原生函式庫中公開,而 Dart 透過 dart:ffi 支援與這些函式庫的互通性,dart:ffi 是我們用於 C 互通 的新機制,我們在 Dart 2.5 中以預覽版推出。dart2native 編譯器與 dart:ffi 相容,因此您可以建立和編譯使用它的原生 Dart 應用程式。
一位團隊成員最近使用 dart:ffi 建立了一個用於控制台應用程式開發的 dart_console 函式庫,它具有獲取視窗尺寸、讀取和設定游標位置、管理顏色以及讀取鍵和控制序列等功能。使用 dart:ffi 的能力使 Dart 成為一種非常強大的控制台應用程式語言。
kilo:用不到 500 行 Dart 程式碼編寫的 7MB 程式碼編輯器
使用 Dart 核心函式庫、dart:ffi 和 dart_console 函式庫,我們可以建立非常有趣的控制台應用程式。dart_console 套件包含一個完整的 kilo 示範,這是一個僅用約 500 行 Dart 程式碼 編寫的控制台文字編輯器。kilo 這個名稱來自它的起源,kilo.c,它是一個用大約 1000 行 C 程式碼編寫的實作。
使用新的 dart2native 編譯器,我們可以輕鬆地打包它,最終得到一個 7MB 的獨立程式碼編輯器。以下是一個編譯編輯器的示範,然後使用編譯後的編輯器來編輯其自身的原始程式碼以修復錯誤:
使用 dart2native 建構服務
dart2native 編譯器的另一個潛在用途是小型服務——例如,支援使用 Flutter 編寫的前端應用程式的後端。近年來,一種日益增長的趨勢是使用在 無伺服器計算 上運行的服務。這些是完全託管的服務,可以自動擴展,包括從零擴展到零(不運行),由於它們僅在實際運行時才計費,因此有可能大大降低成本。Google Cloud 透過 Cloud Run 提供無伺服器計算。
對於無伺服器後端,服務快速啟動至關重要。傳統上,基於 Dart 的服務使用我們的 JIT(即時)編譯器運行,但 JIT 基礎的執行在啟動時延遲很高,因為程式碼需要先編譯和預熱才能開始執行。透過將服務的程式碼預先編譯為原生程式碼,您可以避免這種延遲並立即開始運行。此外,使用原生程式碼,您可以建立磁碟佔用空間小且獨立的 Dart 服務,從而大大減少 Dart 服務運行的容器的大小。Dart 開發人員 Paul Mundt 最近 記錄了他使用 dart2native 編譯器的經驗;他能夠將 Docker 映象的大小減少 91%,從使用 JIT 編譯程式碼的 220MB 減少到使用原生程式碼的僅 20MB!有關 伺服器端應用程式 和 套件 的更多詳細資訊,請參閱我們的文件。
可用性
dart2native 編譯器從 2.6 版開始在 Dart SDK 中提供,今天開始可以從 dart.dev/get-dart 獲取。安裝 SDK 後,您應該會在 bin/ 目錄和 PATH 中看到新的編譯器。Dart.dev 上有 更多文件。
如果您透過 Flutter 獲取 Dart SDK,請注意目前的 Flutter 版本對 dart2native 的支援不完整。我們建議您從 dart.dev/get-dart 安裝 Dart 2.6 SDK。
已知限制
此初始版本的 dart2native 編譯器有一些已知的限制,如下所示。您可以透過在我們的 GitHub 議題追蹤器中為議題添加「豎起大拇指」來讓我們知道哪些議題對您很重要。
- 不支援交叉編譯(議題 28617):dart2native 編譯器僅支援為其運行的作業系統建立機器碼。因此,如果您想為所有三個作業系統建立執行檔,則需要在 macOS、Windows 和 Linux 上運行三次編譯器。執行此操作的一種方法是使用支援所有三個作業系統的 CI(持續整合)提供程式。
- 不支援簽名(議題 39106):生成的執行檔使用與標準簽名工具(例如 codesign 和 signtool)不相容的格式。
- 不支援 dart:mirrors 和 dart:developer(請參閱 Dart 核心函式庫)。
Dart 2.6 中的其他變化
Dart SDK 2.6 版還有一些其他變化。
我們在 Dart 2.5 中推出了 dart:ffi 的預覽版,這是我們用於 C 互通 的新機制。Dart 2.6 有一個新版本的 dart:ffi。這個新版本有許多重大 API 變更,以使我們的 API 更易於使用、提供更多類型安全,並提供方便的記憶體存取。有關其他詳細資訊,請參閱 Dart 2.6 變更日誌。透過這些變更,dart:ffi 進入測試階段,我們預計 API 變更的頻率會大大降低,並且預計總體穩定性會很高。請繼續透過 議題追蹤器 向我們提供回饋。
Dart 2.6 還包含一個令人興奮的新語言功能的預覽版,擴展方法。我們還有一些潤色和工具工作要完成此功能,但我們希望在下一個 Dart SDK 版本中正式推出它。到時候我們將會更多地談論擴展方法;現在,您可以閱讀有關 此功能背後的設計考量。
後續步驟
下載 Dart 2.6 SDK(dart.dev/get-dart),使用 dart2native 建構一些酷炫的東西,然後告訴我們。如果您願意分享詳細資訊,請在此文章底部留言。我們很期待看到您建構的東西!
宣佈推出 Dart 2.6 和 dart2native:將 Dart 編譯成獨立的原生執行檔 最初發佈在 Dart 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。