Skip to content

Latest commit

 

History

History
128 lines (78 loc) · 10.9 KB

Web.md

File metadata and controls

128 lines (78 loc) · 10.9 KB

网络嵌入

不出所料,WebAssembly 的主要用途之一是在 Web 上运行,例如嵌入到 Web 浏览器中(尽管这是不是它唯一的目的)。

这意味着与 Web 生态系统集成,利用 Web API,支持 Web 的安全模型,保留 Web 的可移植性,并为进化开发留出设计空间。其中许多目标都清楚地反映在 WebAssembly 中高层次目标。特别是,从安全的角度来看,WebAssembly MVP 不会比 JavaScript 模块更宽松。

更具体地说,以下是 WebAssembly 与已考虑的 Web 平台其余部分之间的接触点列表:

JavaScript API

JavaScript API提供了允许 JavaScript 编译 WebAssembly 模块、在已编译模块上执行有限反射、从离线存储中存储和检索已编译模块、使用 JavaScript 导入实例化已编译模块、调用实例化模块的导出函数、对实例化模块的导出内存进行别名等。

Web 嵌入包括在该上下文中有用的其他方法。在非 Web 嵌入中,这些 API 可能不存在。

其他 Web 嵌入 API

WebAssembly.Compilestreaming

为里程碑 2:cyclone: 添加了开发人员必须检测的功能。

在 Web 嵌入中,添加了以下方法。

注意,期望 compileStreaminginstantiateStreaming 都存在或都不存在。

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 对象一起使用。发生故障时,根据故障类型, Promiserejected WebAssembly.CompileErrorTypeError

解析 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

WebAssembly.InstantiateStreaming

为里程碑 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.ModuleWebAssembly.Instance 的纯 JavaScript 对象对 {module, instance}。返回对的 2 个属性 moduleinstance 是可配置的、可枚举的和可写的。

失败 Promise 时,根据失败的原因,rejected带有 TypeErrorWebAssembly.CompileErrorWebAssembly.LinkErrorWebAssembly.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 > evaleval at bar (foo.js:10:3) for eval,则它可以分别使用 foo.js line 10 > WebAssembly.instantiateWebAssembly.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][],以支持通过内容分发网络进行分发,并实现动态链接

SIMD

一次支持 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