作者回复: 嗯嗯,收到你的反馈了。主要是考虑到内容的先后顺序,所以这里还是选择从字节码的角度来介绍 Wasm Section 的组成结构。可以先有个大致印象,关于 WAT 的角度,在 06 中会提到哈。
作者回复: 这是一个很好的问题。你可以设想一下,如果我不对这些数字值进行压缩的话,我在解码时如何知道这个给定的数字值有多长呢?假设一个 u32 类型的值,如果所有数字都按照 32 位完全展开的方式编码,那对于一个简单数字比如 2,我都需要在二进制格式里把它完全展开成 32 位,这样至少在解码时我才能知道那部分属于整个数字,哪部分是指令。但这种方式就会浪费很多空间,存在很多无意义的占位 0。但如果可以使用 LEB128 这类可变长编码对数字值进行编码,对这个数字的识别就会简单的多,并且也不需要完全展开再进行编码。当然即使有填充字节 0x80 \ 0xff 存在,这个编码也是合法的。
作者回复: 关于 Section 的内部组成结构可以参考官方标准:https://webassembly.github.io/spec/core/binary/modules.html
作者回复: 是的,会抛出 Runtime Exception。anyfunc 作为一个类型,其具体形式是由宿主环境定义的,也就意味着在调用 call_indirect 的时候宿主环境会去检测 Table 中对应位置存放的值是不是可以被作为 anyfunc,如果不是则抛出运行时错误。当然,宿主环境也同样会阻止非 anyfunc 类型被存放在 Table 中。
作者回复: 有哪里没看懂吗?
作者回复: 具体看编译器,但都是合法的。 However, “trailing zeros” are still allowed within these bounds. For example, 𝟶𝚡𝟶𝟹 and 𝟶𝚡𝟾𝟹 𝟶𝚡𝟶𝟶 are both well-formed encodings for the value 3 as a u8.
作者回复: varuint32 表示的是被编码的数字本身可以表示为 32bit,并不是说编码的结果是 32bit。函数签名的部分可以对照上文给出的 Type Section 的组成结构进行分析。