编译 TypeScript、C++和 Rust 到 WebAssembly

2017-12-31 17:39:38 +08:00
 dtysky

心得和例子已被整合到工程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 下来研究,写的都很全了。

如有疏忽请指出。

7839 次点击
所在节点    JavaScript
5 条回复
bramblex
2017-12-31 17:50:53 +08:00
好东西啊好东西,最后心疼一下 js
AngelCriss
2017-12-31 19:07:59 +08:00
@bramblex 又见 jj 的思念
zhouheyang0919
2018-01-01 13:31:38 +08:00
现在 Rust 的 nightly 版本有一个 target: wasm32-unknown-unknown 可以直接编译到 WebAssembly,不需要手动编译到 LLVM bitcode 或借助 emscripten.
dtysky
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
2019-06-12 02:22:17 +08:00
作者看起来维护着维护着就维护凉了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/419029

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX