Опубликован выпуск инструментария 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().