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

2019-09-17     星集

DART (計算機程式語言)

Dart是谷歌開發的計算機程式語言,後來被Ecma (ECMA-408)認定為標準 。它被用於web、伺服器、移動應用 和物聯網等領域的開發。它是寬鬆開源許可證(修改的BSD證書)下的開源軟體。

Dart是面向對象的、類定義的、單繼承的語言。它的語法類似C語言,可以轉譯為JavaScript,支持接口(interfaces)、混入(mixins)、抽象類(abstract classes)、具體化泛型(reified generics)、可選類型(optional typing)和sound type system

調用基於 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.Pointer command);
// Dart header typedef:
typedef SystemDart = int Function(ffi.Pointer command);

然後,需要加載庫並查找要調用的函數,如何做到這一點取決於作業系統;在本例中,使用的是 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"};

更多更優質的資訊,請關注我,你的支持會鼓勵我不斷分享更多更好的優質文章。

文章來源: https://twgreatdaily.com/zh-cn/MsCGQG0BJleJMoPMJR6I.html