.. _about-emscripten:

================
About Emscripten
================

Emscripten is a complete :ref:`Open Source <emscripten-license>` compiler
toolchain to WebAssembly. Using Emscripten you can:

- Compile C and C++ code, or any other language that uses LLVM, into WebAssembly,
  and run it on the Web, Node.js, or other Wasm runtimes.
- Compile the C/C++ **runtimes** of other languages into WebAssembly, and then
  run code in those other languages in an *indirect* way (for example, this has
  been done for
  `Python <https://github.com/pyodide/pyodide>`_ and
  `Lua <https://daurnimator.github.io/lua.vm.js/lua.vm.js.html>`_).

Practically any **portable** C or C++ codebase can be compiled into WebAssembly
using Emscripten, ranging from high-performance games that need to render
graphics, play sounds, and load and process files, through to application
frameworks like Qt. Emscripten has already been used to convert a very long list
of real-world codebases to WebAssembly, including commercial codebases like the
`Unreal Engine 4 <https://blog.mozilla.org/blog/2014/03/12/mozilla-and-epic-preview-unreal-engine-4-running-in-firefox/>`_
and the `Unity <https://blogs.unity3d.com/2018/08/15/webassembly-is-here/>`_ engine.
For examples and demos, see the
`community-maintained list on the wiki <https://github.com/emscripten-core/emscripten/wiki/Porting-Examples-and-Demos>`_.

Emscripten generates small and fast code! Its default output format is
`WebAssembly <http://webassembly.org/>`_ , a highly optimizable executable
format, that runs almost as fast as native code, while being portable and safe.
Emscripten does a lot of optimization work for you automatically, by careful
integration with LLVM,
`Binaryen <https://github.com/WebAssembly/binaryen>`_,
`Closure Compiler <https://developers.google.com/closure/compiler>`_, and other
tools.

.. _about-emscripten-toolchain:

Emscripten Toolchain
====================

A high level view of the Emscripten toolchain is given below. The main tool is
the :ref:`emccdoc`. This is a drop-in replacement for a standard compiler like *gcc* or *clang*.

*Emcc* uses :term:`Clang` and LLVM to compile to WebAssembly. Emcc also
emits JavaScript that provides API support to the compiled code. That JavaScript
can be executed by :term:`Node.js`, or from within HTML in a browser.

The :ref:`Emscripten SDK <sdk-download-and-install>` is used to install the entire toolchain, including emcc and
LLVM and so forth. The :ref:`emsdk` can be used on Linux, Windows or MacOS.

.. _about-emscripten-porting-code:

Porting code to use Emscripten
==============================

Emscripten support for **portable** C/C++ code is fairly comprehensive.
Support for the C standard library, C++ standard library, C++ exceptions, etc.
is very good, as is `SDL2 <https://www.libsdl.org/>`_ and other APIs.
:ref:`OpenGL-support`
support is excellent for OpenGL ES 2.0-type code, and acceptable for other types.

There are differences between the native and :ref:`emscripten-runtime-environment`,
which mean some changes usually need to be made to the native code. That said,
many applications will only need to change the way they define their main loop,
and also modify their :ref:`file handling <file-system-overview>` to adapt to
the limitations of the browser/JavaScript.

There are also limitations that can make some code easier to port — read
:ref:`code-portability-guidelines` to determine where you may need to spend more
effort.
