Web Assembly

Sergey Rubanov, EXANTE limited

Sergey Rubanov

JavaScript samurai at EXANTE ltd.

Web Assembly

Кратчайшая история web-приложений

JavaScript как compile target

Главная проблема JavaScript — это
сам JavaScript

И вот это

null == 0;               // false
null > 0;                // false
null >= 0;               // true
Math.min() < Math.max(); // false

Дальнейшее развитие ECMAScript ограничено

Reserved words

Future reserved words

Принцип don't break the Web

asm.js

статически-типизированное подмножество JavaScript

asm.js pipeline

Не предназначен для написания программ человеком, получается с помощью компиляторов исходного кода в исходный код, таких как Emscripten

код на c

int add1(int i) {
    return i + 1;
}

код на asm.js

function add1(i) {
    i = i|0;
    return (i + 1)|0;
}

особенности asm.js

PNaCl

архитектурно-независимое решение для исполнения нативного кода в песочнице

Особенности PNaCl

изолирован в собственной виртуальной машине и не имеет прямого доступа к DOM, JS

Что насчет JVM?

А может быть...
LLVM?

А что если...
Flash VM?

Web Assembly

a new binary syntax for low-level safe code, initially co-expressive with asm.js, but in the long run able to diverge from JS’s semantics, in order to best serve as common object-level format for multiple source-level programming languages.

Brendan Eich

Он представил Web Assembly в своем блоге 17 июня 2015

High-Level Goals

High-Level Goals

High-Level Goals

High-Level Goals

High-Level Goals

MVP

Модули WebAssembly

Инстанс модуля содержит

Линейная память

MVP

Порядок вычисления AST

Все узлы, отличающиеся от конструкций управления, вычисляются в том порядке, в котором они представлены в AST.

(i32.add
    (set_local $x (i32.const 1))
    (set_local $x (i32.const 2)))

Ловушки

Если экземпляр прервал работу, то информация об этом прокидывается во внешнее окружение. В JavaScript окружении, например, таком как браузер, ловушка вызывает исключение и может быть увидена в DevTools.

Типы

Управляющие конструкции

MVP

Бинарный Формат

Предназначен быстрого старта, а именно уменьшение размера модулей и быстрого декодирования

MVP

Текстовый формат

Отладка текстового формата

Текстовый формат эквивалентен и изоморфен бинарному.
В бинарном представлении все имена функций и переменных сжимаются до индексов, поэтому в текстовом режиме могут не отображаться. Для решения этой проблемы можно добавить опциональную глобальную секцию debug symbol.

MVP

MVP

Polyfill

PostMVP

Дальнейшие планы

Feature detection

Подход из JavaScript не работает

if (foo)
    foo();
else
    alternativeToFoo();

Feature detection

Подход, который работает

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

  2. Специальный уровень декодирования — использование has_feature для определения неподдерживаемых фич и использование полифилла или ловушек.

Инструментарий

Какие плюсы принесет WebAssembly

Что почитать