实现限制¶
实现通常会在 WebAssembly 模块或执行的许多方面施加额外的限制。这些限制可能源于
物理资源限制,
嵌入器或其环境施加的约束,
所选实现策略的限制。
本节列出了允许的限制。如果限制采取数字限制的形式,则不会给出最低要求,也不假设这些限制是具体、固定的数字。但是,预期所有实现都具有“合理”的较大限制,以支持常见应用程序。
注意
符合标准的实现不允许省略单个功能。但是,未来可能会指定 WebAssembly 的指定子集。
语法限制¶
结构¶
实现可能会对模块的以下维度施加限制
二进制格式¶
对于以二进制格式给出的模块,可能会对以下维度施加额外的限制
文本格式¶
对于以文本格式给出的模块,可能会对以下维度施加额外的限制
验证¶
如果函数被证明无效,则调用以及对同一函数的每次后续调用都会导致陷阱。
注意
这是为了允许实现对函数使用解释或即时编译。在函数体执行开始之前,函数必须仍然经过完全验证。
执行¶
在 WebAssembly 程序的执行 期间,可能会对以下维度施加限制
分配的模块实例 的数量
分配的函数实例 的数量
分配的表实例 的数量
分配的内存实例 的数量
分配的全局变量实例 的数量
表实例 的大小
内存实例 的大小
堆栈上的帧 的数量
堆栈上的标签 的数量
堆栈上的值 的数量
如果实现的运行时限制在计算执行期间被超过,则它可能会终止该计算并向调用代码报告嵌入器特定的错误。
上面的一些限制可能已经在实例化期间得到验证,在这种情况下,实现可能会以与语法限制 相同的方式报告超过。
注意
具体的限制通常不是固定的,但可能取决于具体情况,相互依赖,随着时间推移而变化,或取决于其他实现或嵌入器特定的情况或事件。