Skip to content
kripken edited this page Nov 2, 2011 · 161 revisions

Emscripten is an LLVM-to-JavaScript compiler. It takes LLVM bitcode (which can be generated from C/C++, using llvm-gcc or clang, or any other language that can be converted into LLVM) and compiles that into JavaScript, which can be run on the web (or anywhere else JavaScript can run).

Using Emscripten, you can

  • Compile C and C++ code into JavaScript and run that on the web
  • Run code in languages like Python as well, by compiling CPython from C to JavaScript and interpreting code in that on the web

Demos

  • Bullet/WebGL - The Bullet physics engine compiled to JavaScript with convenient automatically-generated bindings (through ammo.js) [updated: shadows!]
  • Python, Ruby, Lua - The popular dynamic languages Python, Ruby and Lua, compiled to JavaScript. Python even supports importing modules!
  • Text-to-Speech - eSpeak, a speech synthesizer, compiled to JavaScript.
  • Poppler - PDF rendering in JavaScript, using Poppler and FreeType. Warning: Very large (>12MB) download.
  • Ray tracing - A simple C++ ray tracer, rendering to a canvas element
  • OpenJPEG - JPEG 2000 decoding in JavaScript, using OpenJPEG (see also j2k.js)
  • FreeType - TrueType font rendering in JavaScript, using FreeType
  • Lua - The Lua interpreter

Note: Most or all of the demos are not optimized or even minified. It may take a short while to download a few MB of source code for each one.

Links

  • FAQ - Goals of this project, what it can be used for, architecture overview, limitations, etc.
  • Getting Started - How to build the project, run the tests, etc.
  • Developer tweets: @kripken
  • Developer blog: kripken/azakai
  • Technical Paper - A detailed writeup about how Emscripten works (the memory model, Relooper algorithm, etc.).

Get in Touch

  • IRC: #emscripten on irc.mozilla.org
  • Mailing list: emscripten-discuss
  • Bug reports: Please file Issues here on GitHub.

Contributing

Anyone is welcome to join us in developing Emscripten. Feel free to contact us on IRC or on the mailing list (links above), or through issues here on GitHub.

Patches can be submitted either in issues (as a gist is probably most convenient), or as pull requests, either is fine. When submitting patches, please:

  • Add yourself to the AUTHORS file (if you aren't already there). By adding yourself, you agree to license your code under the project's open source licenses (MIT/LLVM).
  • You should run all the automatic tests and make sure they pass (python tests/runner.py). Patches that are simple enough (for example, just add library functions that were not used before) might not need this, but most will. Please mention in the pull request or issue which tests you ran.
  • If you add any new functionality or fix an existing bug, add an automatic test to tests/runner.py.

Clone this wiki locally