当前位置: 首页 > 科技观察

WebAssembly的现在和未来

时间:2023-03-12 19:44:15 科技观察

上篇文章《当前 WebAssembly 的状况》了解了WebAssembly的工作原理以及为什么WebAssembly跑得更快,那我们就来说说WebAssembly的现在和未来。2017年2月28日,四大浏览器一致宣布WebAssembly的MVP版本已经完成,这是一个浏览器可以承载的稳定版本。它提供了浏览器可以承载的稳定内核。该内核不包含WebAssembly组织计划的所有功能,但提供了一个可以使WebAssembly稳定运行的基础版本。这允许开发人员使用WebAssembly代码。对于较旧的浏览器,开发人员可以使用asm.js实现代码的向后兼容性,asm.js是JavaScript的一个子集,可以被所有JS引擎使用。此外,使用Emscripten工具,您可以将应用程序编译为WebAssembly或asm.js。虽然是第一个版本,但WebAssembly已经能够发挥它的优势。未来,通过不断改进和集成新特性,WebAssembly将变得更快。1.提高WebAssembly在浏览器中的性能随着各种浏览器的引擎支持WebAssembly,速度的提升也就自然而然了。目前各大浏览器厂商都在积极推动此事。2.JavaScript和WebAssembly之间调用的中间函数目前在JS中调用WebAssembly比应该的慢。这是因为中间需要做一个“蹦床运动”。JIT没有办法直接处理WebAssembly,所以JIT必须先把WebAssembly函数送到一个能理解它的地方。这个过程是引擎中最慢的部分。按理来说,如果JIT知道如何直接处理WebAssembly函数,速度会提升一百倍。如果您将单个任务传递给WebAssembly模块,则不必担心这种开销,因为只有一次转换,这也更快。但是如果你经常在WebAssembly和JavaScript之间切换,那么这个开销就必须要考虑了。3.快速加载JIT必须在快速加载和快速执行之间做出权衡。如果大量时间花在编译和优化阶段,那么执行会很快,但启动会更慢。关于如何平衡预编译时间和程序的实际执行时间,目前有很多工作正在做。WebAssembly不对变量类型做优化假设,因此引擎在运行时不关心变量类型。这为提高效率提供了更多可能,比如将编译和执行两个过程并行化。此外,新增的JavaScriptAPI允许对WebAssembly进行流式编译,可以在字节流还在下载的时候开始编译。FireFox目前正在开发两种编译器系统。编译器首先启动并部分优化代码。当代码开始运行时,第二个编译器将在后台对代码进行全面优化,当全面优化过程完成后,它将用完全优化后的版本替换代码并继续执行。4.WebAssembly标准后续特性的添加过程WebAssembly的开发采用小步迭代的方式,边开发边测试,而不是预先设计一切。这意味着很多功能还处于起步阶段,还没有经过深思熟虑和实际验证。他们想要被写入标准,还需要所有浏览器厂商的积极参与。这些特性被称为:未来特性。这里有一些。1.直接操作DOM当前,WebAssembly没有任何方法可以直接与DOM进行交互。这意味着您还不能使用element.innerHTML之类的方法更新节点。操作DOM,必须通过JS。然后需要调用WebAssembly中的JavaScript函数(在WebAssembly模块中,可以同时导入WebAssembly函数和JavaScript函数)。不管怎么说,都得通过JS来实现,比直接访问DOM要慢很多,所以这是以后必须要解决的问题。2、共享内存的并发性提高代码执行速度的一种方法是让代码并行运行,但有时适得其反,因为不同的线程可能会花更多的时间来同步。这时,如果不同的线程可以共享内存,就可以减少这种开销。为了实现这个功能,WebAssembly会在JavaScript中使用SharedArrayBuffer,这个功能的实现将提高程序执行的效率。3.SIMD(SingleInstruction,MultipleData)如果你之前了解过WebAssembly,你可能听说过SIMD,全称是:SingleInstruction,MultipleData(单指令,多数据),这是并行化的另一种方式。SIMD在处理存储大量数据的数据结构方面有其独特的优势。例如,存储大量不同数据的向量(容器)可以使用相同的指令同时处理容器的不同部分。这种方法将大大提高复杂计算的效率,例如游戏或VR。这对于普通的网络应用开发者来说不是很重要,但是对于多媒体和游戏开发者来说却是非常关键的。4.异常处理很多语言都遵循C++风格的异常处理,但是WebAssembly不包含异常处理。如果你用Emscripten编译你的代码,你知道它模拟异常处理,但它太慢了你会想要用“DISABLEEXCEPTIONCATCHING”标志关闭异常处理。如果将异常处理添加到WebAssembly中,则无需使用mocking。而且异常处理对开发者来说尤为重要,所以这也是以后的一大特色点。5.其他改进——让开发者更容易开发一些未来的特性不是为了性能,而是为了让开发者更容易开发WebAssembly。优秀的开发者工具。目前在浏览器中调试WebAssembly就像调试汇编一样,很少有开发者能够手动映射自己的源代码和汇编代码。我们正在开发更适合开发者调试源代码的工具。垃圾收集。如果你能提前确定变量类型,你就可以把你的代码变成WebAssembly,比如TypeScript代码可以编译成WebAssembly。但是现在的问题是WebAssembly无法处理垃圾回收,WebAssembly中的内存操作都是手动的。因此,WebAssembly会考虑提供方便的GC功能,方便开发者使用。ES6模块集成。目前,浏览器逐渐支持使用script标签来加载JavaScript模块。一旦这个功能被破解,像这样的标签就可以运行,其中的url可以被替换为WebAssembly模块。5.总结WebAssembly执行得更快。随着浏览器逐渐支持WebAssembly的各种特性,WebAssembly将变得更快。点击《WebAssembly 系列(六)WebAssembly 的现在与未来》阅读原文。【本文为专栏作者“虎子打哈”原创文章,转载请联系作者获得授权】点此阅读更多该作者好文