如果提及近年来让人最为兴奋的新技术,非WebAssembly 莫属。作为一种低级的类汇编语言,WebAssembly以紧凑二进制的格式存储,为C/C++, Rust等拥有低级内存的模型语言提供了新的编译目标。正因如此,WebAssembly体积更小,可以以接近原生性能的速度运行。 WebAssembly 技术本身具有非常多的优点,虽始于浏览器但已经开始不断地被各个语言及平台所集成,在实际的工业化落地中,区块链、边缘计算、游戏及图像视频等多个领域都依靠 WebAssembly 创造出了让人称赞的产品。 WebAssembly的应用场景
WebAssembly的主要特性
WebAssembly VS Javascript既然提到了Web技术,就不得不提另一款在Web项目开发中大放异彩的脚本语言Javascript。1995 年,Brendan Eich 用了不到 10 天就创建了 Javascript,其最初主要应用于表单验证,而非以速度见长。随着各类应用功能的复杂化,受限于 JavaScript 语言本身动态类型和解释执行的设计,其性能问题逐渐凸现。 2008年,围绕着浏览器性能开展的大战终于在各大浏览器厂商间爆发,在先后经历了即时编译器(JITs),以及用Node.js和Electron构建应用程序的时期后,WebAssembly有望成为JS引擎突破下一性能瓶颈的转折点。 为此,这两者经常被用于比较,甚至一度出现WebAssembly 终将替代 Javascript的言论。的确,作为类汇编语言,WebAssembly解决了Javascript最常为人诟病的性能问题,也正是基于此,WebAssembly注定不适合开发人员手写代码,只能为其他语言提供一个编译目标。 因此,这两种技术的关系不是竞争,反而更像是合作共赢。通过 Javascript API,你可以将 WebAssembly 模块加载到你的页面中。也就是说,你可以通过 WebAssembly 来充分利用编译代码的性能,同时保持 Javascript 的灵活性。 二者性能对比下图为我们展现了JS引擎运行程序和运行Wasm的耗时对比: JS引擎运行程序时,需要经历源码转换(parse)、生成字节码(compile + optimize)、编译器优化(re-optimize)、代码执行(execute)和内存清理(GC)这五个阶段:
大部分情况下,JS在执行阶段将字节码编译成机器码,这一阶段十分耗时。(这是由于JS的动态性所导致,相同的代码会被不同的类型重新编译)。而Wasm不需要被解析,也不需要在运行时动态检测数据类型,由于它已经是字节码了,所以只需要简单解码,即可包含所有的类型信息。 正是因为Wasm的大部分优化工作已经在LLVM的前端部分完成了,所以编译优化的工作很少,这便是其高性能的主要体现。 编译模型(LLVM)LLVM(Low-Level-Virtural-Machine), 底层虚拟机架构,优点包括:
WebAssembly 与LLVM结合WebAssembly与LLVM结合,不需要为各个语言额外添加前端编译工具,中间的IL可以不断地优化,仅需添加一个'后端',就可以让大部分语言编译成wasm。这个'后端'不同于之前提到的后端,它不会直接生成机器码,它生成的wasm,会由浏览器wasm运行时负责编译运行。 这就是WebAssembly的编译原理, 既然WebAssembly的核心目标是与Javascript等Web技术兼容, 那么其兼容到底程度如何?下面,我们将通过项目实战来验证。 注:具体的代码和Demo示例将在grapecity的公开课中进行演示,欢迎各位同学点击文末“了解更多”观看。 项目实战:WebAssembly + Javascript在进入项目实战之前,大家需要理解一个核心概念,即JavaScript为何能完全控制WebAssembly代码,并执行下载和编译运行:
可见,JavaScript API为开发者提供了创建模块、内存、表格和实例的能力。 通过一个WebAssembly实例,JavaScript能够调用该实例暴露的函数,把JavaScript函数导入到WebAssembly实例中,WebAssembly也能调用JavaScript函数。 另外,WebAssembly不能直接读写DOM,只能调用JavaScript,并且只能传入整形和浮点型的原始数据作为参数。因此,JavaScript能够完全控制WebAssembly代码实现下载、编译、运行, JavaScript开发者也可以把WebAssembly想象成一个生成高性能函数的JavaScript特性。 代码示例wasm(Rust): wasm_bindgen主要用来生成一些胶水代码,简化开发者在JS和wasm之间的方法调用。 JS: 项目结构IDEVSCode+插件Rust 执行步骤
结语通过简单介绍 WebAssembly 的应用场景和主要特性,我们能更好地够理解 WebAssembly 技术的演变过程。如果您想更详细的学习相关内容,可以点击下方“了解更多”观看视频进行学习。 |
|