不出所料,WebAssembly 的主要用途之一是在 Web 上运行,例如嵌入到 Web 浏览器中(尽管这是不是它唯一的目的)。
这意味着与 Web 生态系统集成,利用 Web API,支持 Web 的安全模型,保留 Web 的可移植性,并为进化开发留出设计空间。其中许多目标都清楚地反映在 WebAssembly 中高层次目标。特别是,从安全的角度来看,WebAssembly MVP 不会比 JavaScript 模块更宽松。
更具体地说,以下是 WebAssembly 与已考虑的 Web 平台其余部分之间的接触点列表:
JavaScript API提供了允许 JavaScript 编译 WebAssembly 模块、在已编译模块上执行有限反射、从离线存储中存储和检索已编译模块、使用 JavaScript 导入实例化已编译模块、调用实例化模块的导出函数、对实例化模块的导出内存进行别名等。
Web 嵌入包括在该上下文中有用的其他方法。在非 Web 嵌入中,这些 API 可能不存在。
为里程碑 2:cyclone: 添加了开发人员必须检测的功能。
在 Web 嵌入中,添加了以下方法。
注意,期望 compileStreaming
和 instantiateStreaming
都存在或都不存在。
Promise<WebAssembly.Module> compileStreaming(source)
的内置值 Promise.resolve
source
无条件地传递。如果结果不 Response
是对象,则返回 Promise
rejected的结果带有 [ TypeError
](https://tc39.github.io/ecma262/#sec-native-error-types-used-in-this-standard-typeerror)。这允许开发人员为传递解析为 [ Response
](https://fetch.spec.whatwg.org/#response-class)对象或 [ Response
](https://fetch.spec.whatwg.org/#response-class)对象(自动转换为 Promise)的 source
Promise.有关跨来源内容污染的呈现器端安全检查与 [ Fetch
](https://fetch.spec.whatwg.org/#concept-fetch)中定义的已筛选响应的类型相关联。
此函数启动一个异步任务来编译 WebAssembly.Module
,如 [ WebAssembly.Module
Constructor](#WebAssemblyModule-Constructor)中所述。成功时,将 Promise
fulfilled与结果 WebAssembly.Module
对象一起使用。发生故障时,根据故障类型, Promise
为rejected WebAssembly.CompileError
或 TypeError
。
解析 Response
的用作要编译的字节的源。MIME 类型信息是 [ extracted
](https://fetch.spec.whatwg.org/#concept-header-extract-mime-type),来自“” Response
,WebAssembly source
数据必须具有 MIME 类型“ application/wasm
”,不允许有额外的参数(包括空参数 application/wasm;
)。MIME 类型不匹配、不是“Basic”、“CORS”或“Default”的响应type或状态不ok status是的响应必须导致承诺rejected与一起 TypeError
。
为里程碑 2:cyclone: 添加了开发人员必须检测的功能。
在 Web 嵌入中,添加了以下方法。
dictionary WebAssemblyInstantiatedSource {
required WebAssembly.Module module;
required WebAssembly.Instance instance;
};
Promise<InstantiatedSource> instantiateStreaming(source [, importObject])
的内置值 Promise.resolve
source
无条件地传递。如果结果不 Response
是对象,则返回 Promise
rejected的结果带有 [ TypeError
](https://tc39.github.io/ecma262/#sec-native-error-types-used-in-this-standard-typeerror)。这允许开发人员为传递解析为 [ Response
](https://fetch.spec.whatwg.org/#response-class)对象或 [ Response
](https://fetch.spec.whatwg.org/#response-class)对象(自动转换为 Promise)的 source
Promise.有关跨来源内容污染的呈现器端安全检查与 [ Fetch
](https://fetch.spec.whatwg.org/#concept-fetch)中定义的已筛选响应的类型相关联。
此函数启动一个异步任务,该任务首先 WebAssembly.Module
根据中的字节 source
编译,如 [ WebAssembly.Module
Constructor](#WebAssemblyModule-Constructor)中所述,然后使用实例化结果 Module
importObject
,如 [ WebAssembly.Instance
Constructor](#WebAssemblyInstance-Constructor)中所述。如果成功,则 Promise
fulfilled具有包含结果 WebAssembly.Module
和 WebAssembly.Instance
的纯 JavaScript 对象对 {module, instance}
。返回对的 2 个属性 module
和 instance
是可配置的、可枚举的和可写的。
失败 Promise
时,根据失败的原因,rejected带有 TypeError
、 WebAssembly.CompileError
、 WebAssembly.LinkError
或 WebAssembly.RuntimeError
。
解析 Response
的用作要编译的字节的源。MIME 类型信息是 [ extracted
](https://fetch.spec.whatwg.org/#concept-header-extract-mime-type),来自“” Response
,WebAssembly source
数据必须具有 MIME 类型“ application/wasm
”,不允许有额外的参数(包括空参数 application/wasm;
)。MIME 类型不匹配、不是“Basic”、“CORS”或“Default”的响应type或状态不ok status是的响应必须导致承诺rejected与一起 TypeError
。
浏览器、JavaScript 引擎和离线工具都有引用 JavaScript 工件和语言构造的通用方法。例如,JavaScript 源代码中的位置打印在堆栈跟踪或错误消息中,并在文本文件中自然地表示为十进制格式的行和列。函数和变量的名称直接取自源代码。因此(例如)即使 Error.Stack 字符串的确切格式并不总是匹配,位置也很容易理解,并且在浏览器中是相同的。
为了实现 WebAssembly 构造的通用表示的相同目标,采用了以下约定。
WebAssembly 位置是对二进制文件中特定指令的引用,可以由浏览器或引擎在与 JavaScript 源位置类似的上下文中显示。它具有以下格式:
${URL}:wasm-function[${funcIndex}]:${pcoffset}
哪里
${url}
是与模块关联的 URL(如果适用)(请参阅注释)。- 中的函数索引空间
${funcIndex}
索引。 ${pcOffset}
是指令的第一个字节在模块二进制中的偏移量,以十六进制打印,数字小写,带有前导0x
前缀。
注意事项:
- URL 字段的解释可能因
上下文。当在浏览器中使用基于响应的实例化API时,应该使用关联的 URL;或者当使用基于 ArrayBuffer 的实例化API时,浏览器应该表示 API 调用的位置。这种实例化类似于使用
eval
执行 JavaScript.因此,如果浏览器有一个现有的方法来表示eval
调用的位置,它可以使用一个类似的方法WebAssembly.instantiate
。例如,如果浏览器使用foo.js line 10 > eval
或eval at bar (foo.js:10:3)
foreval
,则它可以分别使用foo.js line 10 > WebAssembly.instantiate
或WebAssembly.instantiate at bar (foo.js:10:3)
。脱机工具可能会使用文件名。 - 对模块偏移量使用十六进制符合本机工具中的常见约定 例如 objdump(其中地址以十六进制打印),并使它们在视觉上与 JavaScript 行号不同。其他数字用十进制表示。
虽然的 name
属性导出的 WebAssembly 函数是由 JS API 指定的,但合成的函数名称也会显示在其他上下文中,如 devtool callstacks 和 Error.stack
。如果 WebAssembly 模块包含“名称”部分,则应使用这些名称来合成函数名称,如下所示:
- 如果存在函数名称子部分,则显示的名称应为
${module_name}.${function_name}
或${function_name}
,具体取决于模块名称是否存在。 - 否则,输出可以是上下文相关的:
- 如果函数名显示在堆栈跟踪中其位置的旁边,则只能使用模块名(如果存在)或空字符串(因为函数索引已经在该位置中)。
- 否则,
${module_name}.wasm-function[${funcIndex}]
应使用或wasm-function[${funcIndex}]
来传递函数索引。
请注意,本文档并未指定字符串的完整格式,例如堆栈帧表示;这允许引擎继续使用 JavaScript 的现有格式(现有代码可能已经依赖于此),同时仍然以与 JavaScript 一致的格式打印 WebAssembly 框架。
WebAssemblymodules允许自然与 ES6 模块系统集成。
WebAssembly 模块可以具有使用 UTF-8 字节序列标识的导入和导出。导出名称到导出的映射的最自然的 Web 表示是一个 JS 对象,其中每个导出都是一个具有以 UTF-16 编码的名称的属性。如果 WebAssembly 模块的导入或导出的名称未根据以下转换算法完全转换为 UTF-16,则 WebAssembly 模块将无法在 Web 上进行验证(假设 WebAssemble 名称位于 Uint8Array
调用 array
中):
function convertToJSString(array)
{
var string = "";
for (var i = 0; i < array.length; ++i)
string += String.fromCharCode(array[i]);
return decodeURIComponent(escape(string));
}
这将使用常见的 JS 习语执行 UTF8 解码( decodeURIComponent(escape(string))
)。检测到 decodeURIComponent
转码失败,可能会抛出 URIError
。如果是,WebAssembly 模块将不进行验证。此验证规则仅对 Web 嵌入是强制性的。
WebAssembly 的security模型应依赖于[same-origin policy][]、[cross-origin resource sharing (CORS)][]和[subresource integrity][],以支持通过内容分发网络进行分发,并实现动态链接。
一次支持 SIMDWebAssembly 将:
- 静态类型的,类似[SIMD.js-in-asm.js][]于;
- 操作语义的重用规范(与 TC39);
- 重用后端实现(相同的 IR 节点)。
一次支持 GC,WebAssembly 代码将能够引用和访问 JavaScript、DOM 和一般 WebIDL 定义的对象。
[same-origin policy]: https://www.w3.org/Security/wiki/Same_Origin_Policy [cross-origin resource sharing (CORS)]: https://www.w3.org/TR/cors/ [subresource integrity]: https://www.w3.org/TR/SRI/ [SIMD.JS-in-ASM.JS]:http://discourse.specifiction.org/t/request-for-comments-simd-js-in-asm-js