将GC编程语言引入WebAssembly的新方法

本文讨论了一种名为 WasmGC 的新方法,用于将垃圾收集编程语言有效地引入 WebAssembly。

WasmGC 定义了新的 GC 类型,例如结构和数组,与之前编译为线性内存的方法 (WasmMVP) 相比,它们可以实现更好的优化:

  • 在编译时和运行时进行优化,例如间接调用的推测内联。性能测量结果表明,推测性内联可使编译后的 Java 代码显著提速 30%。
  • WasmGC 比 WasmMVP 更可优化,因为它在更高级别上运行,跟踪对象引用。
  • 虽然 WasmGC 可能需要在某些语言的语义上做出妥协,但它可以提供更小的代码大小和更好的性能等好处。
  • WasmGC 现在已成为一种标准,并在浏览器中得到支持,从而实现了在 WebAssembly 中实现语言的新方法,并且具有比传统编译器方法更好的性能潜力。

Java、Kotlin、Dart、Python 和 C# 等 GC 语言移植到 Wasm 主要有两种方法:

  • WasmMVP:“传统”移植方法,即将该语言的现有实现编译为 WasmMVP,即 2017 年推出的 WebAssembly 最小可行产品。
  • WasmGC:其中语言被编译为 Wasm 本身的 GC 构造,这些构造在最近的 GC 提案中定义。

WasmMVP通常如何移植到新硬件架构?
比如说Python想要运行在ARM架构上,或者Dart想要运行在MIPS架构上。总体思路是将虚拟机重新编译为该架构。
除此之外,如果虚拟机具有特定于体系结构的代码,例如即时 (JIT) 或提前 (AOT) 编译,那么您还可以为新体系结构实现 JIT/AOT 后端。

Wasm 是一个低级编译器目标,因此可以使用传统的移植方法也就不足为奇了。自从 Wasm 首次启动以来,我们在许多情况下都在实践中看到了这种效果,例如用于 Python 的 Pyodide和用于 C# 的 Blazor(请注意,Blazor 支持[AOT](https://learn.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/webassembly?view=aspnetcore-7.0ahead-of-time-aot-compilation)和JIT编译,因此它是上述所有内容的一个很好的示例)。

在所有这些情况下,该语言的运行时被编译为 WasmMVP,就像编译为 Wasm 的任何其他程序一样,因此结果使用 WasmMVP 的线性内存、表、函数等。它很有意义,因为您可以重用几乎所有现有的 VM 代码,包括语言实现和优化。

然而事实证明,这种方法有几个 Wasm 特有的缺点,而这正是 WasmGC 可以提供帮助的地方。

WasmGC 移植新方法
简而言之,WebAssembly 的 GC 提案(“WasmGC”)允许您定义结构体和数组类型并执行操作,例如创建它们的实例、读取和写入字段、在类型之间进行转换等。(有关更多详细信息,请参阅提案概述)。

这些对象由 Wasm VM 自己的 GC 实现来管理,这是该方法与传统移植方法之间的主要区别。

如果传统的移植方法是将一种语言移植到一种架构,那么 WasmGC 方法与如何将一种语言移植到一个虚拟机非常相似。
例如,如果您想将 Java 移植到 JavaScript,那么您可以使用像J2CL这样的编译器,它将 Java 对象表示为 JavaScript 对象,然后这些 JavaScript 对象就像所有其他对象一样由 JavaScript VM 管理。

现在我们已经了解了 GC 语言的两种移植方法是什么,让我们看看它们如何比较。

运送内存管理代码
WasmGC 让虚拟机自动为我们管理内存,因此我们在Wasm 中根本不需要malloc/free内存管理代码,既不需要 GC,也不需要内存管理代码。

循环收集
在浏览器中,Wasm 经常与 JavaScript 进行交互(并通过 JavaScript 与 Web API 进行交互),但在 WasmMVP 中(甚至在引用类型提案中),Wasm 和 JS 之间无法建立双向链接,从而无法以细粒度的方式收集循环。指向 JS 对象的链接只能放在 Wasm 表中,而指向 Wasm 的链接只能将整个 Wasm 实例作为一个单独的大对象来引用。这不足以有效地收集特定的对象周期,其中一些恰好位于已编译的 VM 中,一些位于 JavaScript 中。

而使用 WasmGC,我们定义了 VM 可以识别的 Wasm 对象,因此我们可以在 Wasm 和 JavaScript 之间进行正确的引用。

堆栈上的 GC 引用
目前,只有 WasmGC 可以无开销地处理堆栈引用,并且由于 Wasm VM 负责 GC,因此它完全自动执行此操作。

GC效率
一个相关的问题是执行 GC 的效率。在这方面,两种移植方法都有潜在的优势。传统的移植方式可以重复使用现有虚拟机中的优化功能,这些优化功能可能是为特定语言量身定做的,例如重点优化内部指针或短寿命对象。

