rustwasm / team

A point of coordination for all things Rust and WebAssembly
MIT License
1.44k stars 59 forks source link

Figuring out a proper JS fallback #175

Open CryZe opened 6 years ago

CryZe commented 6 years ago

I feel like we should have some reasonable solution for supporting older browsers. So far I haven't really found a good solution so that's why I'm bringing it up here. Also once we have a good solution, we should probably document it.

alexcrichton commented 6 years ago

AFAIK there's two major solutions here:

  1. Use wasm2asm in Binaryen. The wasm-bindgen repo has an example of this and has a mode for the wasm2es6js tool which runs wasm2asm.
  2. Use a wasm emulator in the browser, mentioned here.

Neither of these solutions is robust (AFAIK) in the sense that wasm2asm still has a lot of shortcomings and I'm not sure if there's much progress towards emulating wasm in the browser through JS.

I'd personally see wasm2asm as the best route forward here, but it'd certainly require a lot more love before we could officially recommend it I think

Pauan commented 6 years ago

There's also asmjs-unknown-emscripten (though obviously that has the overhead of emscripten)

xtuc commented 6 years ago

I'll do more concrete benchmark on the JavaScript interpreter inplementation. What would be acceptable performances?

Pauan commented 6 years ago

@xtuc It will vary from project to project. Some projects may be fine with a 100x slowdown, others obviously will find that unacceptable.

tlively commented 6 years ago

I should be free to continue work on wasm2asm soon if that would be useful to the community.

CryZe commented 6 years ago

Alright, I've dug a bit further into this and this seems to be the current state:

  1. There's a WebAssembly interpreter called webassemblyjs, but that straight up just crashes completely on a stack overflow on Internet Explorer.
  2. Compiling wasm to asm.js via wasm2asm doesn't work for any actual large project as a lot of instructions aren't implemented right now.
  3. While asmjs-unknown-emscripten is a solution, I'm trying to actually switch away from emscripten as it hugely reduces the amount of potential contributors to the project as people don't really want to compile full on LLVM just to contribute to the project. That's a huge turn off.
xtuc commented 6 years ago

@CryZe I should have mentioned it before sorry. I'm the author of webassemblyjs.

First, could you please open an issue with the crash? Thanks. Currently the interpreter doesn't support the full instruction set and on my few microbenchmarks It's arround 50 times slower than native.

On a side note, is that I'd like to take advantage of asm.js semantics in the interpreter.

fitzgen commented 6 years ago

binaryen's wasm2js (ne wasm2asm) has been getting a lot of love (mostly from @alexcrichton) recently. I think this is what we should recommend going forward.

With that in mind, would anyone like to write a section of the book about making JS fallback work via wasm2js?

jrvidal commented 5 years ago