Dart 2.5 发布,支持 Dart 与 C 相互调用
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 互操作支持的两种主要方案:
- 在主机操作系统(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<Utf8> command); // Dart header typedef: typedef SystemDart = int Function(ffi.Pointer<Utf8> 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<SystemC, SystemDart>('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<int>) ...list}; const map = {if (i is int) i: "int"};
详情见发布说明
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Django 3.0 发布,开始支持异步功能
Django 3.0 发布了,此版本带来了一些新特性,其中最值得关注的应当是其开始支持异步功能。 此前我们报导过,有草案提出要让 Django 支持异步。聚集于HTTP 中间件视图和 ORM,开发者要在 Django 中添加异步支持,同时维护对同步 Python 的支持,并且将完全向后兼容。 该设想最终会替换掉Django 中的大多数阻塞部分,包括 Session、Auth、ORM 与 Handlers 等,使其原生支持异步。而同步 API 将继续存在并得到完全支持,其中一些最终将转变为原生异步代码的同步包装器。 ASGI 模式将 Django 作为原生异步应用程序运行,原有的 WSGI 模式将围绕每个 Django 调用运行单个事件循环,以使异步处理层与同步服务器兼容。 在这个改造的过程中,每个特性都会经历以下三个实现阶段: Sync-only,只支持同步,也就是当前的情况 Sync-native,原生同步,同时带有异步封装器 Async-native,原生异步,同时带同步封装器 Django 3.0 开始提供运行ASGI 应用支持,让 Django 逐渐具备异步功能。做了这一改动后...
- 下一篇
pLua 0.1发布,Lua 性能分析工具
pLua Lua 性能分析工具 原理 类似于 gperftools,通过定时器信号回调查看调用栈,来定位调用的热点 特性 简单,只需几行代码,即可输出结果 准确,相比 lua hook,定时采样的方式更能准确捕获 lua 执行的热点 轻量,因为是采样的,相比直接按行 lua hook,能最小程度影响宿主程序的运行 直观,输出调用图,能直观的看到热点和调用关系 使用 Lua code -- 引入libplua.so local p = require "libplua" -- 开启采样 -- 参数1:采样时间(秒),0表示一直采样 -- 参数2:采样结果文件 p.start(0, "call.pro") do_some_thing() -- 结束采样,输出结果文件 p.stop() -- 把结果转成txt格式 p.text("call.pro", "call.txt") -- 把结果转成dot格式,可用graphviz查看 p.dot("call.pro", "call.dot") -- 把结果转成svg格式,可直接用浏览器打开查看 p.svg...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路