Опубликован стандарт WebAssembly 3.0

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

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

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

Доступны следующие спецификации:

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

Отмечается, что в новой версии стандарта значительно улучшена поддержка компиляции в WebAssembly высокоуровневых языков. Например, реализована возможность компиляции в WebAssembly проектов на языках Java, OCaml, Scala, Kotlin, Scheme и Dart. Основные изменения в WebAssembly 3.0, по сравнению со второй версией стандарта:

  • Реализована поддержка 64-разрядного адресного пространства. Для адресации памяти теперь может применяться тип i64, а не только i32, что расширяет доступное для приложений адресное пространство с 4 ГБ до 16 ЕБ (при выполнении в браузере выставлено ограничение в 16 ГБ).
  • Предоставлена возможность одновременного использования в одном WebAssembly-модуле нескольких объектов памяти и работы с разными адресными пространствами. Среди прочего, возможно копирование данных между разными экземплярами объектов памяти, размещёнными в разных адресных пространствах.
  • Добавлена поддержка сборки мусора. Помимо ранее доступной линейной памяти предложен отдельный тип хранилища, автоматически управляемый при помощи сборщика мусора. Компилятор теперь может использовать отдельные структуры данных, массивы и переменные, за выделение памяти и управление жизненным циклом которых отвечает WebAssembly.
  • Добавлена поддержка типизированных ссылок, которые могут описывать точную структуру значения, на которое указывает ссылка, что позволяет избежать дополнительных проверок во время выполнения. Поддерживаются подтипы, рекурсия типов и возможность безопасного использования ссылок на функции, не требующих проверок типов и границ во время выполнения.
  • Добавлена поддержка хвостовых вызовов (Tail call), при которых текущая функция сразу завершает выполнение после вызова другой функции, не расходуя место в стеке.
  • Добавлена поддержка обработки исключений.
  • Добавлена поддержка «ослабленных» (relaxed) векторных SIMD-инструкций, позволяющих добиться более высокой производительности за счёт отказа от строгого соблюдения семантики на всех аппаратных платформах.
  • Добавлена поддержка детерминированного профиля
    выполнения, который определяет не зависящее от текущей платформы поведение для инструкций, результаты выполнения которых могут отличаться на разных платформах (операции с плавающей запятой, возвращение значения NaN, ослабленные векторные инструкции). При выборе данного профиля Wasm обеспечивает детерминированное поведение, воспроизводимость и переносимость.

  • Добавлен синтаксис для создания собственных аннотаций, позволяющих прикрепить дополнительную информацию к коду WebAssembly. Ранее поддержка пользовательских секций, позволяющих хранить произвольную информацию, имелась в бинарном формате WebAssembly, но отсутствовала в текстовом формате WebAssembly. Теперь есть возможность добавлять эту информацию в читаемом и редактируемом виде.
  • В JavaScript API добавлены встроенные функции для работы со строками. Ранее строки JavaScript можно было передавать в WebAssembly только как внешние ссылки, а теперь можно напрямую обращаться к строкам и манипулировать ими внутри WebAssembly.

Источник: http://www.opennet.ru/opennews/art.shtml?num=63899