前言:今天我们聊一聊最近很火热的技术 webAssembly。webAssbemly 作为一项新的技术,自 2015 年诞生之初,就逐渐受到人们的关注。那究竟什么是 webAssembly ?它是一门新的编程语言吗?它跟虚拟机又有什么样的关系呢?它有着什么样的应用场景呢?接下来就让我们用 5-10分钟的时间来回答这些问题。
一、究竟什么是 webAssembly?
首先 webAssembly 是一种新的字节码格式。翻译成英文就是 byteCode。我们将【字节码格式】这5个字拆成 2部分【字节码 格式】来看。首先是
字节码。
既然提到了字节,它的表现形式自然就是一连串的二进制数据。比如这里我们随便给出一段数据
然后我们再来看另外一部分:
格式。
刚刚我们随意给出了一串以十六进制形式表示的二进制数据。 当然这段数据的的确是一段符合规范的、存在的、最短的、且有效的 webAssembly 格式的数据。 那么我们
怎样能证明这段数据就是一段合格的 webAssmebly 的数据呢?
这里就需要通过 webAssembly 规范中规定的二进制格式来对这段数据进行相对应的格式验证。 webAssmebly 的字节码格式非常利于宿主平台的解析和执行。比如 v8 引擎的 Liftoff 和 TurboFan 编译器。
但是不利于开发人员间接对该格式的具体组成结构和内容进行分析员理解分析。因此 webAssembly 规范中又规定了与其字节码格式相对应的可读文本格式 即 WAT。
- 通过这种有具有详细语义的符号和一定的语法格式组成的文本进行阅读,开发者便可以直观地理解,这段 webAssembly 字节码中,所实现的具体内容与功能。综上所述,再回到我们之前的话题,
二、 WebAssembly 是一门新的编程语言吗?
- 从传统我们对编程语言的定义上来看,它其实并不是一种编程语言,而是一种编译器的编译目标。
- 但从某种程度上来看,webAssembly 字节码格式对应的可读文本格式 wat ,又由于其有着相对独立的语义关键字和语法结构,我们也可以称它是一种低层级的编程语言,而这里我们讲的低层级是指该编程语言所具有的语法表现形式更加贴近硬件本身的执行逻辑,而不是那种我们常见的、抽象的、那种人们可以直接直观理解的高级编程语言表达形式。比如我们常见的 Python 或 JavaScript。其次我们再来看看,
三、 webAssembly 与虚拟机又有怎样的关系呢?
其实作为一个简单的类比,大家就可以很直观地了解到他们两者之间的关系。对 java 语言稍微有所了解的同学应该知道,一个简单的 java 应用程序最后是以 java 字节码的形式被运行在 JVM中,也就是我们常说的 java 虚拟机中。
那么,同样的,我们之前曾提到过 webAssembly 是一种新的字节码格式,那么如果我们想要执行这种字节码格式所对应的二进制代码,是不是也同 java 字节码一样,需要一种可以解析执行 webAssembly 字节码的虚拟机呢?答案是没错的
webAssembly 被设计成一种抽象虚拟机的字节码格式。所谓抽象虚拟机,是指组成这种字节码的各种指令和语法结构设计并不依赖于具体虚拟机体系类型,或者说与这些具体的虚拟机体系类型无关。比如我们常说的 x86 架构或者 ARM 架构。
webAssembly 字节码需要被对应的宿主上实现的、具体的 虚拟机程序来解析和执行。比如 webAssembly 诞生所在的 web 平台。以 chrome 为例,其内部的 V8引擎 便是一个 webAssembly 字节码的实际执行环境。V8引擎通过 webAssembly 规范来分析字节码的实际组成结构然后将其转换成对应的宿主平台相关的机器码然后再执行。
再比如 WAVM,它是专门用于 webAssembly 的独立的虚拟机实现环境,该虚拟机可以在 windows 或者 类Unix系统上直接解析执行 webAssembly 字节码的二进制指令并间接与操作系统进行交互。所以总结来看,webAssembly 是一种抽象虚拟机的字节码规范,这种字节码类的二进制代码可以在对应的、符合该抽象虚拟机规范的具体平台相关的虚拟机实现上 来解析执行。
那么最后我们再来看看,在现阶段四大浏览器已经支持的 MVP即最小可用版本标准下,
四、 webAssembly 又有怎样的应用场景呢?
由于 webAssembly 本身字节码的特性,当应用构建在 web平台上时,webAssembly 字节码的执行效率,在大多数情况下,会远远高于实现了同样功能的 javascript 代码。因此我们可以选择性地将 webAssembly 应用在常见的,诸如web端上的视频、音频、图片编/解码、AI深度学习-机器学习的训练与计算过程、以及需要多端统一的一些计算与渲染过程上。除此之外,由于 webAssembly 的相关工具链,比如 emscripten (c/c++->wasm)、LLVM 等赋能,使得 webAssembly 有另外的应用场景就是将历史上已有的各种优秀的c\c++、甚至是 rust 的代码库,直接无痛地迁移到 webAssembly 字节码并同时运行在多个平台和环境中。比如我们常见的一些编解码库(VIc player)、算法库、加密解密库、甚至是游戏引擎等。
- 编解码库
- 算法库
- 加密解密库
- 游戏引擎
总结
看到这里我们总结一下 webAssembly 诞生至今不过短短三年,从 MVP 标准的落地实现 与 Post-MVP 标准的设计与实施,从只限于 web 领域到 WASI等衍生场景的出现,webAssembly 正在逐渐突破人们对它的理解。逐渐占据甚至取代越来越多的应用场景与旧时代的解决方案。Docker 创始人 Solomon Hykes 曾说过:如果webAssembly
和 WAIM
(webAssembly system interface
即 webAssembly 系统标准库
) 出现在 2008年,那我们可能并不需要创建 docker 了。距离 webAssembly 真正的大规模应用和推广可能还需要两年到三年的时间。但是呢,机遇总是留给有准备的人,而 webAssembly 便是其中的一个,所值得我们等待的。好的。我是于航,希望我的分享能够帮祝到您。