初识 WebAssembly

蚀刻阈值
• 阅读 3309

背景

WebAssembly 简称 Wasm,最早起源于前端技术。
即使在有了 JIT 加持之后,js 在大计算量的场景,性能还是不够理想,经过了 asm.js 的尝试,最后以 Wasm 定型,得到了四大浏览器的支持。
最初的 Wasm 主要是应用于 WEB 应用,后续随着 WASI 的诞生,又扩展到了更宽的场景,比如服务端技术。

Wasm 是什么

Wasm 并不是一门常规意义上的语言,而只是一个基于栈式虚拟机的二进制指令标准。
比如,Lua 是一门语言,因为其具有可编程能力,而 Lua 字节码,则几乎不具备可编程能力(一定要手写也不是不可以)。
Wasm 就类似于 Lua 字节码这种位置,只是它更相对更底层一些,适用范围也更广。

Wasm 设计目的,就是成为其他语言的编译目标,目前支持比较好的有 C/Rust 等。

Wasm 如何运行

由于 Wasm 只是一个标准,具体的执行是由虚拟机来完成的,而虚拟机的实现就又有很多个,类似于官方 Lua 与 LuaJIT 这种。
具体的运行方式也有多种:interpreter,JIT,AOT。比较有意思的是,在 Wasm 圈里,似乎 AOT 技术相对其他语言更流行一些。

具体的虚拟机实现细节,我们可以以后再介绍了。

Wasm 的特点

Wasm 有优秀的设计理念,有其明显的优势,不过优势有时候也需要付出一些代价。

高性能

这是 Wasm 的设计初衷之一,是有接近 native 性能的,当然也依赖虚拟机的具体实现。
从指令设计上而言,Wasm 足够底层,简单,所以理论上是可以接近 native 性能的。

内存安全

Wasm 被设计为内存安全的,尤其在 WEB 场景,很多时候执行的代码都不知道来自谁,底层安全是很重要的。
具体而言,Wasm 的内存模型很简单,只有一个 linear memory,Wasm 能操作的内存的读写都发生在这个 memory 范围内。
Wasm 是不会出现指针飞来飞去的,有的只是 offset,目的是恶意的 Wasm 执行的时候,也不可能读写进程内任意的数据内存。

当然咯,代价也是有的,灵活性会有一些折扣,很多时候需要多一次内存拷贝。

沙箱

Wasm 是运行在一个沙箱环境,其所具备的能力是受限的,需要的一些外部调用,是外面的宿主提供给它的。
比如 Wasm 需要读文件,那也是需要运行 Wasm 的宿主环境,给其提供对应的 API 才可以的。

跨语言

跨语言是 Wasm 的一大亮点,依我之见,可以某种程度上的降低语言之争(语言之争,其实也是个蛮有意思的话题,得空可以聊一聊)。

Wasm 作为中间的标准产物,可以对接两头的开发者:

  1. 上层的应用开发者
  2. 底层的服务开发者

底层服务开发者,只需要为其提供运行 Wasm 的沙箱环境,包括运行 Wasm 的虚拟机,以及暴露服务的某些能力在沙箱中。
上层应用开发者,则可以选择自己喜欢的语言,以及对应语言的 Wasm-SDK(对应暴露在沙箱中的服务基础能力)即可生成 Wasm。

理论上是一个美好的方案。

最后

Wasm 也是一种嵌入式的方案,某种程度上跟 Lua 很类似。

依我之见,少年期的 Wasm 还有比较长的一段路要走

  1. 底层的能力还有待增强,比如带 GC 的语言,生成 Wasm 就是一个难题。
  2. 周边生态也有待发展,目前还属于初级阶段,虽然能看到一些设计雏形。
点赞
收藏
评论区
推荐文章
GoCoding GoCoding
3年前
RTSP H264/HEVC 流 Wasm 播放
本文将介绍RTSPH264/HEVC裸流如何于网页前端播放。涉及WebSocket代理发送流数据,Wasm前端解码等。代码:https://github.com/ikuokuo/rtspwasmplayer相关模块:bashRTSPWebSocketProxyRTSP/Webcam/FileFFmpegopenPackets
徐小夕 徐小夕
4年前
2年vue项目实战经验汇总
前言vue作为前端主流的3大框架之一,目前在国内有着非常广泛的应用,由于其轻量和自底向上的渐进式设计思想,使其不仅仅被应用于PC系统,对于移动端,桌面软件(electronjs)等也有广泛的应用,与此诞生的优秀的开源框架比如elementUI,iView,antdesignvue等也极大的降低了开发者的开发成本,并极大的提高了开发效率。笔者最初接触v
Stella981 Stella981
3年前
Golang modules 初探
今天天色刚刚亮起,起床看到golang1.11正式发版了,有着两个重要的特性:modules和WebAssembly。本博文只要说的是modules,从Java转golang的同学肯定是对golang的包管理充满了无奈之情,我也曾在博客中介绍过glide(https://my.oschina.net/u/553243/blog/1475626),也
Stella981 Stella981
3年前
AIOps在美团的探索与实践——故障发现篇
!(https://oscimg.oschina.net/oscnet/up45fc0178edcbec3835316f2c637b1b3f793.JPEG)一、背景AIOps,最初的定义是AlgorithmITOperations,是利用运维算法来实现运维的自动化,最终走向无人化运维。随着技术成熟,逐步确定为Artificial
Stella981 Stella981
3年前
Rust无需安装visual studio即可编译的安装方式
感谢@rz(https://my.oschina.net/dush)提供,编辑器配置完毕,编译测试已经通过,可以安心去鼓捣wasm了。按以下配置可以成功编译:Currentinstallationoptions:defaulthosttriple:x86_64pcwindow
Wesley13 Wesley13
3年前
HTML其他概念
(一)WEB初识【1】浏览器五大主流浏览器开发团队或浏览器内核简称CSS3特定属性(新属性加前缀)Chromewebkit\webkittransformSafariwebkitIEmsFirefoxmozOperao浏览器内核(渲染内核和js内核,前者渲染代码,计算显示方式,进而读取
Wesley13 Wesley13
3年前
Java序列化JSON时long型数值不准确
现象项目中用到了唯一ID生成器.生成出的ID时long型的(比如说4616189619433466044).通过某个rest接口中返回json数据后,发现浏览器解析完变成了4616189619433466000原因大致描述:java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的
初探webAssembly | 京东物流技术团队
本文从为什么需要WebAssembly、WebAssembly的工作原理、哪些语言可用来创建WebAssembly模块、WebAssembly可以用在哪里以及怎么使用几方面简要介绍了webAssembly。如果之前没有了解过webAssembly,可以做一些简要的了解。
给 Web 前端工程师看的用 Rust 开发 wasm 组件实战 | 京东云技术团队
什么是wasm组件?wasm全称WebAssembly,是通过虚拟机的方式,可以在服务端、客户端如浏览器等环境执行的二进制程序。他有速度快、效率高、可移植的特点。对我们Web前端工程最大的好处就是可以在浏览器端使用二进制程序处理一些计算量大的处理,使用他比
京东云开发者 京东云开发者
9个月前
JavaScript 与 Rust 和 WebAssembly 集成
作者:京东物流梁瑞乐偶然一次机会,接触了Rust的代码。当时想给团队小伙伴做演示,发现自己并不能在移动端按照文档生成演示demo。我就想,要是Rust代码能转化成JavaScript就好了。结果一搜,还真有。下面整理成文档,分享给大家。为大家解决问题,多提