
专注发展WebAssembly技术与工具的公司Wasmer,推出一个称为Wasmer JS SDK的JavaScript库,供开发者可在浏览器中执行各种WASI和WASIX套件。 Wasmer JS SDK的特色在于,能够支持多线程、信号(Signal)、子程序(Subprocess)功能,并执行诸如Python、Bash、FFmpeg等UNIX程序。
WebAssembly原本是专为网页应用设计的低阶编程语言,其运作效能接近机器码,可以被快速加载和执行,对于游戏、视频编辑和仿真运算等需要大量计算资源的应用特别有用,且于WebAssembly程序在沙盒环境中运作,可确保用户免受恶意代码的影响。
虽然WebAssembly起初是针对浏览器环境设计,这也使得其在浏览器外的应用场景遇到一些限制。 当考虑将WebAssembly应用于服务器端和其他非浏览器环境时,便出现对更广泛系统互操作性的需求,例如文件系统访问和网络通讯等功能。 为了解决这些限制,WebAssembly开发团队也就着手制定了WASI(WebAssembly System Interface)。
WASI目标是建立一个标准化系统界面,以方便WebAssembly模块可以在不同的环境中,以一致且安全的方式与操作系统进行互动。 WASI基于WebAssembly的安全和可移植性原则,并且在原有的基础上增加许多系统级功能,通过WASI使得WebAssembly的应用场景,从原本的浏览器环境扩展到了服务器端、云计算、物联网设备等更广泛的领域。
Wasmer在今年6月的时候,推出WASI与可移植操作系统界面(Portable Operating System Interface,POSIX)的超集合 WASIX。 由于WASI并不支持所有POSIX,所以Wasmer希望通过推出WASIX,强化现有WASI ABI(Application Binary Interface),并增加额外非侵入式的系统呼叫扩充。 简单来说,WASI仅提供基本的系统操作,而WASIX可视为WASI的扩充,提供更广泛的系统呼叫和功能,WASIX并非要取代WASI,而是要作为一个兼容的WASI扩充解决方案。
而现在Wasmer推出JS SDK,是要回头解决WebAssembly在浏览器中所遇到的限制和挑战,提供更多方便功能。 WebAssembly在浏览器中并不支持像是文件系统访问和网络通信等系统级功能,而Wasmer JS SDK则通过支持WASI和WASIX扩充,让WebAssembly也可以在浏览器执行复杂的操作。
Wasmer JS SDK简化浏览器中部署和执行WebAssembly模块的过程,提供一套易于使用的API,让开发者可以快速加载和执行模块,不需要开发者进行繁琐的手动配置。 而且Wasmer JS SDK还提供经过优化的WebAssembly执行环境,提高模块的执行效能和资源管理。
虽然JavaScript本身是单线程运作,但是通过JS Workers,Wasmer JS SDK能够在浏览器中启用类似多线程的功能。 官方解释,JS Workers API与典型的执行绪API不同,因为没有执行绪的Join同步处理方法,JS Workers是通过消息通道和主执行绪沟通。 因此JS Workers得以重用主WebAssembly程序中的共享内存,并在更改时通知内存,进而允许类UNIX执行绪通过JS Workers运作。
此外,在传统类UNIX系统中,fork()是一个用于创建子程序的系统呼叫,但要在浏览器中执行fork(),是一个非常具有挑战的工作,因为浏览器通常不提供这种底层系统存取能力,要执行fork()就需要转储堆叠并在不同的程序中恢复堆叠。 而Wasmer JS SDK使用asyncify将程式冻结在堆叠中,在新建立的Worker中还原。
Wasmer API采用特殊的容器格式,可以同时供应WebAssembly资源和文件系统资源,这代表程序可以一次下载所有文件系统相依套件。 Wasmer JS SDK还内置文件系统API,进而实现更丰富的功能。
借助 Wasmer JS SDK,开发者可以在浏览器中运行多媒体处理工具FFmpeg,执行视频和音频文件编辑工作,而且浏览器中也可以运作CPython,因此开发者可以在网页应用中直接执行 Python 脚本。 甚至开发者还可以在浏览器中执行Bash Shell,这将可在网页应用程式带来强大的命令行操作功能。