我已经在几个项目中使用dart/flutter,非常喜欢。
我读到建立移动应用时,dart构建具有本地代码的本地应用程序。但是我也看过dart拥有自己的VM以提高性能。
我想要理解的是,当你构建一个移动应用时,是否使用该VM,或者它正在构建其他编译为本地应用的代码。如果它在做其他事情,那么dart VM还用于什么?
简短回答:是的,在构建移动应用程序时仍然使用Dart VM。
现在更详细的回答:Dart VM有两种不同的操作模式,即JIT模式和AOT模式。
在JIT模式下,Dart VM能够动态加载Dart源代码,解析并编译它为本机机器码并执行。这种模式用于开发应用程序,并提供诸如调试、热重载等功能。
在AOT模式下,Dart VM不支持动态加载/解析/编译Dart源代码,它仅支持加载和执行预编译的机器码。但是即使是预编译的机器码仍然需要VM来执行,因为VM提供运行时系统,其中包含垃圾回收器、各种dart:*
库所需的各种本机方法、运行时类型信息、动态方法查找等。这种模式用于您部署的应用程序中。
AOT模式的预编译机器码从哪里来?当您以发布模式构建应用程序时,Flutter应用程序会由(一种特殊模式的)VM生成此代码。
您可以在这里阅读有关Dart VM如何执行Dart代码的更多信息。
当Dart VM以发布模式使用时,它并不像传统意义上的虚拟计算机处理器实现在软件中一样真正是一个虚拟机(virtual machine),这种虚拟机有自己与硬件不同的机器语言。
这就是原问题所引起的困惑。在发布模式下,Dart VM基本上是一个运行时库(与所有高级语言所需的运行时库没有太大区别)。
Dart VM非常适合服务器端应用程序,特别是使用dart:io
访问本地文件、进程和套接字。