带你了解 WebAssembly 的发展、应用与开发
一、WebAssembly 是什么?
“WebAssembly(缩写为 Wasm)是一种基于堆栈式虚拟机的二进制指令集。Wasm 被设计成为一种编程语言的可移植编译目标,并且可以通过将其部署在 Web 平台上,以便为客户端及服务端应用程序提供服务”
以上是 wasm 官网给出的一段解释。它运行在虚拟机中,执行的指令是虚拟指令,与汇编代码十分相似。WebAssembly 的名字可能也是由此而来(汇编语言的英文:Assembly)

通俗的讲,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 等史诗级项目。

第二个问题,2008 年 Google 推出 JavaScript 引擎 V8,使用 JIT 技术,使得 Web 性能得到了数十倍的增长。但 Web 性能还是被挑战!
- 由于 DOM 渲染和 JavaScript 执行相互独立,单线程导致 DOM 渲染阻塞 JavaScript 执行;
- 由于 JavaScript 是动态弱类型语言,而不像 C/C++ 这类静态强类型语言,JIT 优化效率有限;
为了进一步优化 JIT 效率,浏览器鼻祖 Mozilla 推出了 asm.js,随后 Google、Microsoft、Apple 都觉得 asm.js 的思路不错,于是联合起来,一同共建 WebAssembly 生态。

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 包进行支持。

四、应用场景有哪些?
初期,主要用于浏览器性能敏感模块的实现,如复杂的界面渲染、游戏引擎、地图渲染,数学计算等。
过去几年发展很快,除了浏览器中可以跑,后端(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 相关的创业公司:


五、如何使用 WebAssembly 进行开发
目前较为常见的是将 C/C++ 代码或者是 Rust 代码转为 wasm 文件,另外也支持 Go 等语言。



参考:
- WebAssembly 中文网
- 《8个WebAssembly 应用案例》
- 《为什么说 WASM 是 Web 的未来》
- 《WebAssembly 用在了哪里?18个激动人心的 Wasm 初创公司》
- 《恕我直言,90% 的应用场景都不需要用WebAssembly!》
带你了解 WebAssembly 的发展、应用与开发的更多相关文章
- 三本书带您快速深入掌握Spring Boot应用开发《Spring Boot从零开始学(视频教学版)》
#好书推荐##好书奇遇季#三本书带您快速深入掌握Spring Boot应用开发<Spring Boot从零开始学(视频教学版)><Spring Boot应用开发实战><深 ...
- 带你领略Linux系统发展及版本更迭
Linux的出现是在1991年,Linus Torvalds的学生开发的,最初的Linux是类似Unix操作系统,可用于386,486或奔腾处理器的计算机上.Linus Torvalds是一个伟人,他 ...
- Android发展演变与开发环境搭建
本人也算是一名比较会玩的Android手机用户,常常关注Android发展的最新情况,并且每年都会熬夜看谷歌的I/O大会,总会第一时间刷入最新的Android版本.接下来简单谈一下Android版本的 ...
- 一文带你快速入门 Go 语言微服务开发 - Dubbo Go 入门实践总结
更多详细示例可直接访问 Dubbo 官网 或搜索关注官方微信公众号:Apache Dubbo 1. 安装Go语言环境 建议使用最新版 go 1.17 go version >= go 1.15 ...
- WebAssembly学习(一):认识WebAssembly
WebAssembly作为一门新兴起的技术,在 JavaScript 圈非常的火!人们都在谈论它多么多么快,怎样怎样改变 Web 开发领域,被各大巨头所推广,这篇文章对其做一个简单的了解认识,本文非原 ...
- .NET开发者的机遇与WebAssembly发展史(有彩蛋)
一.唠唠WebAssembly的发展历程 目前有很多支持WebAssembly的项目,但发展最快的是Blazor,这是一个构建单页面的.NET技术,目前已经从Preview版本升级到了beta版本,微 ...
- WebAssembly是解决JavaScript 痼疾的银弹?
写在前面 <没有银弹>是 Fred Brooks 在 1987 年所发表的一篇关于软件工程的经典论文.该论文的主要论点是,没有任何一项技术或方法可以能让软件工程的生产力在十年内提高十倍. ...
- [转贴] 软件测试职业发展的 A 面和 B 面
[转贴] 软件测试职业发展的 A 面和 B 面 1.所谓的软件测试技术到底包含什么? 梅子:我先来从传统意义上来谈一下测试技术,主要就是测试分析,测试设计,测试管理,测试执行,自动化测试技术,专项测试 ...
- WebAssembly 介绍
http://blog.csdn.net/zhangzq86/article/details/61195685 WebAssembly 的出现是不是意味着 Javascript 要完? https:/ ...
- WebAssembly,Web的新时代
在浏览器之争中,Chrome凭借JavaScript的卓越性能取得了市场主导地位,然而由于javascript的无类型特性,导致其运行时消耗大量的性能做为代价,这也是JavaScript的瓶颈之一.W ...
随机推荐
- 基于GNU ARM Eclipse的集成环境搭建
背景 老师送给我的STM32的板子不小心给我坏了,现在疫情还没过去,为了复习巩固stm32有关的移植,只能先玩玩仿真了. 我们在这一讲主要以搭建环境为主. host平台 :Ubuntu 16.04 G ...
- FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
<FFmpeg开发实战:从零基础到短视频上线>一书的"3.4.3 把原始的H264文件封装为MP4格式"介绍了如何把H.264裸流封装为MP4文件.那么在网络上传输 ...
- c语言之位段
百度百科链接 示例: 1 struct CHAR 2 { 3 unsigned int ch : 8; //8位 4 unsigned int font : 6; //6位 5 unsigned in ...
- Math.random()方法的使用及公式
条件1:取n-m范围的随机数(不包含m) 公式1:(int)(Math.random() * (m - n) + n); 条件2:取n-m范围的随机数(包含m) 公式2:(int)(Math.rand ...
- C# 日期帮助类
using System; using System.Data; namespace Erp.Ship.Tool { [Serializable] public enum DateInterval { ...
- python执行shell并获取结果
在Python中执行Shell命令并获取其结果,通常可以使用subprocess模块.这个模块允许我们启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码.下面是一个详细的示例,展示了如 ...
- 洛谷P1451
背景:复习 简单的dfs,也可以说是有点像连通块 #include<iostream> #include<utility> using namespace std; typed ...
- 万维网WWW
万维网是一个大规模的联机式信息储存场所,能方便地从一个网络站点访问另一个网络站点.万维网是一个分布式的超媒体系统. 统一资源定位符URL URL表示从互联网上得到的资源位置和访问这些资源的方法,实际上 ...
- SQL Server AdventureWorks示例数据库
SQL Server AdventureWorks2008R2 数据字典 AdventureWorks2008R2示例数据库下载 AdventureWorks2008R2数据字典(官网) Addres ...
- 关于IE11点击的select框需要点击两次才能展开option选择框
需求:select是一个级联选择框,点击select框之后向后台请求,然后把请求的数据展示出来. 问题:绑定onclick或者onfocus的时候,需要点击select框两次,才能将option选择框 ...