另一方面,在Web上运行的 WasmGC 移植的优势在于,它可以重复使用所有为使 JavaScript GC 快速而做的工作,包括生成 GC、增量收集等技术。WasmGC 还将 GC 交给虚拟机处理,从而简化了高效写入障碍等工作。

WasmGC 的另一个优势是,GC 可以感知内存压力等情况,并相应地调整堆大小和收集频率,这与 JavaScript 虚拟机在网络上的做法如出一辙。

内存碎片
随着时间的推移,特别是在长期运行的程序中,对 WasmMVP 线性内存进行 malloc/free 操作可能会导致内存碎片。

这种碎片化会迫使 Wasm 模块更频繁地增长内存,从而增加开销,并可能导致内存不足错误;目前正在设计改进措施,但这是一个具有挑战性的问题。这是所有 WasmMVP 程序都会遇到的问题,包括传统的 GC 语言移植(注意,GC 对象本身可能是可移动的,但运行时本身的部分却不是)。

而 WasmGC 则避免了这一问题,因为内存完全由虚拟机管理,虚拟机可以移动它们来压缩 GC 堆,避免碎片化。

开发工具集成
在传统的 WasmMVP 移植中,对象被放置在线性内存中,开发工具很难提供有用的信息,因为这些工具只能看到字节,而没有高级类型信息。

而在 WasmGC 中,虚拟机管理 GC 对象,因此可以更好地集成。例如,在 Chrome 浏览器中,您可以使用堆剖析器来测量 WasmGC 程序的内存使用情况

语言语义
在 WasmGC 中,我们定义了新的 GC 类型--结构体和数组--并编译成它们。因此,我们不能简单地将用 C、C++、Rust 或类似语言编写的虚拟机编译成这种形式,因为这些语言只能编译成线性内存,所以 WasmGC 无法帮助绝大多数现有的虚拟机代码库。在 WasmGC 移植中,您通常需要编写新代码,将您的语言结构转换为 WasmGC 基元。

https://www.jdon.com/69581.html

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

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

相关文章

点云从入门到精通技术详解100篇-基于三维点云的机器人抓取位姿检测(续)

目录 3.2 目标点云的预处理 3.2.1 直通滤波 3.2.2 体素降采样 3.2.3 剔除支撑平面 3.2.4 剔除离群点

MongDB 的安装 无废话

MongDB 的安装 1 安装 MongDB https://www.mongodb.com/try/download/community-kubernetes-operator 这里我们选择 ZIP 解压到文件夹 创建 data 文件 在 data 文件夹里面创建 db 和 logs 文件夹 进入 bin 目录 输入 cmd 回车 2 启动 MongDB 输入启动命令 mongod --dbpath..\…

csapp bomb lab part4

csapp bomb lab part4 phase 5 是一个循环,不断累加,访问的地址基于0x4024b0, phase 6 之后更新 汇编 地址计算 寄存器 cl 是 x86 汇编语言中的一个 8 位寄存器,它是 ecx 寄存器的低位部分。 具体来说,x86 架构中的寄存器可…

centos7中多版本go安装

安装go的方式 官网下载tar.gz包安装 # 1.下载tar包 wget https://go.dev/dl/go1.18.1.linux-amd64.tar.gz # 2.解压tar包到指定路径 tar -xvf go1.18.1.linux-amd64.tar.gz -C /usr/local/go1.18 # 3.配置环境变量,打开 /etc/profile 文件添加以下文件每次开机时…

详解 SpringMVC 的 HttpMessageConverter

文章目录 前言参考资料内容1、[RequestBody ](/RequestBody )2、RequestEntity3、[ResponseBody ](/ResponseBody )4、SpringMVC处理json5、SpringMVC处理ajax6、RestController注解7、ResponseEntity 推荐读物 《Spring Boot微服务实战(第2版)》内容简介目录 前言 HttpMessag…

logback-spring自定义日志配置

配置文件命名为logback-spring.xml。 <?xml version"1.0" encoding"UTF-8"?> <configuration debug"true"><!--用springProperty来配置的话&#xff0c;可以直接读取properties文件--><!-- <springProperty scope…

笔记本360wifi,wifi共享大师掉线,

笔记本上搭建的wifi热点&#xff0c;例如360wifi、wifi共享大师等&#xff0c;手机连接wifi后总是隔一段时间掉线。原因:网卡驱动和无线驱动有问题&#xff0c;需要更新或换成稳定的网卡驱动和无线驱动。 解决方案: ① 安装驱动精灵: ②点击驱动管理 ③ ④ ⑤进行阻止windo…

iOS自动化测试方案(四):保姆级搭建iOS自动化开发环境

文章目录 一、基础环境准备1.1、MacOS虚拟机 二、iPhone虚拟机三、MacOS虚拟机连接iphone真机四、扩展&&问题4.1、如果appium启动app失败&#xff0c;可能是appium driver没有安装xcuitest插件4.2、下载并安装Appium服务端&#xff0c;inspector元素定位器4.3、下载app…

