V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Mohanson
V2EX  ›  程序员

对于 WebAssembly 2.0 的一些看法

  •  
  •   Mohanson · 107 天前 · 2028 次点击
    这是一个创建于 107 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做 wasm 2.0 的一些工作, 由于我是 wasm 1.0 draft 时代入坑并退坑的人, 错过了 wasm 1.0 release 和 wasm 2.0 draft, 因此花了差不多两周时间追上了当前的 wasm 2.0 draft 的进度. 长话短说, wasm 2.0 从技术上来说, 不是一个很符合我哲学的设计, 只能称它"又一个平平无奇的通用计算架构".

    wasm 2.0 增加了引用类型, 并且贴心的增加了 "null" 值. 很难在 2024 年评价这个行为, 因为 "null" 最早的发明者, 在 2009 年就发表了著名的 "Null References: The Billion Dollar Mistake - Tony Hoare".

    向量指令. wasm 2.0 支持 128 位向量指令. 我认为这个行为让 wasm 的定位非常模糊. 最早 wasm 的定位是轻量级的嵌入式虚拟机, 向量指令的加入让整个技术栈非常复杂(重量化). 不能说这个行为是错的, 但是向量长度目前只支持 128 位, 其实对性能的提升非常有限. 也就是代价太高, 而收益不足.

    槽点比较大的就这两条. 未来 wasm 如何发展, 不好预言, 但可以确认的是它已经丧失了技术的美感.

    10 条回复    2025-02-04 00:22:39 +08:00
    14
        1
    14  
       107 天前
    感谢分享,我一直想把 WebAssembly 用在产品上但始终感觉很鸡肋,我的想法是能否实现使用 TS/JS 这样通用动态的语言编写逻辑,再编译成 WebAssembly 高性能隔离执行,但是现在的问题是编写方面 TS/JS->WebAssembly 只有 QuickJS/AssemblyScript /javy 这样的选择缺乏真正全功能支持,而执行方面也缺乏稳定可靠的方案。
    musi
        2
    musi  
       107 天前 via iPhone
    感觉 wasm 还需要让子弹飞一会
    huangsen365
        3
    huangsen365  
       107 天前
    bolt.new webassembly 了解下
    buffzty
        4
    buffzty  
       107 天前
    活捉野生大佬一只 几年前看你博客学了好多.
    我比较关注 wasi 这个能做起来可能比较好, 还有 webTransport webgpu
    pursuer
        5
    pursuer  
       107 天前
    wasm 最初的目的是在浏览器中使用,加速编解码之类的,所以有 SIMD 是很顺理成章的。但是 wasm 应该支持特性探测,允许运行时实现不支持部分高级特性。
    空安全可以通过高级语言实现,倒也不必一定要在 wasm 层面纠结,但是我是没懂为什么每种引用类型需要用一个单独的 table
    Mohanson
        6
    Mohanson  
    OP
       107 天前
    @pursuer

    > 但是我是没懂为什么每种引用类型需要用一个单独的 table

    为 externref 建单独的 table 主要是为了方便未来为 wasm 引入 GC. 就目前的 wasm 2.0 draft 来看, externref table 几乎没有任何实际的用处, 事实上也是如此, wasm 2.0 的测试集里也几乎没有关于 externref table 的测试用例.

    为 wasm 引入 GC 也是一个值得吐槽的事情. 他们做了这么多的工作, 似乎只是为了在浏览器里实现另一个 JVM.
    Mohanson
        7
    Mohanson  
    OP
       107 天前
    最近重新开始关注 wasm, 发现当年和我同期开始/进行的比较著名的 wasm 项目许多都已经纷纷 archive / 不再维护, 挺有感触. 当然现在也有一些新的项目新开始 ... 很唏嘘.
    jones2000
        8
    jones2000  
       106 天前
    wasm 能使用的权限越来越小了, 想要通过 wasm 去联动一些外部的 PC 终端的软件,都搞不了了。
    flmn
        9
    flmn  
       105 天前
    我没研究过 wasm 2.0 ,但我觉得 null 没问题啊。这个 null 是给编译成 wasm 的编译器准备的,不是给开发者准备的,又不是手写 wasm 。对于编译器开发者,给他们能力,相信他们能做好。
    所以,引用 Null References: The Billion Dollar Mistake - Tony Hoare 来说 wasm 的 null 不太合适。
    agagega
        10
    agagega  
       14 天前
    在 WebAssembly 这个层面引入 Null Reference 没有问题。像 Java 这样的语言,null 引发问题,是因为 Java 代码是程序员手写出来的,而 Java 代码要通过编译器转换到 JVM 字节码,然后再 JIT 到机器语言才能运行,所以在 Java 语言层面可以用高级类型系统避免程序员忽视 null ,但 WebAssembly 和 JVM 字节码一样是很底层的东西,一方面程序员不会手写它,另一方面在底层语言上加额外的类型系统会完全不兼容整个指令集设计。

    如果 WebAssembly 的目的是描绘一种可移植但又尽量贴近不同 CPU 真实指令集的话,向量指令是有意义的。128 位是各个平台的公约数,像 Arm 或者 PowerPC 实际上不支持 256 位向量,而 v8 在 x86 上内部会尝试把两个 v128 合成 v256 。其实 x86 这种每轮增加新指令集表示更长向量的方法也被人批评过。更好的做法是类似 RISC-V V Extension 或者 Arm SVE ,把向量具体的长度交由运行时决定,但可能因为复杂度偏高,WebAssembly 拒绝了这个做法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3318 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:50 · PVG 19:50 · LAX 03:50 · JFK 06:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.