逃离STL方言,又入WIT迷宫:C++与WASM互操作的另一面
本以为逃开 C++ 跨编译器的“方言”问题,投奔 WASM 的标准化怀抱就能一身轻松。结果,一脚踩进了 WIT(WebAssembly Interface Types) 的坑里,发现这里的水也挺深。
事情得从 WASI(WebAssembly System Interface) 说起。它的初心很简单:把系统调用封装成 wasm 能用的函数。早期版本(WASI Preview1)直接用 i32/i64 这类底层类型当指针或句柄,配上 C ABI,虽然粗糙但直接。问题出现在大家想用它正经传递点高级数据——比如在不同语言间传个字符串或数组。这时候,光靠“指针+长度”的裸奔模式就顶不住了,内存布局、编码、生命周期管理……每个环节都可能对不上。
于是 Preview2 登场,带来了 WIT 和 Component Model,想用一套中立的接口描述语言来解决类型互操作。理想很宏大:写一份 .wit 文件,工具链自动生成各语言的打包/解包代码,实现跨语言无缝调用。可惜,目前它还处在“测试阶段”,生态和工具链都在追赶中,而且一个明显的现实是:这套模型目前在 Rust 生态外能用得非常有限。
更让我觉得有趣(也有点困惑)的是,Component Model 在全局初始化、导入导出这些设计上,竟和我自己设计的 ISDK 语言思路高度相似。这种共鸣感一闪而过,随即被一个根本性质疑取代:你作为基于字节码的底层虚拟机,难道不应该优先确定最稳定、最基础的 ABI 吗? 现在这种先定义上层组件模型、再让底层去适应的方式,感觉顺序有点倒置了。