带你了解 WebAssembly 的发展、应用与开发

news/2024/11/15 15:49:19/文章来源:https://www.cnblogs.com/wxxweb/p/18379864

一、WebAssembly 是什么?

“WebAssembly(缩写为 Wasm)是一种基于堆栈式虚拟机的二进制指令集。Wasm 被设计成为一种编程语言的可移植编译目标,并且可以通过将其部署在 Web 平台上,以便为客户端及服务端应用程序提供服务”

以上是 wasm 官网给出的一段解释。它运行在虚拟机中,执行的指令是虚拟指令,与汇编代码十分相似。WebAssembly 的名字可能也是由此而来(汇编语言的英文:Assembly)

image

通俗的讲,WebAssembly 是除 JavaScript 之外另一门可以在浏览器上运行的语言,其他语言(如 C/C++/Rust)也可以被编译成 WebAssembly 在浏览器上运行。WebAssembly 是静态类型的语言,可以以“接近原生”的速度运行代码。

  • 2015 年 Mozilla 发布 WebAssembly 项目,随后 Google、Microsoft、Apple 等各大主流的浏览器厂商均大力支持;
  • 2018 年 WebAssembly 第一个规范草案诞生;
  • 2019 年成为 W3C 国际标准,成为与 HTML、CSS 和 JavaScript 并列的唯四前端技术;
  • 2022 年 Docker 对 WebAssembly 提供支持;

二、为什么需要 WebAssembly?

WebAssembly 的出现,是为了解决 JavaScript 性能底下的问题!

随着 JavaScript 被广泛的应用,它也暴露了很多问题:

  • 语法太灵活导致开发大型 Web 项目困难;
  • 性能不能满足一些场景的需要;

这两大问题成为 JavaScript 头顶上的达摩克利斯之剑,危及着 JavaScript 更广泛的应用。

第一个问题,被微软的 TypeScript 解决了!微软利用 TypeScript 这把锋利的武器打造了 VSCode 等史诗级项目。

image

第二个问题,2008 年 Google 推出 JavaScript 引擎 V8,使用 JIT 技术,使得 Web 性能得到了数十倍的增长。但 Web 性能还是被挑战!

  1. 由于 DOM 渲染和 JavaScript 执行相互独立,单线程导致 DOM 渲染阻塞 JavaScript 执行;
  2. 由于 JavaScript 是动态弱类型语言,而不像 C/C++ 这类静态强类型语言,JIT 优化效率有限;

为了进一步优化 JIT 效率,浏览器鼻祖 Mozilla 推出了 asm.js,随后 Google、Microsoft、Apple 都觉得 asm.js 的思路不错,于是联合起来,一同共建 WebAssembly 生态。

image

WebAssembly 最大的优点是,可以大幅度提升 Web 应用的性能,执行速度和 C/C++ 原生应用在一个数量级,据称优化后可以达到 C 语言程序 70% 的速度。

WebAssembly 的高性能、轻量和跨平台,使得我们可以将 C/C++ 等语言运行在 Web,也可以将桌面端应用跑在 Web 容器。

三、浏览器兼容性

参见 https://developer.mozilla.org/zh-CN/docs/WebAssembly#浏览器兼容性

  • Firefox 52+;
  • Chrome 57+;
  • Edge 16+;
  • Safari 11+;
  • Node 8+;

另外,微信小程序基础库版本从 2.13.0 开始,通过 WXWebAssembly 对象对集成的 wasm 包进行支持。

image

四、应用场景有哪些?

初期,主要用于浏览器性能敏感模块的实现,如复杂的界面渲染、游戏引擎、地图渲染,数学计算等。

过去几年发展很快,除了浏览器中可以跑,后端(Node.js)也可以跑,在终端设备、移动设备、物联网及云原生上都有广阔的应用场景。

  • Figma 文件读取;

  • Magnum 跨平台的 OpenGL 图形引擎;

  • Google 3D 地图;

  • eBay 的条形码扫描仪;

  • AutoCAD 网页版;

  • Photoshop 网页版;

  • Web-DSP 在浏览器上运行的多媒体影音处理函数库;

  • Unity 的 Web 游戏引擎;

  • Egret Engine H5 游戏引擎;

  • Disney+ 应用程序开发工具包;

  • 微软的飞行模拟器有一个基于 WebAssembly 的插件系统;

  • 网页版 Windows 2000;

  • Blazor 让 .NET 代码在浏览器运行;

  • Walt 用 JavaScript 语法快速开发原生应用;

  • 还包括语言检测、音频混合、视频编解码、数字信号处理、医学影像、物理模拟、加解密、压缩、数学计算等领域;

18个 WebAssembly 相关的创业公司:

image

image

五、如何使用 WebAssembly 进行开发

