Mozilla开发人员介绍了WASI项目 (WebAssembly系统界面),它正在定义软件界面,可用于组织以WebAssembly格式交付的应用程序与操作系统的交互。
该项目的目标是提供一个API,以扩展WebAssembly的使用并允许您创建程序 基于常规 在浏览器之外运行的这项技术中它们可移植到任何平台,并具有高度的安全性。
什么是WASI?
WASI允许WebAssembly环境访问操作系统提供的功能例如文件,文件系统,网络套接字,计时器和随机数生成器。
WASI API最初是作为非浏览器绑定和独立开发的 来自JavaScript / Web API,但是 同时提供足够水平的系统隔离 main(应用程序在沙盒中运行),并允许您以CloudABI和Capsicum的样式显式定义授予应用程序的权限。
瓦西 使用基于权限管理的安全模型,程序只能在其中故意执行授权的操作。
与WebAssembly在导入功能级别限制访问的方式类似,WASI控制对系统功能的访问。
文件,目录,套接字和其他资源与特殊类型的文件描述符(容量)相关联,并且应用程序必须具有对每个资源执行操作的权限。
权限是分层管理的,即,将自动打开对目录的访问,并自动访问目录中包含的所有文件。
考虑到 WebAssembly是与平台无关的汇编语言版本,使用JIT可以达到接近本机代码的性能水平,同时保持在各种硬件平台和操作系统上运行的能力。
当前,该项目为wasi-core模块提供了基本POSIX API(文件,套接字等)的实现,而该POSIX API当前不支持锁和异步I / O。
将来, 计划使用API实现创建模块以执行加密操作,使用3D图形,与传感器交互,对流程进行操作(尚不支持fork调用)以及处理多媒体数据。
组件原型
Wasmtime是一个运行时,负责运行基于WebAssembly的应用程序 WASI扩展作为普通的独立应用程序。
Se 通过特殊的命令行实用程序支持启动WebAssembly字节码 以及现成的可执行文件的设计(wasmtime作为库内置在应用程序中)。
为了达到适当的性能水平,使用了基于海拔代码生成器的JIT编译器。
Lucet是Fastly项目的另一个运行时版本 (该代码计划于今天或明天发布)。
软件开发工具包-使用Clang 8.0以Web汇编格式编译C / C ++应用程序的工具。
WASI支持Rust语言的程序集目标,允许您将Rust代码编译为WebAssembly。
Wasi-sysroot是WASI标准libc库的实现,基于Musl代码的运行时层,以及将库提供的功能转换为各种操作系统的系统调用的运行时层,以实现在不同操作系统上运行WASI应用程序的可能性。
该项目还在开发带有WASI实现的polyfill JavaScript库,以在浏览器中运行应用程序。,该功能允许将“功能”访问控制模型应用于浏览器中执行的代码。
在这些计划中,提到了创建基于WASI的模块系统以集成到具有WebAssembly格式提供的附加功能的隔离插件应用程序中。
WebAssembly的主要任务之一是确保在不同平台上的可移植性,行为的可预测性以及代码执行的身份。