Dart虚拟机仍在使用吗?

35

我已经在几个项目中使用dart/flutter,非常喜欢。

我读到建立移动应用时,dart构建具有本地代码的本地应用程序。但是我也看过dart拥有自己的VM以提高性能。

我想要理解的是,当你构建一个移动应用时,是否使用该VM,或者它正在构建其他编译为本地应用的代码。如果它在做其他事情,那么dart VM还用于什么?

3个回答

68

简短回答:是的,在构建移动应用程序时仍然使用Dart VM。

现在更详细的回答:Dart VM有两种不同的操作模式,即JIT模式和AOT模式。

在JIT模式下,Dart VM能够动态加载Dart源代码,解析并编译它为本机机器码并执行。这种模式用于开发应用程序,并提供诸如调试、热重载等功能。

在AOT模式下,Dart VM不支持动态加载/解析/编译Dart源代码,它仅支持加载和执行预编译的机器码。但是即使是预编译的机器码仍然需要VM来执行,因为VM提供运行时系统,其中包含垃圾回收器、各种dart:*库所需的各种本机方法、运行时类型信息、动态方法查找等。这种模式用于您部署的应用程序中。

AOT模式的预编译机器码从哪里来?当您以发布模式构建应用程序时,Flutter应用程序会由(一种特殊模式的)VM生成此代码。

您可以在这里阅读有关Dart VM如何执行Dart代码的更多信息。


3
对于Flutter而言,这个回答似乎是错误的:https://flutter.dev/docs/resources/faq#how-does-flutter-run-my-code-on-android - flchaux
1
@flchaux 答案在 Flutter 上下文中已经给出。只是关于“Dart VM”中的“VM”部分有点混淆。这里的答案解释了 VM 不一定意味着 JITing。 - Vyacheslav Egorov
JIT => 即时编译;AOT => 预先编译 - 对于不知道的其他人 - 我刚查了一下。 - Julix
有没有办法获取 https://mrale.ph/dartvm/ 的全部内容?我想更多地了解GC是如何分代的,以及对象何时从由年轻清道夫GC技术管理的短期内存晋升到由标记-清除算法管理的长期内存。 - Razvan Cristian Lung

14

当Dart VM以发布模式使用时,它并不像传统意义上的虚拟计算机处理器实现在软件中一样真正是一个虚拟机(virtual machine),这种虚拟机有自己与硬件不同的机器语言。

这就是原问题所引起的困惑。在发布模式下,Dart VM基本上是一个运行时库(与所有高级语言所需的运行时库没有太大区别)。


0

Dart VM非常适合服务器端应用程序,特别是使用dart:io访问本地文件、进程和套接字。


你知道在使用Flutter构建的移动应用程序中是否使用了VM吗?那是我问的第一个问题。 - DragonFax
在移动端开发过程中,VM 被用来进行开发。热重载无法与编译代码一起使用。 - Günter Zöchbauer
1
VM在开发和部署Flutter应用程序时都会使用。VM始终存在,只是根据用例进行不同的配置。Dart VM就像瑞士军刀一样,可以切割和切块。请参见下面的答案。 - Vyacheslav Egorov
当我部署Flutter应用时,是否会部署相同的开发VM实例(但使用生产配置),还是会进行优化和缩减? - Ganymede
1
@Ganymede,这不同于开发虚拟机。它是一种特殊版本的虚拟机,经过优化和精简。 (“特殊构建”意味着它是以特殊方式构建的... Dart VM是从C ++源代码编译的,通过调整某些编译选项,可以获得不同的“构建”) - Vyacheslav Egorov
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接