Основной целью Emscripten заявлено создание инструмента, позволяющего выполнять в Web код независимо от языка программирования, на котором этот код изначально написан. В компилируемых приложениях могут использоваться вызовы стандартных библиотек C и С++ (libc, libcxx), расширения C++, многопоточность на базе pthreads, API POSIX и многие мультимедийные библиотеки. Отдельно предоставляются API для интеграции с Web API и кодом на JavaScript.
Emscripten поддерживает трансляцию вывода библиотеки SDL2 через Canvas, а также реализует поддержку OpenGL и EGL через API WebGL, что позволяет преобразовывать в WebAssembly графические приложения и игры (например, имеется порт тулкита Qt, поддерживаются игровые движки Unreal Engine и Unity, а также движок симуляции физических процессов Bullet).
Помимо компиляции кода на C/C++ отдельно развиваются проекты для запуска в браузерах интерпретаторов и виртуальных машин для языков Lua, C#, Python, Ruby и Perl. Кроме того, возможно применение фронтэндов к LLVM, отличных от Clang, например, фронтэндов для языков, как Swift, Rust, D и Fortran.
Присвоение номера версии 7.0 связано с внесением изменений, нарушающих совместимость. Основные изменения в Emscripten 7.0:
- Обеспечено прямое связывание всех дополнительных модулей с runtime-библиотеками libclang_rt.builtins и libclang_rt.profile без необходимости экспортирования из основного модуля, как это делается в компиляторе clang.
- Добавлена библиотека libemcc, в которую из libclang_rt.builtins вынесен код, специфичный для Emscripten.
- Из runtime-библиотеки libclang_rt.builtins выделена библиотека libclang_rt.profile, которая теперь используется только при включении профилирования (например, при указании опций -fprofile-instr-generate или --coverage).
- Размер буфера неименованных каналов увеличен до 64 КБ. Неблокирующая запись в заполненный канал теперь завершается ошибкой EAGAIN, но блокирующая запись пока остаётся неограниченной.
- При компиляции и компоновке одной командой вспомогательные файлы, такие как ".dwo" при использовании опции "-gsplit-dwarf" или ".json" при использовании "-ftime-trace", теперь именуются как ‹output›-‹input›.‹ext› вместо ‹input›.‹ext›, что соответствует поведению clang.
- Включено автоматическое определение зависимостей для JavaScript-библиотек. Для прямых обращений из одной JavaScript-библиотеки в другую теперь не требуется указание макроса "__deps", который остаётся необходимым только для косвенных зависимостей и зависимостей от скомпилированных библиотек C/C++.
- Удалена переменная окружения EMCC_ONLY_FORCED_STDLIBS, которая ранее была объявлена устаревшей. Для отключения связывания со стандартными библиотеками следует использовать флаг "-nostdlib".
- До кодовой базы LLVM 23.1.3 обновлены библиотеки libcxx, libcxxabi, libunwind и compiler-rt. Задействован выпуск mimalloc 3.6.1.
- Повышены требования к версиям браузеров Chrome 85 -> 93 (август 2021), Firefox 79 -> 92 (сентябрь 2021) и Safari 15.0 -> 15.4 (март 2022).
Источник: https://www.opennet.ru/opennews/art.shtml?num=66640
(opennet.ru, основная лента)