DART现在可以为MacOS、Win和Linux生成自包含的本机可执行文件

2020-06-09 10:05:44

DART已经提供了一套广泛的编译器,用于为移动设备和Web构建针对生产优化的代码。这些灵活的编译器使我们的框架合作伙伴能够面向广泛的外形规格:Android和amp;iOS上的Ffltter应用程序、Web和amp;桌面上的Ffltter应用程序、Web上的AngularDart应用程序,以及嵌入式设备上的Google Assistant。

今天我们要宣布的是dart2ative,它是我们现有编译器集的扩展,能够将DART程序编译成包含提前编译的机器码的独立可执行文件。借助dart2ative,您可以使用DART在MacOS、Windows或Linux上创建命令行工具。此功能的公告图片是使用功能本身实现的:-)。

DART支持到本机机器代码的AOT(提前)编译已经有几年了,因此DART Native是相当成熟的技术。然而,在过去,我们只在iOS和Android移动设备上通过Ffltter公开了这一功能。

借助dart2ative,我们正在扩展我们的本机编译支持,以支持运行MacOS、Windows和Linux的传统桌面操作系统。因为使用dart2ative创建的可执行文件是独立的,所以它们可以在没有安装DART SDK的计算机上运行。因为它们是用DART的AOT编译器编译的,所以可执行文件在几毫秒内就开始运行。与其他DART编译器和运行时一样,在编译为本机代码时,DART中提供了相同的一组丰富且一致的核心库。

我们听到许多客户要求为桌面操作系统进行AOT编译--这是我们问题跟踪器中评分第六高的问题--所以我们很高兴能够提供这一功能。

如果您以前使用的是dart2aot,那么从2.6开始,您将使用dart2ative。它提供了dart2aot功能的超集。

对于为命令行构建和部署基于DART的应用程序,dart2本机编译器是一个很好的选择。这些应用程序通常使用DART:IO(基本I/O)、Package:HTTP(联网)和Package:args(参数解析)等库。让我们回顾一下将“hello,world”应用程序编译成可执行文件的基础知识:

注意命令如何启动、打印到stdout和退出,总共只用了49毫秒!

我们已经看到一些DART开发人员已经为命令行工具试验了dart2ative:

来自sass(一种流行的CSS扩展工具)团队的Natalie报告说,在将他们基于DART的sass实现转换为使用dart2ative编译之后,它现在的性能与基于C++的LibSass相当。

来自Dart DevRel团队的Filip用dart2ative重新编译了他的链接检查工具,在检查小型站点时,他的速度提高了27倍。

本机应用程序通常需要从周围的操作系统访问本机功能。这些系统API通常在基于C的本机库中公开,DART通过DART:FFI支持与这些库的互操作性,DART:FFI是我们在DART 2.5中的预览中推出的C互操作的新机制。dart2本机编译器与dart:ffi兼容,因此您可以创建和编译使用它的本机DART应用程序。

一名团队成员最近使用DART:FFI为控制台应用程序开发创建了一个DART_CONSOLE库,该库具有获取窗口尺寸、读取和设置光标位置、管理颜色以及读取按键和控制序列等功能。使用DART的能力:FFI使DART成为控制台应用程序的一种非常强大的语言。

使用DART核心库、DART:FFI和DART_CONSOLE库,我们可以创建非常有趣的控制台应用程序。DART_CONSOLE包包括KILO的完整演示,这是一个仅用大约500行DART代码编写的控制台文本编辑器。KILO这个名字来自于它的起源kiro.c,它是一个C实现,大约有1000行代码。

使用新的dart2本机编译器,我们可以轻松地将其打包,最终得到一个7Mb的自含式代码编辑器。以下是编译编辑器的演示,然后使用编译后的编辑器编辑其自己的源代码以修复错误:

dart2原生编译器的另一个潜在用途是用于小型服务-例如,支持使用Ffltter编写的前端应用程序的后端。近年来,使用在无服务器计算上运行的服务已成为一种日益增长的趋势。这些是完全托管的服务,可以自动扩展,包括上下扩展到零(不运行),提供大幅降低成本的潜力,因为它们只有在实际运行时才会计费。Google Cloud通过Cloud Run实现无服务器计算。

对于无服务器后端,服务必须快速启动,这一点至关重要。传统上,基于DART的服务使用我们的JIT(Just-in-Time)编译器运行,但是基于JIT的执行在启动时延迟很高,因为代码需要编译和预热后才能开始执行。通过将服务的代码提前编译为本机代码,您可以避免此延迟并立即开始运行。此外,使用本机代码可以创建磁盘占用量小且独立的DART服务,从而大大减小运行DART服务的容器的大小。DART开发人员Paul Mundt最近记录了他使用dart2本机编译器的经验;通过使用本机代码,他能够将他的Docker映像的大小从使用JIT编译的代码的220MB减少到只有20MB!有关服务器端应用程序和软件包的更多详细信息,请参阅我们的文档。

DART SDK从版本2.6开始提供dart2原生编译器,该版本从今天起从dart.dev/get-dart开始提供。一旦安装了SDK,您应该会在bin/目录和路径中看到新的编译器。Dart.dev有更多文档。

如果您是通过Ffltter获得Dart SDK的,请注意当前Ffltter版本具有不完整的dart2原生支持。我们建议您从dart.dev/get-dart安装DART 2.6 SDK。

这个初始版本的dart2本机编译器有一些已知的限制,如下所列。您可以在我们的GitHub问题跟踪器中为问题添加“竖起大拇指”,让我们知道哪些问题对您重要。

不支持交叉编译(问题28617):dart2本机编译器仅支持为其运行的操作系统创建机器码。因此,如果要为所有这三种操作系统创建可执行文件,则需要在MacOS、Windows和Linux上运行编译器三次。实现这一点的一种方法是使用支持所有三种操作系统的CI(持续集成)提供程序。

不支持签名(问题39106):生成的可执行文件使用的格式与标准签名工具(如codesign和signtool)不兼容。

我们在DART 2.5中发布了DART:FFI的预览版,这是我们针对C互操作的新机制。DART 2.6有一个新版本的DART:FFI。这个新版本有许多突破性的API更改,以使我们的API更易于使用,提供更多的类型安全,并提供对内存的方便访问。有关其他详细信息,请参阅DART 2.6更改日志。有了这些更改,DART:FFI将升级到测试版,我们预计API更改的频率将大大降低,总体稳定性预计会很高。请继续通过问题跟踪器向我们提供反馈。

DART 2.6还包含一个令人兴奋的新语言特性--扩展方法的预览。要完成此功能,我们还有一些改进和工具工作要做,但我们希望在下一个DART SDK版本中正式推出它。到那时,我们将有更多关于扩展方法的内容要说;现在,您可以阅读该功能背后的设计注意事项。

下载DART2.6SDK(dart.dev/get-dart),用dart2ative构建一些很酷的东西,然后告诉我们。如果您愿意分享详细信息,请在本文底部留下回复。我们很高兴能看到你建造的东西!