О Emscripten

Emscripten это компилятор LLVM в JavaScript с открытым исходным кодом. Он позволяет:

  • Компилировать C и C++ код в JavaScript
  • Компилировать любой другой код который может быть транслирован в LLVM байт код в JavaScript.
  • Компилировать C/C++ среду выполнения других языков в JavaScript, и затем косвенно запускать код на этих языках (это было сделано для Python и Lua)!

Tip

Emscripten делает нативный код немедленно доступным в Web: платформу которая стандартизированна, имеет несколько независисых реализаций, и работает везде на PC и iPad.

Вместе с Emscripten, C/C++ разработчики получают возможность бытсро портировать проект в JavaScript, вместо того что бы писать проект с нуля на новом языке (JavaScript). Web разработчики тоже получают преимущества, теперь разработчики могут использовать сотни существующих нативных билиотек и утилит.

На практике любая переносимая кодовая база C или С++ может быть скомпилирована в JavaScript с использованием Emscripten, от высоко производительных игр, воспроизводящих графику и звук, вплоть до полноценных фреймворков как Qt. С помощью Emscripten преобразовано множество проектов в JavaScript, включая очень большие проекты как CPython, Poppler и Bullet Physics Engine, коммерческие проекты Unreal Engine 4 и Unity. Например, два проекта на базе Unity:

Angrybots game logo
Dead Trigger 2 Game logo

Ссылки на другие проекты смотри в wiki.

Emscripten генерирует быстрый код. По умолчанию генерируется WebAssembly или asm.js. WebAssembly новый форма исполнения кода в Web, он исполняется со скоростью близкой к нативной (текущие результаты тестов производительности или запустите тесты самостоятельно). Оптимизированный код так же имеет близкий размер к нативному коду (при использовании gzip сжатия).

Для лучшего понимания на сколько быстр может быть код Emscripten, запустите Dead Trigger 2 или Angrybots.

Инструментарий Emscripten

Обобщенный взгляд на инструментарий Emscripten приведен ниже. Основная утилита Emscripten Compiler Frontend (emcc). Это полная замена стандартного компилятора типа gcc.

../../_images/EmscriptenToolchain.png

Emcc использует Clang и LLVM для компиляции в wasm или asm.js. Emscripten производит JavaScript который способен запустить скомпилированный код и предоставляет необходимую среду выполнения. Этот JavaScript может быть выполнен в node.js, или внутри HTML в браузере.

Emscripten SDK (emsdk) используется для управления несколькими SDK и инструментами, и для указания определенной версии SDK/набора инструментов используемых для компиляции кода (Active Tool/SDK). В том числе он может установить (скачать и построить) последний инструментарий с GitHub!

Emsdk записывает “активную” конфигурацию в Emscripten Compiler Configuration File (.emscripten). Этот файл используется emcc для определения текущего инструментария для сборки.

Несколько других пока не задокументированы, например, Java может быть использована emcc для запуска closure compiler, который может ещё больше уменьшить размер файла.

Полный инструментарий поставляется в составе Emscripten SDK, и может быть использован в Linux, Windows or macOS.

Подготовка кода к портированию с Emscripten

Emscripten поддерживает переносимый C/C++ код. Поддерживаются: стандартная библиотека C и С++, С++ исключения, и пр. Поддержка SDL достаточная для запуска большинства проектов. Отличная поддержка OpenGL support in Emscripten для OpenGL ES 2.0, и приемлемая для других версий.

Есть несколько различий между нативным и Emscripten Runtime Environment окружением, что предполагает что некоторый изменения нужно внести в нативный код. Для большинства приложений достаточно лишь изменить способ организации основного цикла программы, и работы с файлами что бы соответствовать ограничениям браузера/JavaSCript.

Если придерживаться некоторых правил ref:code-portability-guidelines, то можно значительно упросить процесс портирования.