Dart 代码的组件集合Dart VM

简介: 这是我参与8月更文挑战的第 6 天,活动详情查看:8月更文挑战。为应掘金的八月更文挑战,本文主要介绍本地执行 Dart 代码的组件集合Dart VM

这是我参与8月更文挑战的第 6 天,活动详情查看:8月更文挑战。为应掘金的八月更文挑战

本文主要介绍本地执行 Dart 代码的组件集合Dart VM

PS:内容比较繁杂,请酌情观看

Dart VM 是用于本地执行 Dart 代码的组件集合,它主要包括以下内容:

  • 运行时系统
  • 对象模型
  • 垃圾收集
  • 快照
  • 核心库的 native 方法
  • 可以通过 service protocol 访问的组件:调试 * 分析 * 热重载
  • 即时 (JIT) 和提前 (AOT) 编译管道
  • Interpreter
  • ARM模拟器

Dart VM 从某种意义上说是一个虚拟机,它为高级编程语言提供了一个执行环境,「但这并不意味着 Dart 在 Dart VM 上执行时总是需要被解释或 JIT 编译的」

例如可以使用 Dart VM AOT 将 Dart 代码编译成机器代码,然后在 Dart VM 的裁剪版本中执行,这被称为预编译运行时,它不包含任何编译器组件,无法动态加载 Dart 源代码。

Dart VM 如何运行你的代码?

Dart VM 有多种执行代码的方式,例如:

  • 使用源代码或内核二进制文件的 JIT 模式;
  • 使用快照:
  • 来自 AOT 快照;
  • 来自 AppJIT 快照;

然而它们之间的主要区别在于: 「VM “何时”以及“如何”将 Dart 源代码转换为可执行代码」,然后保证执行的运行时环境保持不变。

网络异常,图片无法展示
|

VM 中的任何 Dart 代码都在某个 isolate 中运行,可以将其描述为:「具有自己的内存(堆)并且通常具有自己的控制线程(mutator 线程)的 Dart 隔离宇宙」

VM 可以有许多 isolate 同时执行 Dart 代码,但它们不能直接共享任何状态,只能通过端口传递消息进行通信(不要与网络端口混淆!)。

这里的 OS 线程和 isolate 之间的关系有点模糊,并且高度依赖于虚拟机嵌入到应用程序的方式,但是主要需要保证以下内容:

  • 一个 OS 线程一次只能进入一个 isolate ,如果它想进入另一个 isolate,它必须离开当前 isolate
  • 一次只能有一个与 isolate 相关联的 Mutator 线程,Mutator 线程是执行 Dart 代码并使用 VM 的公共 C API 的线程。

然而同一个 OS 线程可以先进入一个 isolate 执行 Dart 代码,然后离开这个 isolate 并进入另一个 isolate 继续执行;或者有许多不同的 OS 线程进入一个 isolate 并在其中执行 Dart 代码,只是不会同时发生。

当然,除了单个 Mutator 线程之外,isolate 还可以关联多个辅助线程,例如:

  • 一个后台 JIT 编译器线程;
  • GC sweeper 现场;
  • 并发 GC marker 线程;

VM 在内部使用线程池 (dart::ThreadPool) 来管理 OS 线程,并且代码是围绕 dart::ThreadPool::Task 概念而不是围绕 OS 线程的概念构建的。

例如在 GC VM 中将 dart::ConcurrentSweeperTask 发布到全局 VM 的线程池,而不是生成专用线程来执行后台清除,「并且线程池实现要么选择空闲线程,要么在没有可用线程时生成新线程」;类似地,「用于 isolate 来消息处理事件循环的默认实现实际上,并没有产生专用的事件循环线程,而是在新消息到达时将dart::MessageHandlerTask 发布到线程池」

dart::Isolate 类相当于一个 isolatedart::Heap 类相当于 isolate 的堆,dart::Thread 类描述了线程连接到 isolate 相关的状态。

请注意,该名称 Thread可能会让人有些困惑,因为所有 OS 线程都附加到与 Mutator 相同的 isolate,将重用相同的 Thread 实例。有关 isolate 消息处理的默认实现,请参阅 Dart_RunLoopdart::MessageHandler



相关文章
|
编解码 Shell Linux
❤️超详细的FFmpeg安装及简单使用教程❤️
❤️超详细的FFmpeg安装及简单使用教程❤️
4067 0
❤️超详细的FFmpeg安装及简单使用教程❤️
|
程序员 编译器 C语言
【c语言】c语言转义字符详解
【c语言】c语言转义字符详解
1397 1
|
人工智能 安全 机器人
科技云报到:洞见2025年科技潮流,技术大融合开启“智算时代”
科技云报到:洞见2025年科技潮流,技术大融合开启“智算时代”
311 12
|
关系型数据库 MySQL 数据库
MySQL事务隔离级别及默认隔离级别的设置
在数据库系统中,事务隔离级别是一个关键的概念,它决定了事务在并发执行时如何相互隔离。MySQL提供了四种事务隔离级别,每种级别都解决了不同的并发问题。本文将详细介绍这些隔离级别以及MySQL的默认隔离级别。
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
开发工具 开发者 git
「Mac畅玩鸿蒙与硬件4」鸿蒙开发环境配置篇4 - DevEco Studio高效使用技巧
本篇将进一步介绍如何在 DevEco Studio 中高效使用各种功能,通过掌握快捷键、代码补全、调试工具等,帮助开发者在鸿蒙应用开发中大幅提升工作效率。
646 1
「Mac畅玩鸿蒙与硬件4」鸿蒙开发环境配置篇4 - DevEco Studio高效使用技巧
|
算法 Java 数据处理
Java中MD5加密算法的实现
Java中MD5加密算法的实现
|
存储 消息中间件 NoSQL
Redis为什么会这么快?Redis到底有多快?【大厂经典面试题】
Redis为什么会这么快?Redis到底有多快?【大厂经典面试题】
1051 1
|
机器学习/深度学习 自然语言处理 算法
AIGC技术的核心算法与发展趋势
【7月更文第27天】随着人工智能技术的迅速发展,AIGC技术已经逐渐成为内容创造领域的一个重要组成部分。这些技术不仅能够帮助人们提高工作效率,还能创造出以往难以想象的新颖内容。本文将重点介绍几种核心算法,并通过一个简单的代码示例来展示如何使用这些算法。
535 7
|
存储 缓存 NoSQL
Redis从入门到精通之底层数据结构SDS(简单动态字符串)详解
SDS是Redis中的一种字符串类型,它是一种二进制安全的字符串,由简单动态字符串(SDS)实现。SDS支持多种数据结构,其中字符串(String)是最常用的一种数据结构之一。SDS的优点在于它可以避免C字符串常见的问题,比如缓冲区溢出和内存泄露等。SDS的常数复杂度获取字符串长度和杜绝缓冲区溢出可以避免使用strlen和strcat函数时的一些问题。同时,SDS的空间预分配和惰性空间释放两种策略可以减少修改字符串的内存重新分配次数。SDS也是二进制安全的,因为它不是以空字符串来判断字符串是否结束,而是以len属性表示的长度来判断字符串是否结束。SDS还兼容部分C字符串函数
3778 86