V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
dtysky
V2EX  ›  JavaScript

编译 TypeScript、C++和 Rust 到 WebAssembly

  •  
  •   dtysky · 2017-12-31 17:39:38 +08:00 · 7817 次点击
    这是一个创建于 2519 天前的主题,其中的信息可能已经有所发展或是发生改变。

    心得和例子已被整合到工程wasm-usage-guide中。

    当下,wasm 已被大多浏览器实现,其设计很巧妙,理论上任何可以编译成 LLVM 字节码的语言都可以被编译到 wasm (借助 llc 和 binary ),在这个项目中,我对几种编译方式进行了实践并总结出了一些心得:

    1. TypeScript: 现在有一个叫AssemblyScript的项目在做,借助 Binaryen,已经可以跑通一些例子了。
    2. C++ without Emscripten:直接用 clang 的前端编译到 LLVM 的 bc,然后 llc 编译到汇编文件 s,再用 Binaryen 的工具 s2wasm 从汇编文件编译到 wasm 的 ast 文件 wast,最后用 wasm-as 编译到 wasm。
    3. Rust without Emscripten:用 rustc 通过编译选项编译到 LLVM 的 bc,剩下的和 CPP 一样。
    4. C++ with Emscripten: 用 Emscripten 的 emcc 进行编译,附送一个 runtime,实现了很多实用的方法,挺有用的,推荐使用。
    5. Rust with Emscripten:rustc 的 nightly 版本现在支持一个 targetwasm32-unknown-emscripten,可以借助 emscripten 直接编译出一个 runtime 的 js 和 wasm,但似乎 emcc 自身的 arguments 传不过去...看着用吧。

    有兴趣的话,可以直接 clone 下来研究,写的都很全了。

    如有疏忽请指出。

    5 条回复    2019-06-12 02:22:17 +08:00
    bramblex
        1
    bramblex  
       2017-12-31 17:50:53 +08:00 via iPhone
    好东西啊好东西,最后心疼一下 js
    AngelCriss
        2
    AngelCriss  
       2017-12-31 19:07:59 +08:00 via Android
    @bramblex 又见 jj 的思念
    zhouheyang0919
        3
    zhouheyang0919  
       2018-01-01 13:31:38 +08:00
    现在 Rust 的 nightly 版本有一个 target: wasm32-unknown-unknown 可以直接编译到 WebAssembly,不需要手动编译到 LLVM bitcode 或借助 emscripten.
    dtysky
        4
    dtysky  
    OP
       2018-01-01 13:47:47 +08:00
    @zhouheyang0919
    嗯,昨儿有人提了个 issue,我早上加到说明里了

    Now, rustc supports another method to generate pure wasm file, please see here for resolution: [Rust for the Web]( https://www.hellorust.com/setup/wasm-target/):

    ```bash
    rustc --target wasm32-unknown-unknown yourCode.rs -o yourCode.wasm
    ```

    For reducing the size of file, your need to install **wasm-gc**:

    ```bash
    cargo install --git https://github.com/alexcrichton/wasm-gc
    wasm-gc yourCode.wasm small-yourCode.wasm
    ```
    lxml
        5
    lxml  
       2019-06-12 02:22:17 +08:00
    作者看起来维护着维护着就维护凉了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   978 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:55 · PVG 03:55 · LAX 11:55 · JFK 14:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.