Доступен Emscripten 4.0, компилятор из C/C++ в WebAssembly

Опубликован выпуск инструментария Emscripten 4.0, позволяющего компилировать код на C/C++ и других языках, для которых имеются фронтэнды на базе LLVM, в универсальный низкоуровневый промежуточный код WebAssembly. Полученный результат можно использовать для интеграции с JavaScript-проектами, запуска в web-браузере, использования в Node.js или создания обособленных многоплатформенных приложений, запускаемых при помощи wasm runtime. Код проекта распространяется под лицензией MIT. В компиляторе используются наработки проекта LLVM, а для генерации WebAssembly и оптимизации задействована библиотека Binaryen.

Основной целью Emscripten заявлено создание инструмента, позволяющего выполнять в Web код независимо от языка программирования, на котором этот код изначально написан. В компилируемых приложениях могут использоваться вызовы стандартных библиотек C и С++ (libc, libcxx), расширения C++, многопоточность на базе pthreads, API POSIX и многие мультимедийные библиотеки. Отдельно предоставляются API для интеграции с Web API и кодом на JavaScript.

Emscripten поддерживает трансляцию вывода библиотеки SDL2 через Canvas, а также реализует поддержку OpenGL и EGL через API WebGL, что позволяет преобразовывать в WebAssembly графические приложения и игры (например, имеется порт тулкита Qt, поддерживаются игровые движки Unreal Engine и Unit, а также движок симуляции физических процессов Bullet).

Помимо компиляции кода на C/C++ отдельно развиваются проекты для запуска в браузерах интерпретаторов и виртуальных машин для языков Lua, C#, Python, Ruby и Perl. Кроме того, возможно применение фронтэндов к LLVM, отличных от Clang, например, фронтэндов для языков, как Swift, Rust, D и Fortran.

Присвоение номера версии 4.0 связано с внесением изменений, нарушающих совместимость на уровне ABI (при пересборке проекта в Emscripten 4.0 потребуется пересборка объектных файлов и библиотек, собранных прошлыми версиями Emscripten). Основные изменения в Emscripten 4.0:

  • Добавлена опция “-sWASM_LEAGCY_EXCEPTIONS” для выбора между старым и новым механизмами обработки исключений. По умолчанию продолжает использоваться старый механизм, так как не все браузеры реализовали возможности WebAssembly для работы новых обработчиков исключений.
  • Компоненты compiler-rt, libcxx, libcxxabi и libunwind обновлены до ветки LLVM 19.
  • Минимально поддерживаемая в сборках версия браузера Safari (настройка MIN_SAFARI_VERSION) повышена с 14.1 до 15.0, что позволило по умолчанию задействовать несколько расширенных возможностей WebAssembly:
    • Включено использование новых инструкций для преобразования типа float в int (nontrapping-fptoint), которые вместо генерации исключения при переполнении результата возвращают минимально или максимально возможное значение (необходимо для SIMD).
    • Включена опция WASM_BIGINT, при которой для обмена целочисленными 64-разрядными значениями между WebAssembly и кодом на JavaScript применяется тип BigInt.
    • Включена опция BULK_MEMORY, при которой для реализации Си-функций memcpy и memset применяются WebAssembly-инструкции memory.copy и memory.fill.
  • В функции PATH.basename() отключена нормализация путей (PATH.normalize()), т.е. вызов ‘PATH.basename(“a/.”)’ теперь вернёт “.” вместо “a”, а ‘PATH.basename(“a/b/..”)’ вернёт “..” вместо “a”.
  • При использовании опции “-sMODULARIZE” factory-функции, которые создают и возвращают экземпляры WebAssembly-модулей и объектов для JavaScript, теперь помечены признаком “async” при компиляции в режиме WASM_ASYNC_COMPILATION, применяемом по умолчанию.
  • Добавлена возможность указания JavaScript-библиотек, используя опцию “-lfoo.js”. В отличие от опции “–js-library” поиск библиотеки выполняется во всех путях, указанных через опцию “-L”.
  • При компоновке в отладочном режиме (-O0 или -sASSERTIONS) по умолчанию задействован отладочный вариант функции malloc со включёнными assert-проверками, выявляющими такие ошибки, как двойной вызов функции free().

Release. Ссылка here.