实现限制

实现通常会在 WebAssembly 模块或执行的许多方面施加额外的限制。这些限制可能源于

  • 物理资源限制,

  • 嵌入器或其环境施加的约束,

  • 所选实现策略的限制。

本节列出了允许的限制。如果限制采取数字限制的形式,则不会给出最低要求,也不假设这些限制是具体、固定的数字。但是,预期所有实现都具有“合理”的较大限制,以支持常见应用程序。

注意

符合标准的实现不允许省略单个功能。但是,未来可能会指定 WebAssembly 的指定子集。

语法限制

结构

实现可能会对模块的以下维度施加限制

如果实现的限制对于给定模块被超过,则实现可能会拒绝该模块的验证、编译或实例化,并返回嵌入器特定的错误。

注意

最后一项允许在没有 Unicode 支持的有限环境中运行的 嵌入器导入导出 的名称限制为常见的子集,例如 ASCII

二进制格式

对于以二进制格式给出的模块,可能会对以下维度施加额外的限制

文本格式

对于以文本格式给出的模块,可能会对以下维度施加额外的限制

验证

实现可能会将单个函数验证 延迟到它们第一次被调用 时。

如果函数被证明无效,则调用以及对同一函数的每次后续调用都会导致陷阱

注意

这是为了允许实现对函数使用解释或即时编译。在函数体执行开始之前,函数必须仍然经过完全验证。

执行

在 WebAssembly 程序的执行 期间,可能会对以下维度施加限制

如果实现的运行时限制在计算执行期间被超过,则它可能会终止该计算并向调用代码报告嵌入器特定的错误。

上面的一些限制可能已经在实例化期间得到验证,在这种情况下,实现可能会以与语法限制 相同的方式报告超过。

注意

具体的限制通常不是固定的,但可能取决于具体情况,相互依赖,随着时间推移而变化,或取决于其他实现或嵌入器特定的情况或事件。