11 ms·
Emscripten and asm.js: C++'s role in the modern web
- AlexeyBrin 12y agoDoes anyone know where/if the video of the presentation will be available ?
- azakai 12y agoThe conference said they would be doing editing on the videos before posting them, so I assume that will take some time (this talk was today).
- aroman 12y agoThis talk just keeps getting more and more relevant: https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript https://www.destroyallsoftware.com/talks/the-birth-and-death...
- mateuszf 12y agoIt may become self-fulfilling prophecy.
- hippich 12y agoShameless plug - I am using Emscripten to compile scrypt miner as a proof-of-work code at https://hashcash.io/ https://hashcash.io/
- otakucode 12y agoCompiling to Javascript is nothing short of a mental illness. The perversions that the terrible design of the web has driven people to are simply breathtaking...
- dilap 12y agoThat's a silly position to take. It works quite well in practice, and is completely competitive with a "designed" VM bytecode.
- otakucode 12y agoIt works well in practice depending entirely upon your goals - and depending entirely on your never ever comparing it to ANY other possible solution to the problem.
- dilap 12y agoWell, we've got PNaCl to compare too, which is trying to accomplish similar things. As an outsider, it sure doesn't seem to be getting as much traction as asm.js or have compelling advantages, though. I think developers have a tendency to underestimate how important it is to integrate well with your environment, start up quickly, and have a good deployment story. asm.js nails these things.
- cbsmith 12y agoActually, it makes a lot of sense to me, and you can take advantage of C++'s more efficient abstraction models.
- Touche 12y agoMaintaining a massive cross-OS cross-processor code-base is nothing short of mental illness.
- jerf 12y agoCompiling to asm.js isn't the same thing as compiling to JS. asm.js is just a funny-serialized bytecode. Someday they can trade it out for a sane serialization and hardly anything will blink.
- rtpg 12y agoOT but I really hate how these sorts of slide decks break the back button. emscripten is pretty cool technology, the paper presenting the tech (http://davideglintine-new.googlecode.com/hg/docs/paper.pdf http://davideglintine-new.googlecode.com/hg/docs/paper.pdf) is actually a really easy read. Cool stuff. I hope it doesn't become a norm to try and write "normal" websites in C++, though things like games do seem to be easier
- Touche 12y agoHow does it break the back button? Back button works as I would expect it to.
- tbrownaw 12y ago...seriously?? Normal slide decks are annoying enough, but one that doesn't have the fade ins/outs stripped and progressively adds things instead of showing the whole screen (er, slide) at once? WTF happened to usability? Slides are meant to support a talk. Putting everything on the slides, while it does let you just read from them, gives a bad UX for the talk attendees. Posting proper (ie, supporting) slides -- like these appear to be -- online, gives a bad UX for the online readers. Leaving in transitions and progressiveness just makes it that much worse. So what's up with places line HN posting links to online slide decks? They're a seriously lousy way to communicate. Put some thought into what's appropriate for the audience -- not just who sees it, but also how they get it.
- PudgePacket 12y agoVery cool, does anyone here know the compile time differences to clang/gcc? Does compiling to Emscripten take longer than to binary?
- overgard 12y agoIt takes a little bit longer, but not a huge amount. Basically the linking step takes a few more seconds.
- lohankin 12y agoThere was a recent article on code optimization technique in Safari involving on-the-fly javascript -> LLVM compilation. So the entire chain now will look as C++ -> LLVM -> javascript (asm.js) -> LLVM Things are getting curiouser by the day...
- masklinn 12y agohttps://www.webkit.org/blog/3362/introducing-the-webkit-ftl-jit/ https://www.webkit.org/blog/3362/introducing-the-webkit-ftl-... for those who missed it. The LLVM phase is really an alternative to the existing DFG JIT, and more precisely to the final phase thereof: the front of the DFG JIT is still used up to CPS optimisations, then it branches right before codegen: DFG generates its code directly while FTL converts DFG to SSA, applies SSA optimisations, converts to LLVM IR and passes the IR to LLVM for codegen.
- chisophugis 12y agoCuriously, pNaCl also takes that same route.
- spencermountain 12y agothis is a very impressive project; also a humiliation of the field of computer science.
- skrebbel 12y agoWhy?
- latiera 12y agoI like how he says 'compiled c++ (to javascript) is immune to buffer overflows' yet completely sidesteps the real issue at hand: Every major javascript virtual machine is riddled with security holes. In Firefox case (no sandbox, no process-per-tab, one of the worst C++ codebases I've ever seen security-wise, _infested_ with memory leaks and UAFs) these holes can effortlessly lead to system compromise. In Chrome case, significantly more work is required.
- deleted 12y ago[deleted]
- cbsmith 12y agobrowser.tabs.remote = true Now you have separate processes for each tab. Still, considering that the underlying browsers are implemented in C++, I don't think anyone is under the impression that this is some kind of wonderful security feature.
- kevingadd 12y agoVMs with a direct asm.js compilation mode (like SpiderMonkey) can compile directly to native code (in advance) with the vast majority of the JS attack surface disabled (including heap allocations, for asm.js v1) In practice it's similar to the way NACL/pNACL can sandbox code due to the limited instruction set & validation guarantees.
- nnethercote 12y ago> _infested_ with memory leaks and UAFs Really? That doesn't match my experience -- the full Firefox test suite is run through ASAN on every check-in. (See the "Linux x64 ASAN" results at https://tbpl.mozilla.org/?tree=Mozilla-Inbound https://tbpl.mozilla.org/?tree=Mozilla-Inbound, for example). So I'd be interested to know what you base this claim on.
- Ono-Sendai 12y agoI wonder how many functions are suppressed from issuing error reports, if any.
- _pmf_ 12y ago> Emscripten and asm.js: C++'s role in the modern web C++'s role in the modern web is that every relevant browser since 1998 is written in it. It does not need JS wankery to be relevant, thank you very much.
- 72deluxe 12y agoProbably true that C++ has always been relevant. But not necessarily in the minds of web developers - they would not have considered writing C++ for generating a webpage. I didn't have a clue about Emscripten; looks really really useful so that I don't have to think too much about writing in other languages and can write EVERYTHING in C++. That'd be great.
- CmonDev 12y ago"Largest open platform in existence" It's not open, it's locked to legacy languages.
- pjmlp 12y agoThis just feels wrong. I am really betting on Apps, for setting the web straight for interactive documents.
- frozenport 12y agoAnd I kill you if you replace Office 2013 with an app like Prezi!
- pjmlp 12y agoOffice is an App. I just went into the new fad of calling App to what used to be called native applications. As for Prezi, I had to search for it. No idea it existed. No thanks, I rather use Powerpoint as well.
- cheepin 12y agoI really wish we had a proper 'web assembly' instruction set to compile to. JavaScript has proved itself to be a surprisingly adequate language over the years, but there is only so much optimization you can do with its language specification.
- antimagic 12y agoBut that's kind of the whole point of asm.js - it defines a subset of Javascript that is far more optimizable than the full Javascript specification. Do you feel that there are still parts of the asm.js spec that are holding optimisations back? If so, I would be interested to hear your thoughts as to what the problems are.
- ceronman 12y agoThere is a proper 'web assembly' instruction set. It's Google 's Portable Native Client [1]. The problem with this solution is that Google is the only one supporting it. But there other players in the web. Creating such a standard making all of the vendors happy might be impossible. ASM.js might not be the perfect solution, but it has the huge advantage of being compatible with all major browsers. Practicality beating purity is a common pattern in Web's history. [1] http://www.chromium.org/nativeclient/pnacl/introduction-to-portable-native-client http://www.chromium.org/nativeclient/pnacl/introduction-to-p...
- repsilat 12y agoThe sandboxing provided by NaCl is nice, but I'm not sure binary portability is really a worthwhile goal -- I think we really want cross-compilation, native binaries and the OS providing most of the sandbox. That way we get maximum performance on the hardware we're targeting (not the "lowest common denominator" of common bytecodes), an ability to run self-modifying code if we want to send a JIT down the wire...
- flohofwoe 12y agoA bit off-topic, but I would really like to see (P)NaCl apps directly supported on Android outside the browser, no need to mess with the NDK or Java. One can dream, right? :)
- inDigiNeous 12y agoVery interested in this technology, would like to see some examples created with this technology, more than games. Are there any cpu/gpu heavy applications out there that compile from C++ to asm.js ? Or any good examples of writing the whole webpage with C++ somehow? All the current examples I've seen utilize webgl canvas and handle the interaction there. How about interaction with a regular HTML interface ?
- andrewchambers 12y agoThere are examples of python and lua interpreters being compiled, a pdf renderer, graphviz, a 2d physics engine, and a speech synthesizer. you just need to google it. I myself have modified an emulator to run aswell.
- flohofwoe 12y agoOh right! I almost forgot another cool side project I did last christmas with emscripten: use JSMESS to restore some of my old 8-bit games I wrote as kid in the 80's on an obscure East-German home computer: http://www.flohofwoe.net/history.html http://www.flohofwoe.net/history.html
- arcatek 12y agoffmpeg - http://bgrins.github.io/videoconverter.js/ http://bgrins.github.io/videoconverter.js/
- Kurtz79 12y agoAs impressive as it is, I think it shows some limitations of the system: "The ffmpeg.js file is around 24.1 MB or so. It ends up being around 6.1 MB gzipped. The ffmpeg-all-codecs.js file is around 27.5 MB or so. It ends up being around 6.9 MB gzipped." EDIT: With a fast connection it´s actually not so bad. https://video-funhouse.herokuapp.com/ https://video-funhouse.herokuapp.com/ I imagine it would be possible to generate a smaller version selecting only a subset of features/codecs. Has someone tried it ?
- Ono-Sendai 12y ago
- flohofwoe 12y agoThere's a couple of points going around in my head which I find interesting / relevant when it comes to emscripten/asm.js, the web and mobile platforms: - asm.js code runs faster then Java code running through the Dalvik VM on Android (https://blog.mozilla.org/javascript/2013/08/01/staring-at-the-sun-dalvik-vs-spidermonkey/ https://blog.mozilla.org/javascript/2013/08/01/staring-at-th...) - porting and cross-compiling code to JS with emscripten is (arguably) easier then setting up and working with the Android NDK - the new Javascript LLVM backend in iOS8 Safari runs asm.js code very well, and Safari on iOS8 adds WebGL support - the web is a the only open software distribution platform without gate keepers (seriously, this is starting to get ridiculous: https://developer.apple.com/app-store/review/guidelines/ https://developer.apple.com/app-store/review/guidelines/) - web apps don't need all the code-signing and certification hoopla that native mobile apps need to go through - app shops are becoming saturated and have the same or worse visibility problems as the web even though they are 'curated' - you don't pay the 30% platform tax on the web (or rather: you're free to choose your store front-end) - in the end, most successful mobile games need so little CPU and GPU performance that it really doesn't make a difference whether they run native or in BASIC, WebGL or Metal I think that the advantages that a single centralized app-shop offered in the past over the web have already or will erode very fast once they have to manage a very high number of apps, basically modern AOLs but with shitty search engines. The open web is the only way out, even if it just means that multiple, decentralized app shops will be built on which compete with each other. [edit: formatting]
- micampe 12y agoYou listed only the positives of one platform, you forgot the other side of the equation: its negatives and the other platform's positives.
- flohofwoe 12y agoTrue, apologies for that. It is because I've been working with iOS and Android longer and take their advantages for granted (although I find it hard to find much nice things to say about C/C++ development on Android). emscripten and the web is still the "new platform" for me.
- vfclists 12y agoWhy don't/didn't Mozilla implement Shumway in C++ and apply Emscriptem to it? I thought that would be much easier. Or is it in the pipeline?
- azakai 12y agoI did propose trying something like that, actually, but the people working on the project preferred to go a different way. It's hard to guess which approach would be better, each has advantages and disadvantages, and Shumway is in fact doing well on performance. Also, most of the work on it is actually the API and libraries, not the core language, which would have been necessary either way.
- ascotan 12y agoAlthough this is very cool stuff, I have a hard time trying to understand where this is going to prove useful. I would image that the major target for something like this will be in doing ports of old games to the browser. Anything other than that would seem like a non-starter. I'm not sure why a developer would take the long road to write a c++ app with the intention of eventually converting it to javascript. Also, If your a company has the expertise you would be basically open-sourcing something that is closed source. So the business logic doesn't make sense unless you don't stand to make money on the code. Maybe i'm not being imaginative enough.
- mischanix 12y ago>you would be basically open-sourcing something that is closed source From my perspective, reading optimized builds is practically the same as reading assembly. In my opinion, it'd be easier to work from an unstripped mac/linux binary (i.e. with function symbols) than from optimized emscripten output.
- flohofwoe 12y agoThere are at least 2 major scenarios where C++ ported to JS is useful: (1) the web as "just another platform" next to desktop, game consoles and native mobile apps, the advantage here is that you can use the same code base for all platforms and only need a small percentage of platform specific code (about 2% platform specific code from my experience) (2) cross-compile existing C/C++ middleware libs for use in "traditional" JS web apps, this has been demonstrated for physics engines (bullet), but would also work for pathfinding, AI, and other specialized libs If you're concerned about opening up your precious source code by cross-compiling to JS, restoring the original code is just as complicated as restoring from a compiled binary, since the JS code has been generated from LLVM bitcode, and is additionally minified. You're basically getting a big, opaque ASCII blob out of an emscripten compile. The only disadvantage of cross-compiled code is that you get a certain static size overhead for parts of the C/C++ runtime that gets compiled into the generated Javascript file which is somewhere between 100 and 300 kByte. This overhead gets (relatively) smaller the more complex the application is, and emscripten/LLVM is very aggressive about dead code removal. So, a small web page which just wants to use some WebGL effects doesn't make much sense to write in C++, but once you start to write a real game and use JS libs like three.js (currently at 424kByte minified), the size advantage of manually written JS quickly disappears.
- fiatjaf 12y agoHere's some nice usage of emscripten: https://github.com/amatus/gnunet-web https://github.com/amatus/gnunet-web
- EmmanuelOga 12y agoHmmm late to the conversation but I always wonder why emscripten focuses so much on C++, my understanding is that it compiles LLVM IR to javascript, and clang is used to generate the LLVM IR from C++ in the first place. Wouldn't it make more sense to market it as llvm-ir-to-javascript compiler? That way it would be more attractive to users of any language with a llvm frontend.