02.07.2022

Доступен предварительный вариант стандарта WebAssembly 2.0

Консорциум W3C опубликовал черновой вариант новой спецификации, стандартизирующей промежуточного код WebAssembly 2.0 и связанный с ним API, позволяющий создавать высокопроизводительные приложения, переносимые между браузерами и аппаратными платформами. WebAssembly предоставляет не зависящий от браузера универсальный низкоуровневый промежуточный код для выполнения приложений, скомпилированных из различных языков программирования. Благодаря задействованию JIT для WebAssembly можно добиться уровня производительности близкого к нативному коду.

Технология WebAssembly может применяться для выполнения в браузере задач, требующих высокой производительности, например, кодирования видео, обработки звука, манипуляции с графикой и 3D, разработки игр, криптографических операций и математических вычислений через организацию выполнения в браузере кода, написанного на компилируемых языках, таких как C/C++.

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

W3C опубликовал три предварительные спецификации WebAssembly 2.0:

  • WebAssembly Core — описывает низкоуровневую виртуальную машину для выполнения промежуточного кода WebAssembly. Связанные с WebAssembly ресурсы поставляются в формате «.wasm», схожем с файлами «.class» в Java и содержащем статические данные и сегменты кода для работы с этими данными.
  • WebAssembly JavaScript Interface — предоставляет API для интеграции с JavaScript. Позволяет получать значения и передавать параметры в функции WebAssembly. Выполнение WebAssembly соответствует модели безопасности JavaScript и всё взаимодействие с основной системой производится по аналогии с выполнением JavaScript-кода.
  • WebAssembly Web API — определяет программный интерфейс на основе механизма Promise для запроса и выполнения ресурсов «.wasm». Формат ресурсов WebAssembly оптимизирован для начала выполнения, не дожидаясь полной загрузки файла, что позволяет повысить отзывчивость web-приложений.

Основные изменения в WebAssembly 2.0, по сравнению с первой версией стандарта:

  • Поддержка векторного типа v128 и связанных с ним векторных инструкций, позволяющих параллельно выполнять действия над несколькими числовыми значениями (SIMD, single instruction multiple data).
  • Возможность импорта и экспорта изменяемых (mutable) глобальных переменных, позволяющих применять глобальное связывание для таких значений, как указатели стека в C++.
  • Новые инструкции для преобразования типа float в int, которые вместо генерации исключения при переполнении результата возвращают минимально или максимально возможное значение (необходимо для SIMD).
  • Инструкции для расширения знака целых чисел (увеличение разрядности числа с сохранением знака и значения).
  • Поддержка возвращения нескольких значений блоками и функциями (в дополнение к передаче в функции нескольких параметров).
  • Реализация JavaScript-функций BigInt64Array и BigUint64Array для преобразования между JavaScript-типом BigInt и представлением 64-разрядных целых чисел в WebAssembly.
  • Поддержка ссылочных типов (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).

Источник.