V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Mohanson
V2EX  ›  问与答

好康速递😘, 在 Python 上运行 AssemblyScript 代码!

  •  1
     
  •   Mohanson · 2020-04-21 18:17:23 +08:00 · 951 次点击
    这是一个创建于 1438 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几年还一直以为 AssemblyScript 是个玩具, 最近拿起来看了下居然发现已经蛮成熟了, 遂花了点时间让 AssemblyScript 代码可以原生跑在 Python 环境下...

    $ pip3 install pywasm
    

    pywasm 是使用纯 python 实现的 wasm 解释器, 作者就是本人, 本来已经几个月没更新了, 近期突然收到 pypa(python 的官方包管理器团队) 一开发者发来的一封感谢信, 就决定开始诈尸继续对其进行完善.

    AssemblyScript: 为 wasm 发明的编程语言

    目前为止, 许多高级语言都能编译到 wasm. 其中最成熟的是 C 语言: 毕竟在设计开发过程中 C 就是 wasm 的第一目标. 但是 C 毕竟对大众不太友好, 因此在 C 之上一门新的语言出现了, 它就是 AssemblyScript, 一门对 TypeScript 做了减法的编程语言.

    我们新建一个目录, 进入该目录

    $ npm install --save-dev assemblyscript
    $ npx asinit .
    

    asinit 命令自动创建建议的目录结构和配置文件. 然后, 打开 ./assembly/index.ts, 其源代码是一个示例的加法函数, 如下

    export function add(a: i32, b: i32): i32 {
      return a + b;
    }
    
    $ npm run asbuild
    

    运行如上命令将程序编译为 WebAssembly.

    使用根目录中的 index.js 实例化和导出 WebAssembly 模块, 您将可以像任何其它模块一样使用它, 其显着区别在于, 模块导出的唯一值是整数和浮点数. 到目前为止, 一切都很好...

    Run on pywasm

    $ vim index.py
    

    将以下代码拷贝到 index.py 中, 代码中做了两件事: 载入 wasm 二进制文件, 并调用函数 add(10, 20). import pywasm

    def env_abort(_: pywasm.Ctx):
        return
    
    
    vm = pywasm.load('./build/optimized.wasm', {
        'env': {
            'abort': env_abort,
        }
    })
    r = vm.exec('add', [10, 20])
    print(r)
    
    $ python3 index.py
    # 30
    

    Bingo!

    本文代码已发布至 github, 您可以直接克隆代码到本地, 如此, 就不用自己敲代码啦!

    $ git clone https://github.com/mohanson/pywasm_assemblyscript
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2469 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 15:48 · PVG 23:48 · LAX 08:48 · JFK 11:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.