The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

14.01.2025 10:00

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


  1. Главная ссылка к новости (https://github.com/emscripten-...)
  2. OpenNews: Доступен Emscripten 3.0, компилятор из C/C++ в WebAssembly
  3. OpenNews: В рамках проекта Emscripten-Qt развивается порт Qt, работающий в web-браузере
  4. OpenNews: Emscripten - проект по созданию компилятора кода C/C++ в JavaScript
  5. OpenNews: Доступен предварительный вариант стандарта WebAssembly 2.0
  6. OpenNews: Доступен Wasmer 5.0, инструментарий для создания приложений на базе WebAssembly
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/62553-emscripten
Ключевые слова: emscripten, javascript, webassembly
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (51) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Аноним (2), 10:06, 14/01/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Качественный?
     
     
  • 2.3, нитгитлистер (?), 10:20, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    сам не пробовал, но слышал что вполне себе норм
     
  • 2.4, воробушек (?), 10:27, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • –4 +/
    на базе шланга качественного не бывает. кое-как работает и ладно - офф девиз шланга.
     
     
  • 3.8, воробушек (?), 10:40, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    https://godbolt.org/z/rofYEcYqr - пример подхода в шланге. дело здесь даже не в Werror по дефолту. они просто захардкодили "s" как особый случай.
     
     
  • 4.12, Аноним (12), 10:50, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Но ведь так работает значит все правильно сделали.
     
  • 4.44, Аноним (44), 13:51, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    https://en.cppreference.com/w/cpp/string/basic_string/operator%22%22
     
     
  • 5.59, Аноним (59), 16:41, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    типа статья про std::literals::string_literals::operator""s есть и потому ошибки нет, а про std::literals::string_literals::operator""x нету и потому ошибка есть? Ты это сказать хотел?

    И судя по набору имен, на которые не ругается (h/min/s/ms/us/ns), авторы костыля читали доку по хроно, а не про строки

     
  • 3.24, Аноним (24), 12:05, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > на базе шланга качественного не бывает. кое-как работает и ладно - офф девиз шланга.

    А как ты вообще представляешь себе качественный релиз либы весом 70 мегабайт бинарного кода? Это LLVM столько весит если что.

     
  • 2.5, Аноним (12), 10:28, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Количественный.
     
  • 2.53, Аноним (-), 15:57, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Да и давно. На нем в игры можно в браузере играть. Например в Quake. Когда-то давно была демка. Зададим вопрос по другому - только сейчас о нем узнали?
     
  • 2.66, Аноним (66), 18:00, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    ну так себе

    https://framagit.org/fperrad/lua.wasm
    261kB wasm + 77kB js

    А без использования их стандартной библиотеки и всевозможных обёрток для fileIO, просто голым шлангом получилось собрать в два раза меньший объём.

    Для какого-нибудь многомегабайтного ffmpeg или quake в браузер притащить лишние 100кБ не заметно, а для совсем мелочи слишком много ненужных обёрток, чтобы стандартная библиотека в браузере прозрачно работала.

     
     
  • 3.82, Аноним (-), 22:17, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Для современного веба, с современными скоростями это не проблема
     

  • 1.6, Аноним (12), 10:29, 14/01/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Почему нельзя было просто сделать джаваскрипт быстрым? Это же так просто.
     
     
  • 2.9, НяшМяш (ok), 10:44, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Ждём пулл реквест в V8 и SpiderMonkey.
     
     
  • 3.11, Аноним (12), 10:49, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • –2 +/
    А чего тут ждать. Если вебасмембли такой быстрый почему джаваскрипт не может быть точно таким же.
     
     
  • 4.21, вебмакака (?), 11:58, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Потому что скриптуха без типизации.

    А вообще впечатляют масштабы, в которых расплодились клоуны, требующие чтобы им дали ресурсов нахаляву. Даже если это в принципе невозможно - кого интересуют такие мелочи.

     
  • 4.25, Аноним (24), 12:07, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > А чего тут ждать. Если вебасмембли такой быстрый почему джаваскрипт
    > не может быть точно таким же.

    Динамическая типизация видите ли идет в комплекте с нехилым оверхедом. Надо все время трекать тип и следить что он не изменился. И быть готовым ко всему.

    А вон то - простой, низкоуровневый рантайм, не снабженный таким факапом. Намного более простая и потому шустрая абстракция.

     
     
  • 5.34, Bottle (?), 13:04, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Причём, что забавно - строгая типизация это такая абстракция, которая позволяет компилятору генерировать быстрый код. Потому что pointer aliasing.
    Очень часто находятся "умники", которые заявляют, что всякая абстракция лишь замедляет код. Отнюдь.
     
     
  • 6.36, вебмакака (?), 13:08, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Это не абстракция, обезьяныч. И никакой "pointer aliasing" тебе не поможет. Как и никакой "строгой" типизации не существует.
     
  • 6.51, Аноним (51), 15:25, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Это некий набор правил и или гарантий когда компилер при генерации кода явно зна... большой текст свёрнут, показать
     
     
  • 7.70, Bottle (?), 18:45, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Понимаешь ли, процессор не увидит разниц между указателями на int_32_t и строковым типом такой же длины, а вот компилятор, который в одном методе видит разные типы, как раз воспользуется данным преимуществом.
     
     
  • 8.73, Аноним (-), 19:51, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Как вы поняли - дереференс указателей вообще не самый быстрый способ работы Быс... большой текст свёрнут, показать
     
  • 4.28, Аноним324 (ok), 12:28, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    он может быть таким же, но никто не платит чтобы с этим заморачиваться. Будут платить за джаваскрипт 15 тысяч зелени в месяц, будут делать быстрее, а пока платят нищие 4000 пусть в баню идут, за такие копейки, ещё над чем-то думать.
     
  • 2.15, myster (ok), 11:41, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • –3 +/
    В старом движке Opera Presto (2012 года) он был быстрый, но проект свернули.

    Любая математическая операция (синтетический тест) в JavaScript консоли старой Opera обгоняла в сотни раз по производительности тогдашний Chrome, а Firefox и подавно. Я не думаю что и сейчас ситуация изменилась, если протестировать.

     
     
  • 3.18, вебмакака (?), 11:51, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +4 +/
    > В старом движке Opera Presto (2012 года) он был быстрый, но проект свернули.

    В твоих фантазиях.

    > обгоняла в сотни раз по производительности

    В тысячи раз. Правда в фантазиях.

     
     
  • 4.29, myster (ok), 12:33, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • –3 +/
    проверь умник, она же доступна для загрузки ещё, если нужно подсказать, что вводить в консоли - пиши, помогу, но по сути любая вычислительная операция с циклами, с массивами.

    Кстати, в долгих операциях и "в тысячи раз" превышать будет, т.к. там разница в производительности увеличивается по нарастающей.

     
     
  • 5.79, Аноним (79), 21:13, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Даже если они могли что-то стоищее создать, но они опустились до вранья своим пользователям, а потом вообще продали браузер.
    А адекватные разработчики ушли в Vivaldi
     
  • 2.20, Аноним (20), 11:57, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Быстрым, наверное, можно сделать не JS, а TS. И то, если его компилять сразу в машинные коды. Ага, прямо из браузера компилер вызывать, а то как же кроссплатформенность.
     
     
  • 3.27, Анонем (?), 12:27, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Это называется JIT и давным-давно используется в браузерах.
     
     
  • 4.38, Аноним (20), 13:34, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Я сказал в машинные коды - _инструкции_CPU_, а не какой-то там языковой виртуальной машины. Мы же хотим, чтобы быстро. Да и нет необходимости языку со статической типизацией в этих JIT.
     
     
  • 5.46, Аноним (46), 14:33, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    >> Это называется JIT и давным-давно используется в браузерах
    > Я сказал в машинные коды - _инструкции_CPU_

    Чел, JIT *буквально* транслирует в машинные коды 🤦

     
     
  • 6.83, Аноним (83), 00:20, 15/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Но быстро, это когда AOT.
     
  • 5.47, Анонем (?), 14:39, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Я сказал в машинные коды - _инструкции_CPU_, а не какой-то там языковой
    > виртуальной машины. Мы же хотим, чтобы быстро. Да и нет необходимости
    > языку со статической типизацией в этих JIT.

    * Just-In-Time (JIT) компиляция в Java — это механизм, который позволяет ускорить интерпретацию байт-кода виртуальной машиной.  1

    Простыми словами, механизм JIT компиляции заключается в следующем: если в программе присутствуют части кода, которые выполняются много раз, то их можно скомпилировать один раз в машинный код, чтобы в будущем ускорить их выполнение.

    * Java — это статически типизированный язык.

    (с) Яндекс Нейро

     
     
  • 6.48, отец_нашей_демократии (?), 15:03, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    из того же источника:

    >[оверквотинг удален]
    > rust не имеет статической типизации
    >> Rust имеет статическую типизацию. Когда разработчик создаёт переменную в Rust, он должен сразу указать, какого она типа — что будет в ней храниться.
    > в rust нет переменных, это скриптуха с gc и ссылками вместо переменных
    >> В Rust есть переменные. Для их объявления используется ключевое слово let. По умолчанию переменные неизменяемы, но их можно сделать изменяемыми, добавив перед именем ключевое слово mut. Ссылки в Rust используются для управления памятью. В языке есть два типа ссылок: ссылки на чтение (shared reference) и изменяемые (мутабельные) ссылки. Ссылки подчиняются двум правилам: не должны жить дольше, чем данные, на которые они ссылаются, и мутабельная ссылка должна быть уникальна. Таким образом, Rust сочетает в себе особенности языка с ручным управлением памятью и сборщиком мусора: код получается чистым, как в языке с GC, но в то же время все ресурсы освобождаются максимально быстро, как в языке с ручным управлением.
    > покажи мне sizeof от переменной в rust без испоьзования stdlib
    >> Для получения размера переменной в Rust используется функция size_of_val. Пример использования: '''let a = 10i32; println!("{}", size_of_val(&a));'''. Также для получения размера типа в байтах в Rust можно использовать функцию size_of из пакета std::mem.
    > без испоьзования stdlib
    >> Не удалось найти информацию о том, как получить sizeof от переменной в Rust без использования stdlib.
    > правильно, потому что это невозможно. rust не знает ничего о переменных и их свойствах
    >> Да, получить sizeof от переменной в Rust без использования stdlib невозможно, так как для этого используется специальная функция — size_of_val.

    с жавой будет то же самое. как и с любой другой скриптухой.

     
     
  • 7.49, Аноним (46), 15:10, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Не совсем понятно, что ты хотел сказать.
     
  • 6.84, Аноним (83), 00:22, 15/01/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Да-да, знаем, слышали: "Java способна обогнать код на C++".
     
  • 2.55, Аноним (-), 16:03, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А ты замерь насколько он быстрый. Не знаю как проверяют бенчмарки, но мои замеры показывали производительность почти такую же как и на С. Конечно ты можешь вспомнить что-то про многопоточность, но я тоже могу вспомнить про воркеры. Конечно всё-равно это не многопоточность и тем не менее.
     
  • 2.58, 12yoexpert (ok), 16:35, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    в qml и espruino как-то сделали
     

  • 1.10, ryoken (ok), 10:45, 14/01/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >>"-sWASM_LEAGCY_EXCEPTIONS"

    ...

     
  • 1.16, anonymouse (?), 11:43, 14/01/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Есть тулкит на wasm для экспериментов с фильтрами ffmpeg в браузере. Если не перебарщивать со сложностью, wasm вполне полезная технология.
     
  • 1.54, Аноним (-), 15:59, 14/01/2025 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     

  • 1.60, htmldevelob (?), 16:42, 14/01/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Вопрос глупый но всё же, зачем нужен этот ваш wasm? не проще былоб в браузеры встроить qemu\kvm
     
     
  • 2.63, Аноним (66), 17:44, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Google Native Client (NaCl)
    кстати, где он (с)
     
  • 2.67, Аноним (67), 18:08, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну целую операционную систему с сервера грузить это наверное уже слишком. Но создать ABI для запуска блобов с доступом лишь к тому, что разрешили, можно. В хроме оно даже и было, но разрабы лисы надули щеки и сказали, что не будут запускать блобы и предложили asm.js. Но в конечном итоге пришли к wasm, но как бы лишь для реализации быстрых алгоритмов.
     
     
  • 3.68, Аноним (68), 18:16, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Ну целую операционную систему с сервера грузить это наверное уже слишком.

    Вообще можете загуглить jslinux. Если дело делает профессионал как Фабрис - то и линух загрузить в браузере - не так уж ужасно как может показаться.

     
  • 2.72, Аноним (72), 18:55, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    чтобы в нём заустить линукс в котором запустить браузер в котором запустить qemu-kvm .....
     
  • 2.85, Аноним (85), 00:46, 15/01/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Чтобы зум и куча других вредоносных сайтов запустились, а не предложили просто проваливать. Компиляция в код, близкий к нативному, сильно осложняет реверс-инжиниринг. Это обфускация с виртуальной машиной: совмещает недостатки и нативного кода, и скриптов. Для кого-то это является достоинством.
     

  • 1.76, maxis11 (ok), 20:15, 14/01/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А кто-нибудь начал конвертор пилить из Vulkan в Web GPU для EMS (или пока все только мечты)?
     
     
  • 2.78, Аноним (-), 21:09, 14/01/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Эти планы, запланированы они или нет можно вычитывать вот тут: https://www.khronos.org/
     

  • 1.86, chdlb (?), 02:53, 15/01/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    искал либу для xxhash64 под WASM, нашел, автор перешел с Emscripten на шланг

    я не знаю точной причины, может кто и расскажет нам

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру