WebAssembly

WebAssembly 是一种可在现代 Web 浏览器中运行的代码类型 - 它是一种低级类似汇编的语言,具有紧凑的二进制格式,以接近本机的性能运行,并为 C/C++、C# 和 Rust 等语言提供编译目标,以便它们可以在 Web 上运行。它还旨在与 JavaScript 协同运行,允许两者协同工作。

简而言之

WebAssembly 对 Web 平台具有重大影响 - 它提供了一种方法,可以在 Web 上以接近本机的速度运行用多种语言编写的代码,使以前无法在 Web 上运行的客户端应用程序能够在 Web 上运行。

WebAssembly 旨在补充 JavaScript 并与 JavaScript 协同运行 - 使用 WebAssembly JavaScript API,您可以将 WebAssembly 模块加载到 JavaScript 应用程序中并在两者之间共享功能。这使您可以利用 WebAssembly 的性能和强大功能以及 JavaScript 的表达能力和灵活性在同一个应用程序中,即使您不知道如何编写 WebAssembly 代码。

更棒的是,它正在通过 W3C WebAssembly 工作组社区组 作为 Web 标准开发,所有主要浏览器供应商都积极参与其中。

指南

WebAssembly 概念

通过阅读 WebAssembly 背后的高级概念来开始 - 它是什么,为什么它如此有用,它如何融入 Web 平台(以及超越),以及如何使用它。

将新的 C/C++ 模块编译到 WebAssembly

在您用 C/C++ 编写代码后,您可以使用 Emscripten 等工具将其编译为 Wasm。让我们看看它是如何工作的。

将现有 C 模块编译到 WebAssembly

WebAssembly 的一个核心用例是利用现有的 C 库生态系统,让开发人员能够在 Web 上使用它们。

从 Rust 编译到 WebAssembly

如果您编写了一些 Rust 代码,您可以将其编译为 WebAssembly!本教程将带您了解将 Rust 项目编译为 Wasm 并将其用于现有 Web 应用程序所需的一切知识。

加载和运行 WebAssembly 代码

在您拥有 Wasm 模块后,本文介绍了如何获取、编译和实例化它,将 WebAssembly JavaScript API 与 FetchXHR API 结合使用。

使用 WebAssembly JavaScript API

加载 Wasm 模块后,您将需要使用它。在本文中,我们将向您展示如何通过 WebAssembly JavaScript API 使用 WebAssembly。

导出 WebAssembly 函数

导出的 WebAssembly 函数是 WebAssembly 函数的 JavaScript 反射,它们允许从 JavaScript 调用 WebAssembly 代码。本文描述了它们是什么。

了解 WebAssembly 文本格式

本文解释了 Wasm 文本格式。这是 Wasm 模块的低级文本表示形式,在调试时在浏览器开发人员工具中显示。

将 WebAssembly 文本格式转换为 Wasm

本文提供了一份指南,介绍如何将用文本格式编写的 WebAssembly 模块转换为 Wasm 二进制文件。

API 参考

WebAssembly 指令参考

提供交互式示例的 WebAssembly 运算符集的参考文档。

WebAssembly JavaScript 接口

此对象充当所有 WebAssembly 相关功能的命名空间。

WebAssembly.Global()

WebAssembly.Global 对象表示一个全局变量实例,可以从 JavaScript 访问,并且可以在一个或多个 WebAssembly.Module 实例之间导入/导出。这允许多个模块的动态链接。

WebAssembly.Module()

WebAssembly.Module 对象包含无状态的 WebAssembly 代码,该代码已由浏览器编译,可以有效地 与 Worker 共享,并且可以多次实例化。

WebAssembly.Instance()

WebAssembly.Instance 对象是 Module 的有状态可执行实例。Instance 对象包含所有 导出的 WebAssembly 函数,这些函数允许从 JavaScript 调用 WebAssembly 代码。

WebAssembly.compile()

WebAssembly.compile() 函数将 WebAssembly 二进制代码编译为 WebAssembly.Module 对象。

WebAssembly.compileStreaming()

WebAssembly.compileStreaming() 函数直接从流式底层源编译 WebAssembly.Module

WebAssembly.instantiate()

WebAssembly.instantiate() 函数允许您编译和实例化 WebAssembly 代码。

WebAssembly.instantiateStreaming()

WebAssembly.instantiateStreaming() 函数是编译和实例化 WebAssembly 代码的主要 API,返回 Module 及其第一个 Instance

WebAssembly.validate()

WebAssembly.validate() 函数验证给定的 WebAssembly 二进制代码的类型化数组。

WebAssembly.Memory()

WebAssembly.Memory 对象是可调整大小的 ArrayBuffer,它保存由 Instance 访问的内存的原始字节。

WebAssembly.Table()

WebAssembly.Table 对象是可调整大小的类型化数组,其中包含不透明的值,例如函数引用,这些值由 Instance 访问。

WebAssembly.Tag()

WebAssembly.Tag 对象定义了可以抛出到/从 WebAssembly 代码的 WebAssembly 异常类型。

WebAssembly.Exception()

WebAssembly.Exception 对象表示从 WebAssembly 抛出到 JavaScript 的运行时异常,或从 JavaScript 抛出到 WebAssembly 异常处理程序的异常。

WebAssembly.CompileError()

创建一个新的 WebAssembly CompileError 对象。

WebAssembly.LinkError()

创建一个新的 WebAssembly LinkError 对象。

WebAssembly.RuntimeError()

创建一个新的 WebAssembly RuntimeError 对象。

示例

规范

规范
WebAssembly JavaScript 接口
# webassembly-namespace
WebAssembly JavaScript 接口
# ref-for-syntax-numtype①⓪
未知规范
未知规范
未知规范
未知规范
WebAssembly 核心:垃圾收集
# garbage-collection①
未知规范
未知规范
WebAssembly JavaScript 接口
# dom-globaldescriptor-mutable
未知规范
未知规范
未知规范
未知规范
未知规范

浏览器兼容性

webassembly.api

BCD 表格仅在浏览器中加载

webassembly.BigInt-to-i64-integration

BCD 表格仅在浏览器中加载

webassembly.bulk-memory-operations

BCD 表格仅在浏览器中加载

webassembly.exception-handling

BCD 表格仅在浏览器中加载

webassembly.extended-constant-expressions

BCD 表格仅在浏览器中加载

webassembly.fixed-width-SIMD

BCD 表格仅在浏览器中加载

webassembly.garbage-collection

BCD 表格仅在浏览器中加载

webassembly.multiMemory

BCD 表格仅在浏览器中加载

webassembly.multi-value

BCD 表格仅在浏览器中加载

webassembly.mutable-globals

BCD 表格仅在浏览器中加载

webassembly.non-trapping-float-to-int-conversions

BCD 表格仅在浏览器中加载

webassembly.reference-types

BCD 表格仅在浏览器中加载

webassembly.sign-extension-operations

BCD 表格仅在浏览器中加载

webassembly.tail-calls

BCD 表格仅在浏览器中加载

webassembly.threads-and-atomics

BCD 表格仅在浏览器中加载

另请参阅