当前位置: 首页 > Web前端 > JavaScript

Day55-100JavaScript和WebAssembly关系的思考

时间:2023-03-26 21:24:53 JavaScript

(1)需求看过很多新技术中对WebAssembly的描述,但不知道WebAssembly是什么。于是收集记录了~(2)WebAssembly1.WebAssembly为什么诞生?对于网络平台来说,这具有重要的意义——这为客户端app提供了一种在网络平台上以接近本地速度运行的方式。代码用语言编写的方式;在此之前,客户端应用程序是不可能做的。此外,您可以在不知道如何编写WebAssembly代码的情况下使用它。WebAssembly模块可以导入到Web应用程序(或Node.js)中,并公开WebAssembly函数以供JavaScript使用。JavaScript框架不仅可以使用WebAssembly获得巨大的性能优势和新特性,还可以让Web开发人员轻松使用各种功能。有一种场景是JS在移动设备上会比原生应用程序(Android、IOS)慢很多,因此W3C社区希望创建WebAssembly技术作为JS的补充。二、WebAssembly的定义(一)WebAssembly/wasm的定义WebAssembly或wasm是一种可移植、体积小、加载速度快、与Web兼容的新格式。它是JavaScript的扩展和补充;WebAssembly是由主流浏览器厂商组成的W3C社区组制定的新规范。WebAssembly是一种新型代码,可在现代网络浏览器中运行并提供新的性能特性和效果。它不是为手写代码而设计的,而是为C、C++和Rust等低级源语言提供高效的编译目标。为WebAssembly设计的二进制格式可以原生解码,比JavaScript解析快很多(实验表明至少快20倍)。在移动设备上,较大的编译代码需要20-40秒才能解析,因此本机解码(尤其是与流媒体等其他技术相结合以获得比g??zip更好的压缩效果时)对于提供良好的零负载用户体验至关重要。为了避免AOT编译的同步asm.js约束,并确保在没有对asm.js进行特殊优化的设备上有良好的性能,一个新的标准允许我们更容易地添加这些(http://webassembly.org.cn/doc...),这需要本机性能。(2)特点[高效]快速、高效、便携——利用通用的硬件能力,WebAssembly代码可以在不同平台上以接近本地的速度运行。[开放]可读可调试-WebAssembly是一种低级语言,但它确实具有人类可读的文本格式(其标准即将定稿),允许手写代码、查看代码和调试代码。[安全]保持安全-WebAssembly被限制在安全的沙箱执行环境中运行。与其他网络代码一样,它遵循浏览器的同源和授权策略。【标准】不破坏网络——WebAssembly的设计原则是与其他网络技术和谐共存并保持向后兼容。WebAssembly可以被JavaScript调用,进入JavaScript上下文,也可以像WebAPI一样调用浏览器函数。当然,WebAssembly不仅可以运行在浏览器上,也可以运行在非Web环境中。(3)关键概念为了理解WebAssembly如何在浏览器中运行,需要理解几个关键概念。所有这些概念都一一映射到WebAssembly的JavaScriptAPI。Module:代表一段WebAssembly二进制代码,已经被浏览器编译成可执行的机器码。模块是无状态的,可以像二进制大对象(Blob)一样缓存在IndexedDB中或在窗口和工作程序之间共享(通过postMessage()(en-US)函数)。模块可以像ES2015模块一样声明导入和导出。内存:ArrayBuffer,可变大小。本质上是一个连续的字节数组,WebAssembly的低级内存访问指令可以对其进行读取和写入。表:大小可变的类型化数组。表中的条目存储对不能作为原始字节存储在内存中的对象的引用(出于安全和可移植性原因)。实例:一个模块及其在运行时使用的所有状态,包括内存、表和导入值列表。实例就像一个ES2015模块,它已通过一组特定的导入加载到特定的全局变量中。3、如何使用WebAssembly(1)API参考WebAssembly该对象是所有与WebAssembly相关的函数的命名空间。WebAssembly.ModuleWebAssembly.Module对象包含无状态的WebAssembly代码。代码经过浏览器编译,可以被Workers高效共享,缓存在IndexedDB中,多次实例化。WebAssembly.InstanceWebAssembly.Instance对象是一个有状态的、可执行的模块实例。实例对象包含所有可以从JavaScript调用到WebAssembly代码的导出的WebAssembly函数WebAssembly.instantiate()WebAssembly.instantiate()函数是编译和实例化WebAssembly代码的主要API,它返回一个Module及其第一个实例。WebAssembly.Memory()WebAssembly.Memory对象是一个可变长度的ArrayBuffer。它保存实例可以访问的原始内存字节。WebAssembly.Table()WebAssembly.Table对象是一个可变长度数组。它存储不透明的值,例如函数引用,可以被实例访问。WebAssembly.CompileError()创建一个新的WebAssemblyCompileError对象。WebAssembly.LinkError()(zh-CN)创建一个新的WebAssemblyLinkError对象。WebAssembly.RuntimeError()创建一个新的WebAssemblyRuntimeError对象。(2)下面的APIDEMO示例(参见GitHub上的Instantiate-streaming.html)演示了直接从streaming底层源码传输.wasm模块,然后编译实例化,通过ResultObject实现promise。由于instantiateStreaming()函数接受对Response对象的承诺,您可以直接将WindowOrWorkerGlobalScope.fetch()调用传递给它,然后它将返回的响应传递给后续函数。varimportObject={imports:{imported_func:arg=>console.log(arg)}};WebAssembly.instantiateStreaming(fetch('simple.wasm'),importObject).then(obj=>obj.instance.exports.exported_func())参考链接1、MDNhttps://developer.mozilla.org...2、webassembly中文网http://webassembly.org.cn/写在最后的话1、我建了一个前端学习群,有兴趣小伙伴们,可以加我微信:learningisconnecting2。在学习的路上,经常偷懒《有想学技术需要监督的同学嘛~》https://mp.weixin.qq.com/s/Fy...3。分享成长与认知方法欢迎关注我的公众号:国兴聊成长,分享我每周学习的成长/认知方法