# 第 2 章：技术架构与运行机制

URL: https://caijiao.org/webassembly/basic/02-architecture
Source: docs/webassembly/basic/02-architecture.md
Description: 本章介绍了 WebAssembly 的技术架构和运行机制，包括 WASM 模块结构、执行模型与沙箱机制，以及 WebAssembly 与 JavaScript 的交互接口。

## 2.1 **WASM 模块结构**

WebAssembly 模块是由二进制格式的指令组成，它们通过文件或内存进行传输。每个 WebAssembly 模块通常包括以下几个部分：

- **模块头部**：包含有关模块的信息，例如版本、导入、导出等元数据。
- **代码段**：包含执行的 WebAssembly 指令，这部分数据是最核心的，经过编译生成的二进制代码。
- **数据段**：存储模块中用到的数据，例如常量、静态数组等。
- **导入与导出表**：导入表列出模块依赖的外部资源（如 JavaScript 函数或其他模块），而导出表则定义了模块对外暴露的功能。

这种模块化的结构使得 WebAssembly 可以在多个环境中重用，并与 JavaScript 等其他语言紧密协作。

## 2.2 **执行模型与沙箱机制**

WebAssembly 采用了一种沙箱执行模型，这意味着它的代码执行被严格限制在一个独立的、受保护的环境中，以避免对宿主环境（例如浏览器）造成风险。其执行模型包括以下特点：

- **线性内存**：WebAssembly 使用线性内存模型，通过一段连续的内存空间来存储数据。这使得内存管理更为简单，也减少了内存泄漏的风险。
- **沙箱机制**：WASM 执行代码时，无法直接访问宿主操作系统的资源（如文件系统、网络等），从而避免恶意代码的执行。通过沙箱机制，WebAssembly 能够提供安全保障。
- **无外部副作用**：WebAssembly 在执行过程中没有外部副作用，也就是说，模块不会直接修改浏览器或操作系统的状态，而是通过与 JavaScript 的交互来实现效果。

这些机制确保了 WebAssembly 在 Web 环境中的安全性和稳定性。

## 2.3 **与 JS 的交互接口**

WebAssembly 和 JavaScript 之间可以通过接口进行互操作。WebAssembly 提供了几个主要的交互方式：

- **导入与导出**：WebAssembly 模块可以导入外部资源（如 JavaScript 函数），并且可以将自己的函数导出给 JavaScript 调用。
- **通过 WebAssembly.Instance 创建实例**：JavaScript 可以加载并实例化 WebAssembly 模块，执行其中的函数。通过这种方式，JavaScript 可以与 WebAssembly 进行数据交换和调用。
- **共享内存**：WebAssembly 和 JavaScript 可以共享内存区域，使得它们能够在同一内存中操作数据。JavaScript 可以通过 WebAssembly 提供的接口访问和修改这些共享数据。

这种互操作性使得开发者可以在 Web 应用中充分利用 WebAssembly 的高性能，同时保持 JavaScript 的灵活性和生态支持。
