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

v 站三年的陈年 flag 拔旗了, 代码终于写好了呢...

  •  7
     
  •   Mohanson · 2020-05-08 19:45:37 +08:00 · 4851 次点击
    这是一个创建于 1686 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前情提要:

    1. 2018 年 12 月, "最近在写 WebAssembly 虚拟机": https://v2ex.com/t/520987
    2. 2019 年 1 月, "WebAssembly 虚拟机的纯 Python 实现: py-wasmi MVP 版本 release": https://v2ex.com/t/523261

    为甚么要插旗子呢, 因为拔旗的时候很快乐... 下面是正文

    pywasm 1.0 版本发布

    在过去的一段时间里, pywasm 加足马力, 一口气将自身版本号从 0.4.6 版本升到 1.0.0 版本, 这意味着它已经做好了 Ready for product 的准备!

    pywasm 是什么? pywasm 是使用纯 Python 编写的 WebAssembly 解释器. 项目地址: https://github.com/mohanson/pywasm

    pywasm 现在有哪些有趣的应用?

    pywasm 在这段时间干了什么?

    重写 LEB128 不定长整数编码算法. 它是 python 环境下第一个关于 LEB128 算法的轮子, 你可以直接 pip install leb128 来下载和使用它. 相比起 0.4.6 版本, 它带来了大约 120% 左右的性能提升.

    重写 WebAssembly Parser. 要运行一段代码首先得解析它, 不是吗? 更快, 代码更清晰!

    重写浮点数指令. 在 0.4.6, 浮点数使用 python 内置 float 来完成, 但这存在问题, 因为 Python 的 float 几乎完全不符合 IEEE 754 标准. 现在, numpy 承担了这部分工具. Python, 为甚么你就不愿意好好的设计整数和浮点数这两种基本类型呢? 不定长的整数和浮点数看上去很吸引人, 但对于底层开发来说真的是大灾难.

    重写 Runtime 结构. 目前的代码结构更加符合 WebAssembly 核心规范所描述的虚拟机结构. 这存粹是为了方便阅读而作的优化.

    采用多栈结构替换单栈结构. 每一个函数调用都有一个全新的栈, 虽然和规范有所出入, 但真的很 awesome! 另外多栈的好处是调用栈的快速销毁: 当退出一个函数时, 直接抛弃该函数的栈即可, 而无需过多与父函数交互.

    完整的兼容性. 为了不破坏早期使用者的体验, 此次升级保持向上兼容.

    完整的测试. pywasm 项目的启动是在 3 年前, 那时候 WebAssembly 还处在早期阶段, 官方并未发布组织结构良好的测试用例. 在发现官方将四处散落的测试用例集合并以一个 Mirror repo 公布时, pywasm 立即更新了自身的测试. 对于解析和验证无误的 wasm module, pywasm 已经做到 100% 测试通过.

    pywasm 的未来

    • 思考 JIT 或 AOT 方案. 虽然已经有初步尝试, 但它需要外援!
    • WASI(WebAssembly System Interface), 不过这得等该规范 stable 后开始动手.
    • 多线程和多返回值支持, 同样得等该规范 merge 入 wasm core spec 后开始动手.

    对 WebAssembly 的思考和吐槽

    这家伙不是一个指令集标准, 而是一门语言标准! 它在运行过程中上下文环境太强, 这与我认知的 ISA 可区别贼大了, 更像是一门二进制编程语言...

    25 条回复    2020-05-09 23:37:31 +08:00
    April5
        1
    April5  
       2020-05-08 19:52:34 +08:00
    火钳流明
    qq316107934
        2
    qq316107934  
       2020-05-08 19:57:17 +08:00
    卧槽,太强了!! 请问有 benchmark 吗,相比原生的浏览器 wasm 环境损失多少?
    jmc891205
        3
    jmc891205  
       2020-05-08 19:57:32 +08:00 via iPhone
    恭喜恭喜
    1.0 撒花🎉
    makefei
        4
    makefei  
       2020-05-08 19:59:01 +08:00 via iPhone
    nb
    Mohanson
        5
    Mohanson  
    OP
       2020-05-08 20:08:22 +08:00   ❤️ 2
    @qq316107934 既然都用上 python 了, benchmark 这么尴尬的问题就... 好吧, 慢两个数量级(狗头
    lacewingcc
        6
    lacewingcc  
       2020-05-08 21:25:12 +08:00
    撒花撒花
    lekai63
        7
    lekai63  
       2020-05-08 21:28:31 +08:00 via iPhone
    撒花🎉
    guyskk0x0
        8
    guyskk0x0  
       2020-05-08 21:53:00 +08:00 via Android
    既然性能差距这么大,肯定干不过 rust 或 go 实现的,这个方向继续下去也只能当个玩具吧。

    不如想想别的方向,比如专心做“胶水”,让(任何) wasm 程序能在 python 里直接调用?或者让别的语言能直接调用 python 包?
    Mohanson
        9
    Mohanson  
    OP
       2020-05-08 22:24:23 +08:00   ❤️ 2
    @guyskk0x0 赞同前 1/4 部分. python 虽然慢, 但依然比较适合做早期 demo 进行快速验证, 然后逐步替换成高性能编程语言; 当选择使用 Python 时, 就已经默认不会运行复杂算法除非是 C 绑定了... 所以不是对跑视频解码等这些复杂工作抱有信心.

    对于"Why did", 不知可否反问一句"Why not", 脑洞, 这一切都是为了神奇的脑洞.
    ruby0906
        10
    ruby0906  
       2020-05-08 22:33:27 +08:00
    @Mohanson 支持楼主,支持脑洞~~
    lithbitren
        11
    lithbitren  
       2020-05-08 22:37:07 +08:00
    tql nb
    Mohanson
        12
    Mohanson  
    OP
       2020-05-09 08:01:53 +08:00 via Android   ❤️ 2
    python 社区有一个讨论,是将 wasm runtime 加入标准库,提案人提到了 pywasm 并成功用它做了实验,woooooooooooo!

    https://discuss.python.org/t/add-a-webassembly-wasm-runtime/3957
    dyllen
        13
    dyllen  
       2020-05-09 09:35:22 +08:00
    大佬。。。
    dukiduki
        14
    dukiduki  
       2020-05-09 09:41:27 +08:00 via Android
    @Mohanson 这原来不是一个玩具???恭喜(酸
    wangyzj
        15
    wangyzj  
       2020-05-09 10:56:55 +08:00 via iPhone
    nb
    binbinyouliiii
        16
    binbinyouliiii  
       2020-05-09 11:26:10 +08:00
    大佬,看过你博客上面的很多内容,学到了很多。

    看 GBA 那个章节好像是要写成书吗?出来了一定支持
    Mohanson
        17
    Mohanson  
    OP
       2020-05-09 11:42:07 +08:00
    @binbinyouliiii 因为收到任天堂的邮件警告, 出书木得希望了, 所以干脆直接全部公开了, 不过还有一小部分内容图片太多嫌麻烦没整理, 当时为了凑页数加上的教你如何开发 GBA 游戏的一章...
    binbinyouliiii
        18
    binbinyouliiii  
       2020-05-09 11:53:55 +08:00
    @Mohanson #17 残念 ,任天堂还挺小气的
    guyskk0x0
        19
    guyskk0x0  
       2020-05-09 12:22:45 +08:00
    @Mohanson #12 看来已经能在 Python 里直接调用 wasm 了?赞!
    kylix
        20
    kylix  
       2020-05-09 13:04:32 +08:00
    留个名先~~~
    geekzhu
        21
    geekzhu  
       2020-05-09 13:11:01 +08:00
    看到大佬当然是要支持的
    hu6360567
        22
    hu6360567  
       2020-05-09 13:40:04 +08:00
    最近在使用 wamr,有 JIT 和 AOT 的实现,有时间可以研究一下啊
    Mohanson
        23
    Mohanson  
    OP
       2020-05-09 14:54:45 +08:00
    @hu6360567 谢谢, 正准备看大量的资料和不同的实现
    panlilu
        24
    panlilu  
       2020-05-09 19:11:31 +08:00
    666666
    sivacohan
        25
    sivacohan  
       2020-05-09 23:37:31 +08:00
    行吧,我在来小额赞助一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5270 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:58 · PVG 13:58 · LAX 21:58 · JFK 00:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.