Представлен W3C Недавно через пост проект новой спецификации который стандартизирует код подготовки WebAssembly 2.0 и связанный с ним API для создания высокопроизводительных приложений, переносимых между браузерами и аппаратными платформами.
Для тех, кто плохо знаком с WebAssembly, вы должны знать, что это обеспечивает общее промежуточное программное обеспечение, низкий уровень и независимый от браузера, для запуска скомпилированных приложений из разных языков программирования. Используя JIT для WebAssembly, вы можете достичь уровня производительности, близкого к собственному коду.
О веб-сборке
WebAssembly может использоваться для выполнения высокопроизводительных задач в браузере, такие как кодирование видео, обработка звука, манипулирование 3D и графикой, разработка игр, криптографические операции и математические вычисления, путем выполнения кода, написанного на скомпилированных языках, таких как C/C++.
Среди основных задач WebAssembly — обеспечение переносимости, предсказуемости поведения и идентичности исполнения кода на разных платформах. В последнее время WebAssembly также продвигается как универсальная платформа для безопасного выполнения кода на любой инфраструктуре, операционной системе и устройстве, не ограничиваясь браузерами.
О проекте WebAssembly 2.0
Что касается изменений, которые были внесены с тех пор, как WebAssembly являются готовыми предложениями для WebAssembly 2.0, это SIMD с фиксированной шириной, массовые операции с памятью, ссылочные типы, поддержка JavaScript BigInt для WebAssembly i64, поддержка нескольких возвращаемых значений и импорт/экспорт изменяемых глобальные переменные.
W3C опубликовал три проекта спецификаций WebAssembly 2.0:
- Ядро веб-сборки: описывает низкоуровневую виртуальную машину для запуска промежуточного кода WebAssembly. Ресурсы, связанные с WebAssembly, имеют формат «.wasm», аналогичный файлам Java «.class», которые содержат статические данные и сегменты кода для работы с этими данными.
- Интерфейс JavaScript WebAssembly: предоставляет API для интеграции с JavaScript. Позволяет получать значения и передавать параметры функциям WebAssembly. Выполнение WebAssembly следует модели безопасности JavaScript, и все взаимодействие с хостом выполняется аналогично запуску кода JavaScript.
- Веб-API WebAssembly: определяет API на основе механизма Promise для запроса и выполнения ресурсов «.wasm». Формат ресурса WebAssembly оптимизирован для запуска выполнения без ожидания полной загрузки файла, что повышает скорость отклика веб-приложений.
Различия между WebAssembly и WebAssembly 2.0
Также следует отметить, что в WebAssembly 2.0 есть несколько важных изменений по сравнению с первой версией стандарта:
- v128 поддержка векторного типа и связанные векторные инструкции, которые позволяют выполнять операции над несколькими числовыми значениями параллельно (SIMD, одна инструкция, несколько данных).
- Возможность импортировать и экспортировать изменяемые глобальные переменные, что позволяет глобально связывать значения как указатели стека в C++.
- Новые инструкции по преобразованию float в int, который вместо исключения при переполнении результата возвращает минимальное или максимальное возможное значение (требуется для SIMD).
- Инструкции по расширению знака целых чисел (увеличение разрядности числа с сохранением знака и значения).
- Поддержка возврата нескольких значений блоками и функциями (а также передачу нескольких параметров функциям).
- Реализуйте функции JavaScript BigInt64Array и BigUint64Array. для преобразования между типом JavaScript BigInt и представлением WebAssembly 64-битных целых чисел.
- Поддержка ссылочных типов (funcref и externref) и связанные с ними операторы (select, ref.null, ref.func и ref.is_null).
- инструкции memory.copy, memory.fill, memory.init и data.drop для копирования данных между областями памяти и удаления областей памяти.
- Инструкции по прямому доступу и модификации таблиц (table.set, table.get, table.size, table.grow).
- Возможность создавать, импортировать и экспортировать несколько таблиц в одном модуле. Функции копирования/заполнения таблиц в пакетном режиме (table.copy, table.init и elem.drop).
Наконец, если вам интересно узнать об этом больше, вы можете ознакомиться с подробностями По следующей ссылке.