贝锐向日葵亮相阿里云“云栖大会”:独创专利算法赋能全新云桌面

2023年10月31日-11月2日&#xff0c;一年一度的云栖大会如期举办&#xff0c;国产远程连接服务创领者贝锐受邀参与。活动现场&#xff0c;贝锐CTO张小峰进行了分享&#xff0c;宣布贝锐旗下国民级远程控制品牌“贝锐向日葵”与无影展开合作&#xff0c;同时全新的“云桌面”将于…

数据结构:AVL树讲解(C++)

AVL树 1.AVL树的概念2.平衡因子3.节点的定义4.插入操作5.旋转操作&#xff08;重点&#xff09;5.1左单旋5.2右单旋5.3左右双旋5.4右左双旋 6.一些简单的测试接口7.完整代码 1.AVL树的概念 普通二叉搜索树&#xff1a;二叉搜索树 二叉搜索树虽可以缩短查找的效率&#xff0c;但…

安装MySQL时出现 由于找不到 MSVCR120.dll,无法继续执行代码。重新安装程序可能会解决此问题。

--------------------------- mysqld.exe - 系统错误 --------------------------- 由于找不到 MSVCR120.dll&#xff0c;无法继续执行代码。重新安装程序可能会解决此问题。 --------------------------- 确定 --------------------------- 安装MySQL时出现 “This appl…

分布式服务框架设计

目录 服务框架的设计 服务框架的功能 服务框架的性能指标 服务治理需要哪些功能 服务框架的设计 尽管不同的分布式服务框架实现细节存在差异&#xff0c;但是核心功能差异不大&#xff0c;下面的架构图描绘了一个分布式服务框架的整体逻辑架构 总共分为 3 层&#xff1a;1…

Ansible自动化安装部署及使用

目录 前言 一、环境概况 修改主机名&#xff08;可选项&#xff09; 二、安装部署 1.安装epel扩展源 2.安装Ansible 3.修改Ansible的hosts文件 4.生成密钥 三、Ansible模块使用介绍 Command模块 Shell模块 User模块 Copy模块 File模块 Hostname模块 Yum模块 Ser…

Ubuntu重启后进入initramfs导致无法开机解决方案

今天&#xff0c;我的电脑意外关机&#xff0c;重新开机后打开了虚拟机。该虚拟机使用的是 Ubuntu 22.04 系统。但重启后&#xff0c;系统一直显示(initramfs):&#xff0c;导致无法正常启动。最后&#xff0c;在网上查找了一些解决方案&#xff0c;成功解决了这个开机问题。在…

圣杯布局/双飞翼布局/flex/grid等,实现CSS三栏自适应布局的几种方法

简介 三栏布局是网页设计中常用的布局&#xff0c;即网页中的内容被分为三块&#xff1a;左侧/中间/右侧。其中两侧部分宽度固定&#xff0c;中间部分宽度自适应的根据浏览器宽度撑满剩余空间。而三栏布局也有很多变形&#xff0c;比如两栏或者N栏布局&#xff0c;上中下三栏布…

Linux shell编程学习笔记21:用select in循环语句打造菜单

一、select in循环语句的功能 Linux shell脚本编程提供了select in语句&#xff0c;这是 Shell 独有的一种循环语句&#xff0c;非常适合终端&#xff08;Terminal&#xff09;这样的交互场景&#xff0c;它可以根据用户的设置显示出带编号的菜单&#xff0c;用户通过输入不同…

爱德华的台灯真的好用?爱德华、书客、好视力护眼台灯对比测评

如今孩子近视的比例越来越大&#xff0c;而且时间越来越提前&#xff0c;一些上小学的孩子开始近视佩戴眼镜。其实造成近视的原因不外乎作业坐姿不标准&#xff0c;学业时间太长缺少户外的运动&#xff0c;也包括可能灯光光源的问题造成对于视力的影响。如果希望孩子有一个较好…

MATLAB算法实战应用案例精讲-【图像处理】计算机视觉(最终篇)

目录 知识储备 线阵相机调试 1.相机型号参数 2.相机软件安装 3.编码器连接方式 4.采集卡说明

3.26每日一题(线性非齐次的特解如何设)

1、非齐次方程有e的2x次幂&#xff1a;特解也有e的2x次幂 2、e的2x次幂前面有特殊的一元方程&#xff1a;特解要设为一般的特征方程&#xff08;axb&#xff09; 3、求线性齐次特征方程的特征根&#xff1b; 4、判断e的 rx 次幂中的 r 和特征根有没有重合的个数&#xff1a;…

【每日一题】数组中两个数的最大异或值

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;哈希集合 其他语言python3 写在最后 Tag 【哈希集合】【位运算-异或和】【数组】【2023-11-04】 题目来源 421. 数组中两个数的最大异或值 题目解读 找出数组中两个数的最大异或结果。 解题思路 一看数据量达到了 …