Перейти к основному содержимому

Экспериментальная поддержка WebAssembly в V8

· 3 мин. чтения
Сет Томпсон, ведущий разработки WebAssembly

Для всестороннего обзора WebAssembly и дорожной карты будущего сотрудничества сообщества, смотрите Веха WebAssembly в блоге Mozilla Hacks.

С июня 2015 года сотрудники из Google, Mozilla, Microsoft, Apple и сообщества WebAssembly W3C активно работают над проектированием, спецификацией и реализацией (1, 2, 3, 4) WebAssembly — нового времени выполнения и целевого компилятора для веба. WebAssembly — это низкоуровневый переносимый байткод, который разработан для кодирования в компактном бинарном формате и выполнения с почти нативной скоростью в безопасной песочнице памяти. Как развитие существующих технологий, WebAssembly тесно интегрирован с веб-платформой, а также быстрее загружается через сеть и быстрее создается, чем asm.js, низкоуровневый подмножество JavaScript.

Начиная с сегодняшнего дня, экспериментальная поддержка WebAssembly доступна в V8 и Chromium за флагом. Чтобы опробовать её в V8, запустите d8 версии 5.1.117 или выше из командной строки с флагом --expose_wasm или включите экспериментальную функцию WebAssembly через chrome://flags#enable-webassembly в версии Chrome Canary 51.0.2677.0 или выше. После перезапуска браузера, новый объект Wasm станет доступным в контексте JavaScript, предоставляя API, который позволяет создавать и выполнять модули WebAssembly. Благодаря усилиям сотрудников Mozilla и Microsoft, два совместимых реализации WebAssembly также работают за флагом в Firefox Nightly и во внутренней сборке Microsoft Edge (демонстрируется в видеозаписи экрана).

На сайте проекта WebAssembly доступен демо, демонстрирующий использование времени выполнения в 3D-игре. В браузерах, поддерживающих WebAssembly, страница демонстрации загрузит и создаст модуль wasm, который использует WebGL и другие API веб-платформы для отображения интерактивной игры. В других браузерах страница демонстрации переключается на версию asm.js той же игры.

Демо WebAssembly

Под капотом реализация WebAssembly в V8 разработана с использованием существующей инфраструктуры виртуальной машины JavaScript, особенно компилятора TurboFan. Специализированный декодер WebAssembly проверяет корректность модулей, проверяя типы, индексы локальных переменных, ссылки на функции, возвращаемые значения и структуру управления потоком за один проход. Декодер производит граф TurboFan, который обрабатывается различными проходами оптимизации и, наконец, превращается в машинный код тем же бэкэндом, который генерирует машинный код для оптимизированного JavaScript и asm.js. В ближайшие месяцы команда сосредоточится на улучшении времени запуска реализации V8 через настройку компилятора, параллелизм и улучшения политики компиляции.

Два предстоящих изменения также значительно улучшат опыт разработчиков. Стандартное текстовое представление WebAssembly позволит разработчикам просматривать исходный код бинарных файлов WebAssembly, как любого другого веб-скрипта или ресурса. Кроме того, текущий временный объект Wasm будет переработан, чтобы предоставить более мощный и удобный набор методов и свойств для создания и изучения модулей WebAssembly из JavaScript.