LLJS, asm.js, & Emscripten are really moving Javascript forward at incredible speed. I wonder if these projects will affect the future of the JS spec (ECMAScript Harmony + above). It's an exciting time to be a web programmer.
Math.imul is just an ad-hoc patch to improve the performance of Emscripten. It's totally for Firefox. Is there a motivation to standardize and implement such a thing for other browser vendors? I'll star the V8 issue though...
Yesterday I rewrote a tiny Javascript demo in asm.js and also saw an order-of-magnitude speedup. (I thought at first it didn't help at all, apparently because the framerate was limited by setInterval().)
Open the error console (via the Web Developer menu item) and you'll see messages there. Success shows up as "Error: successfully compiled asm.js code." :-)
P.S. Looking at your code, I can tell it's not asm.js conformant yet, though it should just be a bunch of small tweaks (e.g. an expression like (a+b) will need to be (a+b)|0, etc.).
I wonder if most / all of that speedup is just using typed arrays (edit: nvm, they both do). I get similar speeds in Chrome, which afaik doesn't have any special handling for `"use asm";` functions.
Typed arrays do deliver a lot of speedup, and in fact, the above example is slightly faster in Chrome than in Firefox Nightly for me. However, if your algorithm does crunch a lot of data in a low-level way, there is definitely even more performance you can get by using asm.js.
See my link in the comment below for benchmarks of a sha1 algorithm that shows a good speedup in Chrome by using TypedArrays, but an even greater one in OdinMonkey.
Whats the use for LLJS ? I dont really get it.
So its not meant to be used in web development but for things like games or complete VMs. But isnt it much simpler for those cases to compile existing C codebases with emscripten instead of rewriting everything in LLJS ?
Even if you start today with writing a new game engine, wouldnt it make more sense to use C++ and be able to target any platform there is instead of just the browser?
The main use for something like LLJS is to allow you to target asm.js with new code that you write. It's true that it's probably not the best idea to completely rewrite a 3d engine in it (right now), but it gives you a quick way to rewrite core parts of an intensive app (like a 3d game) for high performance. There are "inner loops" that could benefit from a small amount of LLJS.
As the post says, it's a proof of concept and a way to open up asm.js to people who want to tinker with it without compiling C code with emscripten.
I see, so the main benefit vs compiling c to asm.js is that the development process is easier because you dont need to manually compile.
Sounds interesting to use as a scripting language inside a c based game engine. So the core of the engine would be directly compiled to asm.js while the game logic scripting could be done in LLJS to be able to live-test your game.
That's certainly a possibility! It would be neat to see powerful debugging tools develop, after the language stabilizes. I also like the idea of somehow linking it with emscripten-compiled code so that it can be used as a sort of scripting language.
I'd like to explore the possibility of porting some of the C toolchain to the browser too, though. It's possible that it could be quite successful, and in that case LLJS would target people who just want to write small parts of there app for asm.js.
For a big codebase, yes, compiling C/C++ using emscripten or such is a good idea. But if you want to write a tiny part of a normal JS application in something faster, lljs is convenient. Sort of like you would write inline assembly in C perhaps.
Has anyone built the entire stack in javascript (C to JS compiler in JS + standard library) so that you could write JS applications in C and compile and run in the browser?
EDIT: to clarify, the ideal solution would be an editor (like codemirror or ace) with a compile+run button that would compile the code down to JS and run it.
Oh, I see. No, not yet, I think the C compilers are complex enough to be difficult to compile with emscripten. I have no evidence for that, but I know they are incredibly complex.
The shorter path is something like LLVM, but we could see something like a compiler all in js that can take a large subset of C and compile it.
EDIT: see azakai's comment below which provides much better insight into this
Sure, but it's different because you need to compile a whole VM to asm.js and run javascript inside of it. You can't compile a dynamic language like javascript to low-level code because you need too much information at runtime.
How far are we from being able to do meaningful text processing with typed arrays and (therefore, presumably) asm.js? Last I checked, there was work being done on a string encoding/decoding standard but it wasn't implemented in browsers yet. Can anyone say more about this?