WebAssembly станет самым большим изменением в веб-разработке с момента появления JavaScript, и теперь у нас есть убедительные доказательства того, что он становится чем-то реальным. Microsoft, Google и Mozilla выпустили совместимые предварительные версии WebAssembly и игры, которую вы действительно можете запустить.
В прошлом году о WebAssembly было объявлено, что это великая революция в способах выполнения кода в браузере. В то время все это казалось очень расплывчатым и далеким от практического предложения, но постепенно все сходится. Теоретически Google, Mozilla, Microsoft и Apple работают над определением и внедрением WebAssembly в рамках сообщества W3C WebAssembly, но сегодняшние объявления примечательны отсутствием Apple и Webkit.
WebAssembly теперь доступен в Chrome Canary и Firefox Nightly, а также во внутренней сборке Edge. Вы должны установить флаг, чтобы включить WebAssembly как в Chrome, так и в Firefox. После перезапуска в JavaScript доступен новый объект Wasm, который может создавать и запускать модули WebAssembly.
Существует также демонстрационная программа, показывающая, насколько быстро WebAssembly может запускать 3D-игру. Игру Angry Bots можно запустить в WebAssembly или с помощью asm.js.
WebAssembly — это абстрактное синтаксическое дерево (AST), представляющее то, что по сути является подмножеством asm.js JavaScript. Это намного проще оптимизировать, и, следовательно, WebAssembly может работать быстро, используя большую часть инфраструктуры, уже доступной в текущих движках JavaScript. По сути, AST — это предварительно скомпилированные представления asm.js, которые позволяют движкам выполнять код, а не анализировать исходный код. Согласно блогу двигателя V8:
«Специализированный декодер WebAssembly проверяет модули, проверяя типы, индексы локальных переменных, ссылки на функции, возвращаемые значения и структуру потока управления за один проход. Декодер создает график TurboFan, который обрабатывается различными проходами оптимизации и, наконец, превращается в машинный код с помощью тот же бэкэнд, который генерирует машинный код для оптимизированного JavaScript и asm.js. »
Вы можете увидеть, как команда Mozilla описывает разницу между processng asm.js и WebAssembly:
В блоге Mozilla говорится, что демо-игра компилируется примерно вдвое быстрее, чем asm.js.
На данный момент AST передаются в удобочитаемой форме, но следующим этапом является их преобразование в компактный двоичный формат. Это сделает их меньше и, следовательно, загрузит быстрее.
На странице игры GitHub также есть отчет о статусе:
Статус демонстрации WebAssembly
Вы можете видеть, что впереди еще есть куда идти.
Также не хватает инструментов, необходимых для создания WebAssembly. Они находятся в стадии разработки, но, как говорится в блоге V8:
Мы также планируем будущие функции WebAssembly (в том числе многопоточность, динамическое связывание и интеграцию GC / первоклассной DOM) и продолжаем разработку цепочек инструментов для компиляции C, C ++ и других языков через серверную часть WebAssembly LLVM и Emscripten.
На данный момент ничего из этого нельзя использовать для производственных приложений, но это доказательство того, что WebAssembly скоро появится. Есть планы изменить детали большей части того, что предлагается на данный момент. В блоге Firefox говорится, что они планируют дополнить средства разработки браузера не только основными, но и включить в них отладчик и профилировщик WebAssembly.
Есть некоторые предположения о том, можно ли использовать WebAssembly для компиляции программ JavaScript. Хотя все в мире программного обеспечения возможно, если вы приложите к этому достаточно усилий, это кажется маловероятным. Причина в том, что WebAssembly можно рассматривать как предварительно скомпилированную версию asm.js, которая является строгим подмножеством JavaScript. Чтобы представить полную программу JavaScript в WebAssembly, вам необходимо отобразить весь JavaScript в asm.js. Это могло бы быть возможно, но это непросто, и трудно понять, насколько быстрым будет результат.