虽然 WebAssembly 被设计为在 Web 上运行,但它也期望能够在其他环境中良好执行,包括从用于测试的最小 shell 到完整的应用程序环境,例如数据中心的服务器、IoT 设备或移动/桌面应用程序。它甚至可以被嵌入到更大的程序中执行。
非 Web 环境可能提供与 Web 环境不同的 API,功能测试 和 动态链接 将使这些 API 可被发现和使用。
非 Web 环境可能包括 JavaScript VM(例如 node.js),但 WebAssembly 也被设计为能够在没有 JavaScript VM 的情况下执行。
WebAssembly 规范本身不会尝试定义任何大型可移植的类似 libc 的库。但是,某些与 WebAssembly 语义核心相关的功能,这些功能类似于原生 libc 中的函数,将 作为基本操作符成为 WebAssembly 规范的一部分(例如,grow_memory
操作符,类似于许多系统上的 sbrk
函数,以及未来类似于 dlopen
的操作符)。
在 Web 和流行的非 Web 环境之间存在重叠的情况下,可以提出共享规范,但这些规范将与 WebAssembly 规范分开。JavaScript 中的一个对称示例是正在进行的 Loader 规范,该规范被提议用于 Web 和 node.js 环境,并且与 JavaScript 规范不同。
但是,在大多数情况下,预计为了在源代码级别实现可移植性,社区将构建将源级接口映射到主机环境内置功能的库(在构建时或运行时)。WebAssembly 将提供原始构建块(功能测试、内置模块 和动态加载)以使这些库成为可能。两个早期的预期示例是 POSIX 和 SDL。
总的来说,通过保持非 Web 路径,使其不需要 Web API,WebAssembly 可用作许多平台上的可移植二进制格式,在可移植性、工具和语言无关性方面带来巨大的优势(因为它支持 C/C++ 级别的语义)。