可移植性

优质
小牛编辑
133浏览
2023-12-01

WebAssembly的二进制格式是被设计成可在不同操作系统与指令集上高效执行的,无论在Web非Web环境中。

对高效执行的设想

尽管执行环境是有条件的,本地的,不确定的,也不要向WebAssembly提供下述特性。有些情况下为了WebAssembly模块执行,也许不得不模拟一些宿主硬件或操作系统不提供的特性,让它们似乎被支持。这种情况将会导致糟糕的性能。

随着WebAssembly的标准化推进,我们期望将这些需求也能被固定下来。WebAssembly在设计之初就应该适配未来的平台。

WebAssembly可移植性假定执行环境提供下列特性:

  • 8位字节。
  • 内存可按字节维度寻址。
  • 支持未对齐的内存访问或因软件仿真导致的已知缺陷。
  • 32位有符号整数有两个补码,64位可选。
  • IEEE 754-2008 32位和64位浮点数,除了一些例外
  • 小端字节序。
  • 可使用32位指针或索引有效处理内存区域。
  • WebAssembly64 使用64位指针或索引额外支持大于4GB的线性内存。
  • 执行在同一机器上的WebAssembly模块与其他模块或进程强制安全隔离
  • 提供一个进程担保所有线程的执行的执行环境(即便它们以非并行方式执行)
  • 访问8、16、32位自然对齐内存时,可用无锁原子运算符。至少也要包含一个原子级的比较和交换运算符(或同等的加载连接/条件存储)。
  • WebAssembly64 访问64位自然对齐内存时,额外需要无锁原子运算符。

API

WebAssembly没有指定任何API或系统调用,只有一个导入机制,需宿主环境定义一组可导入对象。Web环境中,方法通过由开放Web平台制定的Web APIs访问。非Web环境中可以执行一些基础的Web APIs,基础的非Web APIs(例如POSIX),或者自己发明一个。

源码级别

C/C++级别的可移植性可用过面向一个基础API(例如POSIX)编码达成,也可以依赖编译时(通过#ifdef)或运行时(通过 功能发现)和动态加载/链接)编译器和/或库向宿主环境的可用导入们提供的基础接口达成。