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

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

Вышел Emscripten 7.0 — инструмент, превращающий C/C++ и другие языки с LLVM-фронтэндами в WebAssembly.

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

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

Графику Emscripten тоже тянет: вывод SDL2 транслируется через Canvas, а OpenGL и EGL реализованы поверх WebGL. Благодаря этому в WebAssembly переносятся игры и графические программы — есть порт тулкита Qt, поддерживаются движки Unreal Engine и Unity, а также физический движок Bullet. Параллельно развиваются проекты интерпретаторов и виртуальных машин для Lua, C#, Python, Ruby и Perl. Кроме Clang, можно подключать и другие фронтэнды LLVM — для Swift, Rust, D и Fortran.

Номер 7.0 присвоен из-за изменений, ломающих совместимость. Все дополнительные модули теперь напрямую линкуются с runtime-библиотеками libclang_rt.builtins и libclang_rt.profile без экспорта из основного модуля, как в clang. Появилась библиотека libemcc — в неё вынесен специфичный для Emscripten код из libclang_rt.builtins. Из последней выделена libclang_rt.profile, используемая только при профилировании (опции -fprofile-instr-generate или —coverage). Буфер неименованных каналов вырос до 64 КБ. Неблокирующая запись в заполненный канал теперь падает с ошибкой EAGAIN, а блокирующая пока остаётся неограниченной.

При компиляции и компоновке одной командой вспомогательные файлы («.dwo» при -gsplit-dwarf, «.json» при -ftime-trace) называются -. вместо ., как в clang. Включено автоопределение зависимостей для JavaScript-библиотек: макрос «__deps» для прямых обращений между ними больше не нужен, он остался только для косвенных зависимостей и зависимостей от скомпилированных C/C++-библиотек. Переменная EMCC_ONLY_FORCED_STDLIBS удалена — отключать связывание со стандартными библиотеками следует флагом «-nostdlib».

Библиотеки libcxx, libcxxabi, libunwind и compiler-rt обновлены до кодовой базы LLVM 23.1.3, задействован mimalloc 3.6.1. Подняты минимальные версии браузеров: Chrome 85 → 93 (август 2021), Firefox 79 → 92 (сентябрь 2021), Safari 15.0 → 15.4 (март 2022).

Ссылка на основную публикацию