走进Dart虚拟机:深入理解高效卓越的运行机制

news2024/10/5 13:49:39

Dart虚拟机概述

Dart虚拟机是运行Dart代码的主要工具之一。Flutter框架使用Dart作为开发语言,因此Dart虚拟机在Flutter中扮演了非常重要的角色。

Dart虚拟机是一种解释器,它能够解释和执行Dart代码。Dart代码在虚拟机中被编译成字节码,然后通过解释器转化成机器码并执行。这个过程使得Dart代码可以在各种不同的平台上运行,而无需进行特定平台的编译。

Dart虚拟机有许多功能,其中包括:

  • 实时编译(JIT):Dart虚拟机可以在运行时对Dart代码进行编译,从而提高执行效率。
  • 预编译(AOT):Dart虚拟机可以将Dart代码预编译成本地机器码,以提高执行效率和减少启动时间。
  • 内存管理:Dart虚拟机使用垃圾回收器来管理内存,从而帮助开发人员避免内存泄漏和其他内存相关的问题。
  • 异步编程:Dart虚拟机内置了Future和Stream等异步编程工具,使得开发人员可以方便地进行异步编程。
  • 插件系统:Dart虚拟机支持插件系统,使得开发人员可以方便地将其他语言的代码集成到Dart应用程序中。

在Flutter中,Dart虚拟机被用于运行Dart代码,并支持热重载,使得开发人员可以快速迭代和调试代码。此外,Dart虚拟机还被用于在Flutter应用程序中运行本地插件。

Dart虚拟机的创建过程

Dart虚拟机是一个解释器,它可以将Dart代码编译成字节码,并通过解释器将其转换成机器码并执行。在Flutter应用程序中,Dart虚拟机是通过Flutter引擎来创建和运行的。

下面是Dart虚拟机的创建过程:

  1. 首先,Flutter引擎会创建一个新的Isolate(独立的Dart执行环境),并将Dart代码加载到该Isolate中。
  2. 接着,Flutter引擎会启动Dart虚拟机,并为该Isolate创建一个Dart虚拟机实例。
  3. Dart虚拟机实例会初始化一个Dart运行时环境,并在该环境中创建一个Isolate对象,该对象用于管理和控制当前的执行环境。
  4. Dart虚拟机实例会为该Isolate分配一些资源,包括栈空间、堆内存和文件描述符等。
  5. Dart虚拟机实例会将Dart代码编译成字节码,并将其加载到该Isolate中。
  6. 然后,Dart虚拟机实例会创建一个Dart解释器,该解释器会解释和执行该Isolate中的Dart代码。
  7. 最后,Dart虚拟机实例会启动该Isolate,从而开始执行Dart代码。

Dart虚拟机代码实现

解析命令行参数和环境变量。Dart虚拟机接受很多命令行参数和环境变量,这些参数和变量用于指定运行参数、加载库、设置日志级别等等。

复制代码dart::bin::MainIsolateStartupData* isolate_data = new dart::bin::MainIsolateStartupData(&error);
if (isolate_data == NULL) {
  OS::PrintErr("Error allocating startup data\n");
  return kErrorExit;
}
​
// Parse command-line arguments.
error = DartUtils::ParseCommandLineArguments(argc, argv, isolate_data);
if (!error.IsEmpty()) {
  OS::PrintErr("%s\n", error.ToCString());
  delete isolate_data;
  return kErrorExit;
}

初始化垃圾回收器。Dart虚拟机使用了一款称为“标记整理”的垃圾回收器,其初始化过程会为虚拟机分配一定的内存,其中包括了存储空间、栈空间和堆空间。

复制代码Dart_EnterScope();
Dart_Handle result_code = Dart_Init(isolate_data->script_name(),
                                    isolate_data->resolved_script_url(),
                                    isolate_data->create_group_);
if (Dart_IsError(result_code)) {
  error = DartUtils::GetStringValue(result_code);
} else {
  ASSERT(result_code == Dart_Null());
}
​
Dart_ExitScope();

加载dart:core库。dart:core库是Dart虚拟机中的核心库,其中包括了基本的数据类型、控制流语句、异常处理等功能。

复制代码Dart_Handle core_lib = Dart_LookupLibrary(DartUtils::NewString("dart:core"));
Dart_Handle class_double = Dart_GetClass(core_lib, DartUtils::NewString("double"));
if (Dart_IsError(class_double)) {
  error = DartUtils::GetStringValue(class_double);
}

加载用户指定的库。用户可以通过传递命令行参数或者使用import语句来加载自己编写的Dart库,Dart虚拟机在启动时需要将这些库加载到虚拟机中。

