歡迎您光臨本站 註冊首頁

Dart 2.5 發布,支持 Dart 與 C 相互調用

←手機掃碼閱讀     admin @ 2019-09-12 , reply:0

Dart 2.5 已經發布了,其中包括兩個主要預覽新特性:機器學習(ML)驅動的代碼補全和 dart:ffi 外部函數介面,用於直接從 Dart 調用 C 代碼。Dart 2.5 還改進了對常量表達式的支持。具體如下:

ML Complete,按機器學習排序的代碼補全

通過分析 GitHub 上 Dart 代碼的大量語料庫,訓練基於給定上下文的可能出現的成員的模型來實現的,這個模型由 TensorFlow Lite 驅動,可以用來預測開發人員正要編輯的代碼,這個新特性稱為 ML Complete。

假設編寫一個小程序,用來計算從當前時間到某一天的時間。使用 ML Complete,如下所示(第一張圖)。首先,它能夠根據變數名稱為 now 自動提供 DateTime.Now() 補全 。接下來,定義變數名 tomorrow,使用 add(…) 方法。在非 ML Complete 中(第二張圖),必須手動開始輸入 Datetime 才會有提示補全,而且 add() 方法在補全提示的列表中的位置相對低。

ML Complete 可以在所有支持 Dart 的編輯器中使用,包括 Android Studio、IntelliJ 和 VS Code 等。由於該特性仍出於預覽階段,若要試用可在 Flutter dev channel 和 Dart dev channel 版。

dart:ffi 外部函數介面

目前,直接從 Dart 調用 C 的支持僅限於使用原生擴展深入集成到 Dart VM 中,或者 Flutter 應用程序可以間接調用 C,通過使用 Platform Channel 調用主機,在那裡調用 C,這是一個不受歡迎的雙重間接。

Dart-C 互操作支持的兩種主要方案:

  1. 在主機操作系統(OS)上調用基於 C 的系統 API

  2. 為單個操作系統或跨平台調用基於 C 的庫

調用基於 C 的操作系統 API

調用 Linux 命令 system,該命令允許執行任何系統命令,傳遞給它的參數實際是傳遞給  shell/terminal,並在其運行。下面是這個命令的 C 頭文件:

// C header: int system(const char *command) in stdlib.h

任何互操作機制的難點在於處理兩種語言在語義上的差異。對於 dart:ffi,Dart 代碼需要做兩件事:

  • C 函數及其參數的類型和返回類型

  • 對應的 Dart 函數及其類型

// C header typedef:
typedef SystemC = ffi.Int32 Function(ffi.Pointercommand);

// Dart header typedef:
typedef SystemDart = int Function(ffi.Pointercommand);

然後,需要載入庫並查找要調用的函數,如何做到這一點取決於操作系統;在本例中,使用的是 MacOS:

// Load `stdlib`. On MacOS this is in libSystem.dylib.
final dylib = ffi.DynamicLibrary.open('/usr/lib/libSystem.dylib');

// Look up the system function.
final systemP = dylib.lookupFunction('system');

接下來,使用與特定操作系統相關的編碼對字元串參數進行編碼,調用函數,並再次釋放參數內存:

// Allocate a pointer to a Utf8 array containing our command.
final cmdP = Utf8.toUtf8('open http://dart.dev');

// Invoke the command.
systemP(cmdP);

// Free the pointer.
cmdP.free();

此代碼執行系統命令,導致系統默認瀏覽器打開 dart.dev:

調用基於 C 的框架和組件

Dart 的第二個核心用途是調用基於 C 的框架和組件。如上的示例,它使用 TensorFlow Lite,一個基於 C 的 API,使用 Dart:ffi 允許在需要提供代碼完成的所有操作系統上運行 TensorFlow,並具有本機 TensorFlow 實現的高性能。

目前 dart:ffi 屬於預覽階段,所以還會有一些限制。

另外,從 Dart 2.5 開始,支持更多的方法來定義常量表達式,包括強制轉換以及在 Dart 2.3 中提供的新的控制流和集合擴展特性:

const Object i = 3;
const list = [i as int];
const set = {if (list is List) ...list};
const map = {if (i is int) i: "int"};

詳情見發布說明


[admin ]

來源:OsChina
連結:https://www.oschina.net/news/109799/dart-2-5-released
Dart 2.5 發布,支持 Dart 與 C 相互調用已經有49次圍觀

http://coctec.com/news/soft/show-post-214404.html