dart调用python_Dart 2.5 发布,支持 Dart 与 C 相互调用

Dart 2.5 已经发布了,其中包括两个主要预览新特性:机器学习(ML)驱动的代码补全和 dart:ffi 外部函数接口,用于直接从 Dart 调用 C 代码。Dart 2.5 还改进了对常量表达式的支持。具体如下:

ML Complete,按机器学习排序的代码补全

通过分析 GitHub 开放源代码 Dart 代码的大量语料库,根据给定的上下文训练可能出现的成员事件的模型。这个模型由 TensorFlow Lite 驱动,可以用来预测开发人员正要编辑的下一个符号,这个新特性称为 ML Complete。下面是一个使用 Flutter 框架开发新 MyHome 小部件的示例:

假设编写一个小程序,用来计算从当前时间到某一天的时间。使用 ML Complete,如下所示(第一张图)。首先,它能够根据具有现在变量名称自动有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,实现间接调用,这是一个不受欢迎的双重间接。

Dart-C 互操作支持的两种主要方案:

在主机操作系统(OS)上调用基于 C 的系统 API

为单个操作系统或跨平台调用基于 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.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"};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值