W3C 联盟宣布发布一项规范,对 WebAssembly 3.0 中间代码及其相关 API 进行标准化,从而支持创建可跨浏览器和硬件平台移植的高性能应用程序。WebAssembly 提供了一种独立于浏览器的通用低级中间代码,用于运行由各种编程语言编译的应用程序。
WebAssembly 技术通过在浏览器中执行 C/C++ 等编译语言编写的代码,可用于在浏览器中运行高性能任务,例如视频编码、音频处理、图形和 3D 操作、游戏开发、加密操作以及数学计算。利用 WebAssembly 的 JIT,可以实现接近原生代码的性能水平。
WebAssembly 的主要目标之一是确保可移植性、可预测的行为以及跨不同平台的一致代码执行。WebAssembly 不仅限于浏览器,还被推广为一个可在所有基础架构、操作系统和设备上安全执行代码的通用平台。
有以下规格可供选择:
- WebAssembly Core - 描述用于运行 WebAssembly 中间代码的低级虚拟机。 与 WebAssembly 相关的资源以“.wasm”格式提供,类似于 Java 中的“.class”文件,包含静态数据和用于处理该数据的代码段。
- WebAssembly JavaScript API 提供了与 JavaScript 集成的 API。它允许您检索值并将参数传递给 WebAssembly 函数。WebAssembly 的执行遵循 JavaScript 安全模型,所有与底层系统的交互都以与 JavaScript 代码执行相同的方式进行。
- WebAssembly Web API - 定义基于 Promise 机制的编程接口,用于请求和执行“.wasm”资源。 WebAssembly 资源格式经过优化,无需等待文件完全加载即可开始执行,从而提高了 Web 应用程序的响应能力。
- WASI API - 定义一个模块化系统接口,用于在浏览器之外运行 WebAssembly 并提供对文件、网络连接、伪随机数生成器和系统时钟等资源的访问。
新版标准显著提升了对高级语言编译为 WebAssembly 的支持。例如,已实现将 Java、OCaml、Scala、Kotlin、Scheme 和 Dart 项目编译为 WebAssembly 的功能。与第二版标准相比,WebAssembly 3.0 的主要变化包括:
- 已实现对 64 位地址空间的支持。内存寻址现在可以使用 i64 类型,而不仅仅是 i32,从而将应用程序可用的地址空间从 4 GB 扩展到 16 EB(浏览器限制为 16 GB)。
- 现在,单个 WebAssembly 模块中可以同时使用多个内存对象,并处理不同的地址空间。此外,还可以在位于不同地址空间的不同内存对象实例之间复制数据。
- 新增了垃圾回收支持。除了之前可用的线性内存之外,现在还提供了一种单独的存储类型,由垃圾回收器自动管理。编译器现在可以使用单独的数据结构、数组和变量,由 WebAssembly 负责内存分配和生命周期管理。
- 新增了对类型引用的支持,它可以描述其指向值的精确结构,从而避免额外的运行时检查。现在支持子类型、类型递归以及安全使用函数引用的功能,而无需进行运行时类型和边界检查。
- 增加了对尾调用的支持,这使得当前函数在调用另一个函数后立即完成执行,而不会浪费堆栈空间。
- 增加了对异常处理的支持。
- 增加了对宽松矢量 SIMD 指令的支持,通过消除所有硬件平台上的严格语义来实现更高的性能。
- 增加了对确定性执行配置文件的支持,该配置文件定义了平台无关的行为,用于描述执行结果可能因平台而异的指令(浮点运算、NaN 返回和宽松矢量指令)。选择此配置文件后,Wasm 可确保确定性行为、可重复性和可移植性。
- 新增了创建自定义注释的语法,允许您将附加信息附加到 WebAssembly 代码中。之前,WebAssembly 二进制格式支持自定义部分(用于存储任意信息),但 WebAssembly 文本格式不支持。现在,您可以以可读且可编辑的形式添加这些信息。
- JavaScript API 中新增了内置字符串操作函数。此前,JavaScript 字符串只能作为外部引用传递给 WebAssembly,而现在您可以直接在 WebAssembly 内部访问和操作字符串。
来源: opennet.ru
