科技女王范儿|WebAssembly 和 JS构建高性能应用程序,如何使用( 三 )


引入Table主要是为了提高安全性 。
你可以使用set()、grow()和get()方法来操作Table 。
演示
在这个演示中 , 我将使用WebAssemblyStudio应用程序将一个C文件编译为.wasm 。 你可以在这里查看演示 。
我创建了一个函数来计算wasm文件中一个数字的幂 。 我将必要的值传递给函数 , 并在JavaScript中接收输出 。
同样 , 我在wasm中进行了一些字符串操作 。 需要注意wasm没有字符串类型 , 因此它用的是ASCII值 。 返回到JavaScript的值将指向存储输出的memory位置 。 由于memory对象是ArrayBuffer , 因此我要进行迭代 , 直到收到字符串中的所有字符为止 。
JavaScript文件
letexports;letbuffer;(async()=>{letresponse=awaitfetch('../out/main.wasm');letresults=awaitWebAssembly.instantiate(awaitresponse.arrayBuffer());//or//letresults=awaitWebAssembly.instantiateStreaming(fetch('../out/main.wasm'));letinstance=results.instance;exports=instance.exports;buffer=newUint8Array(exports.memory.buffer);findPower(5,3);printHelloWorld();})();constfindPower=(base=0,power=0)=>{console.log(exports.power(base,power));}constprintHelloWorld=()=>{letpointer=exports.helloWorld();letstr='''';for(leti=pointer;buffer[i];i++){str+=String.fromCharCode(buffer[i]);}console.log(str);}C文件
#defineWASM_EXPORT__attribute__((visibility(''default'')))#include<math.h>WASM_EXPORTdoublepower(doublenumber,doublepower_value){returnpow(number,power_value);}WASM_EXPORTchar*helloWorld(){return''helloworld'';}用例
WebAssembly的诞生带来了很多全新的机遇 。
能够在Web环境中使用以C/C++等语言编写的现有库/代码 。例如 , 如果你无法找到实现某些功能的JavaScript库 , 则必须从头开始编写并实现自己的库 。 但如果你可以找到实现相同功能 , 但使用不同语言编写的库 , 则可以使用WebAssembly的能力在Web应用程序中运行它 。 这是一项重大突破 , 因为从开发人员的角度来看 , 它将节省大量时间 。
Squoosh应用使用WebAssembly来实现其QR和图像检测功能 。 这样一来 , 即使在较旧的浏览器上 , 它们也能以接近原生的速度支持这些功能 。 此外 , eBay将其原生应用程序的C++库编译为WebAssembly , 从而在Web应用程序中实现了条形码扫描功能 。
无需修改代码 , 就能在Web上运行用C、C++、Rust等语言编写的完全原生应用程序 , 性能表现也接近原生水平 。诸如AutoCAD、QT甚至谷歌地球之类的应用程序都可以在几乎不修改代码库的情况下以接近原生的性能运行在Web上 , 多亏了WebAssembly的强大力量 。
即使你找到了用JavaScript编写的类似库 , 也可以使用以C、C++或Rust等语言编写的库 , 因为WebAssembly代码速度飞快 , 并能提供更好的质量 。谷歌团队将来自C和C++等不同语言的编码器编译到了他们的Squoosh应用中 , 并替换掉了常规的编解码器(如JPEG->MozJPEG) 。 这些替代品缩小了文件体积 , 而不会牺牲图像的视觉质量 。
支持的语言
WebAssembly支持不仅限于C、C++和Rust 。 许多开发人员也在努力纳入对其他语言的支持 。 以下是当前支持的语言列表 。
C/C++RustAssemblyScript(类似TypeScript的语法)C#F#GoKotlinSwiftDPascalZig批评
WebAssembly允许在已编译的二进制文件中执行 , 因此带来了许多安全性质疑 。 甚至无需什么trace也可以利用这些漏洞 , 而且它们确实很难发现 。 尽管WebAssembly也有自己的安全特性 , 但我个人认为这方面仍需进一步改进 。 因为引入了那么多新功能 , 防病毒工具和URL过滤之类的传统防护技术根本无法提供全面保护 。 这意味着常规浏览器在未来会更加脆弱 。


推荐阅读