复制代码// Load the specified application script into a 'Library' object.
Dart_Handle root_library =
    DartUtils::LoadScript(isolate_data->script_name(),
                          isolate_data->resolved_script_url(),
                          isolate_data->source_directory());
if (Dart_IsError(root_library)) {
  error = DartUtils::GetStringValue(root_library);
}

创建Dart独立运行时环境。Dart虚拟机使用Dart_Isolate作为内部线程的基础,Dart_Isolate是Dart中的一个执行单元,它包含了Dart中的所有状态,包括程序计数器、堆、栈、局部变量等。

复制代码// Create a new isolate from the application script.
Dart_IsolateFlags flags;
strcpy(flags.name, "");
flags.package_root = NULL;
flags.packages_file = NULL;
Dart_Isolate isolate =
    Dart_CreateIsolate(isolate_data->script_name(), "", isolate_snapshot_buffer,
                       NULL, &

Dart虚拟机是在flutter中的重要技术部分,出了本文中的dart小部分技术介绍外。还需要 学习非常多的核心技术点;才能在算得上资深flutter。这里推荐参考《Flutter手册》点击可以查看全部技术类目。

总结

Dart虚拟机是一个支持JIT编译和AOT编译的强类型脚本语言虚拟机,它可以运行在多种平台上,包括PC、移动设备和嵌入式设备上。Dart虚拟机内置了大量的标准库和工具,包括Dart SDK、Dart Analyzer、Dartfmt等,方便开发者进行开发和维护。Dart虚拟机支持使用各种IDE,包括Flutter、IntelliJ IDEA等,提供了强大的代码编辑和调试功能,大大提高了开发效率。

Dart虚拟机的设计架构具有良好的可扩展性和可定制性,支持诸如Dart的Native扩展等机制,可以在运行时加载和卸载模块进行动态扩展。Dart虚拟机还支持一些高级语言特性,如异步编程和生成器,使得开发者可以编写更加高效的、带有处理异步逻辑的程序。同时,Dart虚拟机还支持代码优化和预编译等特性,以提高程序的性能和运行效率。

总之,Dart虚拟机是一个具有很多优良特性的强类型脚本语言虚拟机,与Flutter等生态系统紧密结合,为移动应用开发提供了一个全面、高效的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/458089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows开机启动软件、执行脚本,免登录账户

文章目录 前言一、打开任务计划程序1.我电脑上的是点搜索“任务计划程序”,可能每个电脑的搜索按钮不一样,自行查找2.打开后应该是长这样的 二、创建文件夹1.点击任务计划程序库、右键选择新建文件夹2.名字顺便,点击确定3.创建后如图、点击目…

Aspose.Slides for .NET V23 Crack

Aspose.Slides for .NET V23 Crack 现在,您可以在将演示文稿保存为HTML时保留文档缩放。 Aspose.Slides for.NET是一个演示文稿处理API,使应用程序能够读取、写入、修改和转换Microsoft PowerPoint演示文稿。作为一个独立的API,它提供了管理P…

【马蹄集】第八周作业

第八周作业 目录 MT2016 数据流的中位数MT2017 连续的串MT2027 一秒成零MT2033 碰碰车MT2036 移水造海 MT2016 数据流的中位数 难度:黄金  时间限制:1秒  占用内存:128M 题目描述 对于数据流问题,小码哥需要设计一个在线系统&…

RK3568芯片开发笔记——调试pwm控制红外功能

1、PWM介绍 参考博客:《ARM芯片开发(S5PV210芯片)——定时器、看门狗、RTC》; 2、配置pwm功能的方法 (1)内核层:内核代码里有pwm子系统,里面有pwm相关函数接口,如果是驱动代码里要操作pwm就需要…

从0搭建Vue3组件库(七):使用 gulp 打包组件库并实现按需加载

使用 gulp 打包组件库并实现按需加载 当我们使用 Vite 库模式打包的时候,vite 会将样式文件全部打包到同一个文件中,这样的话我们每次都要全量引入所有样式文件做不到按需引入的效果。所以打包的时候我们可以不让 vite 打包样式文件,样式文件将使用 gulp 进行打包。那么本篇文…

FBEC大会 | 瑞云科技 CTO 赵志杰:元宇宙时代的基础设施——实时云渲染

​ FBEC未来商业生态链接大会于2023年2月24日在深圳福田大中华喜来登酒店盛大召开,本次大会由广东省游戏产业协会、深圳市互联网文化市场协会指导,陀螺科技主办。 大会以“勇毅前行逐光而上”为主题,以具有行业前瞻洞察的“探索者”为视角&a…

docker以外挂目录的方式部署springboot项目

前置准备: 清单: 安装有docker的Linuxspringboot打包的jar文件(该项目只有一个返回"hello world"接口) Linux的IP地址:192.168.221.129 springboot项目的接口: 1、上传jar文件至Linux 我上传…

基于springboot的前后端分离的案列(一)

SpringBootWeb案例 前面我们已经讲解了Web前端开发的基础知识,也讲解了Web后端开发的基础(HTTP协议、请求响应),并且也讲解了数据库MySQL,以及通过Mybatis框架如何来完成数据库的基本操作。 那接下来,我们就通过一个案例&#xf…

ArcGIS三体阴影(影像三维)显示马赛克?

我们经常基于ArcGIS通过DEM来做山体阴影 但是有时候你一放大就会出现很强的马赛克的效果 还有我们在利用ArcScene建三维场景 即使数据分辨率很高也会出现马赛克效果 那怎么来解决这个问题呢 让我们的山体阴影显示更加细腻 三维没有马赛克的效果呢? 右键图层选择如…

Java线程间通信方式

前文了解了线程的创建方式和状态切换,在实际开发时,一个进程中往往有很多个线程,大多数线程之间往往不是绝对独立的,比如说我们需要将A和B 两个线程的执行结果收集在一起然后显示在界面上,又或者比较典型的消费者-生产…

Linux内核进程管理与调度:策略优化与实践分析

Linux内核进程管理与调度 一、前言二、进程管理和多进程调度2.1 进程标识符和控制块2.2 进程状态和转换2.3 进程间通信 三、单处理器下的Linux进程调度3.1 Linux进程调度器3.2 时间片轮转调度算法3.3 最短剩余时间优先调度算法3.4 其他调度算法的不足 四、多处理器下的Linux进程…

【数据结构 ---基于C语言预备知识】

数据结构 ---基于C语言预备知识 一、对数据结构这门课的基础认识1.1 数据结构的定义:1.2 衡量算法的标准:主要的是1,21.3 数据结构的特点和地位: 二、预备知识:2.1 内存概念:2.2 预备知识指针(复…

每日学术速递4.23

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.LiDAR-NeRF: Novel LiDAR View Synthesis via Neural Radiance Fields 标题:LiDAR-NeRF:通过神经辐射场的新型 LiDAR 视图合成 作者:Tang Tao, …

pytest 学习三(前置后置操作)

pytest测试框架_pytest框架-CSDN博客 一、常用的操作 一、setup/teardown 每个用例之前、之后执行 二、setup_class/teardown_class 在每个类之前、之后执行一次 二、pytest.fixture 设置前置后置操作范围 pytest.fixture(scope"",params,autouse,ids,name) 其中 sc…

TVM- End-to-End Optimization Stack for Deep Learning

TVM- End-to-End Optimization Stack for Deep Learning 引言 TensorFlow、MXNet、Caffe 和 PyTorch 等可扩展框架推动了深度学习当前的普及和实用性。然而,这些框架针对范围较窄的服务器级 GPU 进行了优化,将工作负载部署到其他平台(例如手…

SpringBoot中@EnableAsync和@Async注解的使用

目录 1.EnableAsync 注解1.1 配置类使用示例1.2 复制请求上下文 2.用法1:Async 注解2.1 测试Controller2.2 测试Service2.3 测试ServiceImpl2.4.测试 4.用法2:直接使用 taskExecutor 做异步4.1 重新实现:测试ServiceImpl4.2 测试 5.Async异步…

保护模式段描述符

目前为止,内存还是分段模式,所以想要保护内存,就需要保存段。由于CPU的扩展导致了32位的段基地址和段内偏移,所以16位的段寄存器就无法放下这些信息。现在就需要把这些信息放到内存中,这些信息被封装成特定的段描述符。…

Vue进阶-Vue cli项目搭建、项目基本操作、axios的使用、路由、Vuex

Vue进阶 Vue cli 一、Vue cli 概述 CLI 全称是 Commond Line Interface,翻译为命令行界面,俗称脚手架。VueCLI是一个官方发布vue.js项目脚手架。用VueCLI 可快速搭建Vue开发环境以及对应webpack配置。 二、环境搭建 1、下载 node.js 下载地址&…

4 redis高可用

所谓的高可用,也叫HA(High Availability),是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果在实际生产中,如果redis只部署一个节点,…

Compiler- 自增运算

我们来看一下C语言中的前自增(i)和后自增(i) 这个经典案例。大家在学习C的时候肯定学过前自增是先自增,然后将结果用于计算;后自增是先参与计算,再增加。 好,看一下这段代码的结果: #include …