今天我们来聊一聊最近很火的一门技术叫 WebAssembly ,WebAssembly 作为一项新的技术自2015年诞生之初就逐渐开始受到人们的关注那么究竟什么是 WebAssembly ?它是一门新的编程语言吗?它跟虚拟机又有怎样的关系呢?它有着怎样的用场景呢?
接下来就让我一一来回答这些问题,首先WebAssembly 是一种新的字节码格式,下图就是 WebAssembly 的字节码格式。
![](https://img.haomeiwen.com/i28869077/292b9ca227d337b0.png)
字节码翻译成英文就是 bytecode;我们将字节码格式这五个字拆分成两部分来看,首先是字节码,那么既然提到了字节它的表现形式呢自然就是二进制形式的一连串数据;比如呢,这里我们随便给出一段数据。
00 61 73 6D 01 00 00 00
我们再来看另外一部分格式,我们刚刚随便给出了一串以16进制形式表示的二进制数据,这段数据的的确是一段符合规范的最短的且有效的 WebAssembly 格式的数据;那么我们怎么证明这段数据就是一段合格的 WebAssembly 格式数据呢?这里就需要通过 WebAssembly 规范中规定的二进制格式来判断;来对这段数据进行相应的格式验证,WebAssembly 的字节码格式,非常利于宿主平台的解析和执行,比如V8引擎中的 Liftoff 和 TurboFan 编译器。
但却并不利于开发人员间接对该格式的具体组成结构和内容进行分析,因此 WebAssembly 规范中又规定了与其字节码格式相对应的一种可读文本格式即WAT。
![](https://img.haomeiwen.com/i28869077/94b1f26dc5d7d4d2.png)
可以看到通过对这种由具有详细语义的符号和一定的语法格式组成的文本进行阅读,开发者便可以直观地理解这段 WebAssembly 字节码中所实现的具体内容与功能。综上所述,再回到我们之前的话题 WebAssembly 是一门新的编程语言吗?从传统我们对编程语言的定义上来看,它其实并不是一种编程语言而是一种编译器的编译目标。
![](https://img.haomeiwen.com/i28869077/e0c1fa50232553d1.png)
但从某种程序上来看 WebAssembly 字节码格式对应的可读文本格式 WAT,又由于其有这相对独立的语义关键字和语法结构,我们也可以称它是一种低层级的编程语言,而这里我们讲的低层级是指,该编程语言所具有的语法表现形式更加贴近硬件本身的执行逻辑;而不是那种我们常见的 抽象的,那种人们可以直接直观理解的高级编程语言表达形式,比如我们常见的 Python 或者 JavaScript。
其次我们再来看看 WebAssembly 与虚拟机又有这这样的关系,举一个简单的例子大家都可以很能够直观的了解到它们两个之间的关系了。对 Java 语言稍微有所了解的同学应该知道,一个简单的 Java 应用程序最后是以 Java 字节码的形式被运行在 JVM 中,也就是我们常说的 Java 虚拟机中。
那么同样的我们之前曾提到过 WebAssembly 是一种新的字节码格式,那么如果我们想要执行这种字节码格式所对应的二进制代码,是不是也同Java字节码一样需要一种可以解释执行 WebAssembly 字节码的虚拟机呢?答案是没错的。WebAssembly 被设计成了一种抽象虚拟机的字节码格式;所谓抽象虚拟机是指,组成这些字节码的各种指令和语法结构设计并不依赖具体的虚拟机体系类型,或者说与这些具体的虚拟机体系类型无关。比如我们常说的 X86 架构或者 ARM 架构。
WebAssembly 字节码需要被对应的系统上实现的具体的虚拟机程序来解析和执行,比如 WebAssembly 诞生所在的 Web 平台。以 Chrome 为例其内部的V8引擎便是一个 WebAssembly 字节码的实际执行环境。
![](https://img.haomeiwen.com/i28869077/465500af51031986.png)
V8 引擎根据 WebAssembly 规范来分析字节码的实际组成结构,然后将其转换成对应的宿主平台相关的机器码然后再执行;再比如 WVM 它是一个专门用于 WebAssembly 的独立的虚拟机实现环境,该虚拟机可以在 Windows 或者 类 Unix 系统上直接解析执行 WebAssembly 字节码的二进制指令,并间接于操作系统进行交互。所以总结来看 WebAssembly 是一种抽象虚拟机的字节码规范,这种字节码类的二进制代码可以在对应的符合该抽象虚拟机规范的具体平台的虚拟机实现上来解析执行,那么最后我们再来看看在现阶段四大浏览器已经支持的 MVP(即最小可用版本标准) 下 WebAssembly 又有着怎样的应用场景。
![](https://img.haomeiwen.com/i28869077/b51a2ab1d0d7d718.png)
由于 WebAssembly 本身字节码的特性,当应用构建在 Web 平台上时 WebAssembly 字节码的执行效率在大多数情况下会远远高于实现了同样功能的 JavaScript 代码,因此我们可以选择性地将 WebAssembly 应用在 Web端上的视频、音频、图像编解码,AI深度学习、机器学习的训练与计算过程以及需要多端统一的一些计算与渲染过程上,除此之外由于 WebAssembly 的相关工具链比如 emscripten、LLVM 等的赋能,使得WebAssembly的另一个重要的应用场景,就是可以将历史上已有的各种优秀的 C/C++ 甚至 Rust 的代码库直接无痛的迁移到 WebAssembly 字节码,并同时与其在多个平台和环境中,比如我们常见的一些编解码库、算法库、加密解密库甚至是游戏引擎等。
![](https://img.haomeiwen.com/i28869077/8d68c37445d01240.png)
网友评论