目前较为常见的是将 C/C++ 代码或者是 Rust 代码转为 wasm 文件,另外也支持 Go 等语言。

image

image

参见:WebAssembly 中文网

image

参考:
  • WebAssembly 中文网
  • 《8个WebAssembly 应用案例》
  • 《为什么说 WASM 是 Web 的未来》
  • 《WebAssembly 用在了哪里?18个激动人心的 Wasm 初创公司》
  • 《恕我直言,90% 的应用场景都不需要用WebAssembly!》

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

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

相关文章

Nuxt3读取markdown文件

背景 想在Nuxt3中读取markdown以渲染文章。 分析 静态文件一般是放在public中的,但是官方文档中写明:而且,在SSR阶段(服务器渲染),nuxt无法通过fetch来访问public里的内容(虽然不推荐,但是客户端的js是可以通过fetch直接请求到文件的)。 过程 nuxt提供了一个content模…

Easysearch 性能测试方法概要

INFINI Easysearch INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 衍生自基于开源协议 Apache 2.0 的 Elasticsearch 7.10 版本,完善和支持更多的企业级功能,优化搜索业务场景,以保证更佳的数据探索与分析体验。 Ea…

简单的内存取证

记录一次内存取证;练习还是学到了很多东西!继续加油!工具: volatility2.6 + gimp 使用插件 mimikatz 看看账户和密码 python2 vol.py --plugins=/plugins/ -f baby_misc.raw --profile=Win7SP1x64 mimikatz​​ 然后再使用 filescan 插件扫描一下可疑的文件 python2 vol.py…

【复习失败-bp出问题了】【漏洞复现】DouPHP(CVE-2024-7917、代码分析xss)漏洞复现

https://mp.weixin.qq.com/s/YccEe85xFiZIZGOPQLABkA DouPHP(CVE-2024-7917、代码分析xss)漏洞复现 原创 LULU 红队蓝军 2024年08月23日 18:01 四川 漏洞介绍 漏洞:CVE-2024-7917 介绍:DouPHP 1.7_Release_20220822版本中存在一个远程代码执行(RCE)漏洞。拥有管理员权限的…

【简易学生管理系统】java版(内附完整源码)

源代码附在文章末尾注意:代码中定义了Student和User两个类,最初的登录操作对应User,之后才是对Student信息的增删改查。代码中对大部分用户键入都进行了校验,校验规则如下 用户名: 长度在3~15位 只能是数字和字母的组合不能都是数字 用户名已存在,无法注册手机号: 长度1…

[Datawhale AI 夏令营] Task1: 跑通YOLO方案baseline

环境配置厚德云 RTX 4090 image-gpu-pytorch_20240807运行 apt install git-lfs git lfs install git clone https://www.modelscope.cn/datasets/Datawhale/AI_Camp5_baseline_CV.git提交结果

如何快速对影像进行分幅?

GIS数据转换器的"分割转换"功能,可以根据用户设定的像素大小将一幅大影像分割成若干小尺寸的影像。下面是详细的使用步骤:方法/步骤1. 数据准备支持tif、img、bmp文件格式。 2. 软件下载与安装从GeoSaaS.COM官网下载并安装 GIS数据转换器,安装完成后桌面上出现”G…

dpdk解析报文协议-基于l2fwd

dpdk解析报文协议-基于l2fwd 0 前置条件 1、这里需要两台虚拟机,配置了相同的虚拟网络,可以通过tcpreplay在一台虚拟机回放报文,在另一台虚拟机通过tcpdump -i 网卡名 捕获到。具体配置可参考https://www.jb51.net/server/2946942fw.htm2、需要dpdk环境配置完成 3、大致了解…

引用类型和值类型(一)

引用类型和值类型(一) 关于引用类型和值类型的区别经常听到这样一个说法:“值类型分配在栈上,引用类型分配在堆上”。这个回答并不完全正确,或者说这不是值类型和应用类型真正的差别。官方文档给出的定义:引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包…

修改SpringBoot的配置文件application.yaml后启动失败

经常碰到修改application.yaml文件之后,SpringBoot项目启动失败的,报错信息如下 Connected to the target VM, address: 127.0.0.1:7105, transport: socket 21:12:59.122 [main] DEBUG org.springframework.boot.context.logging.ClasspathLoggingApplicationListener - App…

mac 隐藏文件显示 快捷键

用户》macmac 是电脑自己的名字

【信息收集】 SSH指纹

原创 儒道易行一、 SSH指纹 首次通过SSH连接一台服务器时,SSH服务返回其指纹信息,如果确认指纹信息无误,该指纹将保存到~/.ssh/know_hosts中, 服务器IP与指纹一一对应;第二次访问SSH服务时,SSH客户端将对比返回的指纹与~/.ssh/know_hosts是否一致,一致就顺利连接,否则警…