从一开始the MVP,WebAssembly 就被设计为很好地支持 C 和 C++ 代码。下面解释了 C 和 C++ 开发人员的前景。
WebAssembly 有一个非常传统的 ISA:8 位字节,2 的补码整数,小端,以及许多其他正常的属性。合理的可移植性 C/C++ 代码应该毫无困难地移植到 WebAssembly.
WebAssembly 有 32 位和 64 位架构变体,称为 WASM32 和 WASM64. WASM32 具有 ILP32 数据模型,这意味着 int
、 long
和指针类型都是 32 位的,而 long long
类型是 64 位的。WASM64 具有 LP64 数据模型,这意味着 long
和指针类型将是 64 位的,而 int
是 32 位的。
The MVP将只支持 WASM32;未来将添加对 WASM64 的支持,以支持 [64 位地址空间:unicorn:][未来 64 位]。
float
和 double
是 IEEE 754-2008 单精度和双精度类型,在 WebAssembly 中是本机类型。 long double
是 IEEE 754-2008 四精度类型,这是一种软件模拟类型。WebAssembly 没有内置的四精度类型或关联的运算符。这里的 long double 类型是在链接到需要它的 WebAssembly 应用程序的库代码中进行软件模拟的。
为了提高性能和与其他平台的兼容性, float
double
建议在大多数情况下使用。
C 和 C++ 语言的一致性在很大程度上取决于各个编译器的支持,但 WebAssembly 包含了流行的 C 和 C++ 编译器支持高质量实现所需的所有功能。
虽然the MVP功能齐全,但不久后将添加可实现更高性能的其他功能,包括:
-
零成本 C++ 异常处理。C++ 异常可以在没有此功能的情况下实现,但此功能将使它们具有较低的运行时开销。
-
支持128 位 SIMD。SIMD 将通过显式 API(如 [LLVM 的 Vector Extensions] 和 [GCC 的 Vector Extensions])、自动矢量化和来自其他平台的模拟 API(如
<xmmintrin.h>
)向 C/C++ 公开。
[LLVM 的向量扩展]:http://clang.llvm.org/docs/LanguageExtensions.html#vectors-and-extended-vectors https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html[GCC 的向量扩展]:
WebAssembly 应用程序可以使用高级 C/C++API,如 C 和 C++ 标准库、OpenGL、SDL、pthreads 等,就像在普通 C/C++ 开发中一样。在幕后,这些库通过使用 WebAssembly 实现提供的低级工具来实现其功能。在上the Web,它们利用 Web API(例如,OpenGL 在 WebGL 上执行,libc 日期和时间方法使用浏览器的日期功能等)。可以使用在其他情况下其他低级机制。
在中the MVP,WebAssembly 还没有用于库的稳定 ABI.开发人员需要确保链接到应用程序的所有代码都使用相同的编译器和选项进行编译。
将来,当 WebAssembly 扩展到支持动态链接时,预计将在伴随中定义稳定的 Abis.
WebAssembly 不会改变 C 或 C++ 语言。在编译 WebAssembly即使在 WebAssembly 本身中定义了相应的行为时,在 C 或 C++ 中导致未定义行为的事情仍然是错误。C 和 C++ 优化器仍然假设未定义的行为不会发生,因此这样的错误仍然会导致令人惊讶的行为。
例如,虽然非对齐内存访问完全定义位于 WebAssembly 中,但 C 和 C++ 编译器不保证源代码级别的(非打包)非对齐内存访问无害地转换为 WebAssembly 中的非对齐内存访问。在实践中,流行的 C 和 C++ 编译器确实在遵循对齐规则的前提下进行了优化,这意味着它们并不总是保留程序行为。
在 WebAssembly 上,始终维护主项非决定论和security不变量。恶魔实际上不能从你的鼻子里飞出来,因为那将构成从沙盒中逃跑。而且,调用堆栈不会损坏。
除此之外,在源语言级别调用未定义行为的程序可能会被编译为执行任何其他操作的 WebAssembly 程序,包括破坏应用程序的线性内存内容、使用任意参数调用 API、挂起、捕获或消耗任意数量的资源(在限制范围内)。
正在开发和移植工具帮助开发人员查找并修复代码中的此类错误。
在 C 和 C++ 中,大多数实现定义的行为都依赖于编译器,而不是底层平台。对于那些依赖于平台的细节,在 WebAssembly 上,它们自然遵循 8 位字节、32 位和 64 位二进制补码整数和32 位和 64 位 IEEE-754-2008 样式的浮点支持。
WebAssembly 可以在各种各样的平台上有效地实现,只要它们能够满足一定的要求基本期望。
WebAssembly 非常有限非决定论,因此希望编译的 WebAssembly 程序在不同的实现以及同一实现的不同版本之间表现得非常一致。