WebAssembly, или заговор четырёх

Пролог

Вестерновый салун где-то на восточно-европейских просторах. Несколько олдфагов и миддлфагов играют в техасский холдем опкодами x86-процессора. Пара ньюфагов пытаются скомпилировать OneHalf под iOS. Неожиданно дверь распахивается, входит самурай с 64-х битной катаной на поясе и кладёт на стол постер «Разыскивается».

«WASM Wanted!» — гласит большая надпись.

— Мы снова в деле, котаны, — говорит самурай.

Великолепная четвёрка

Долгое, очень долгое время практически единственным языком программирования для страниц, загружающихся в браузере, был Javascript. Здесь можно вспомнить о Java-апплетах и Flash-виджетах, используя которые бесстрашные программисты пытались превзойти всевозможные ограничения, но все эти технологии имели ограниченное и не всегда удобное применение. Основным способом оживить свою страницу — заставить идти снег или бегать котика из одного угла в другой — оставался и остаётся Javascript. Для него было написано множество библиотек и фреймворков, но всё же в различных кругах росло недовольство.

— Желаем программировать на нормальном языке! — роптали одни.
— Почему всё такое медленное? — негодовали другие.
— Хотим компилировать! — восклицали третьи.

Наконец, их мольбы были услышаны. Google, Microsoft, Mozilla и группа инженеров, стоящая за Webkit (Apple, как обычно, делает загадочный вид), объединились, чтобы создать стандарт, который откроет новую эпоху в области web-программирования.

Они решили назвать его WebAssembly, а сокращённо — попросту wasm.

Что это такое

Проблемы, которые были озвучены — сложность программирования на других языках и низкая скорость выполнения, производители браузеров пытались решить по отдельности. Mozilla разрабатывала asm.js — подмножество JavaScript, которое, с одной стороны, исполняется обычным браузером, а с другой, браузер, поддерживающий этот стандарт (Firefox), способен выполнить его гораздо быстрее, чем обычный JavaScript. Также asm.js задумывался как решение проблемы с программированием на других языках — чтобы он мог служить целью компиляции других языков. Google предложил своё решение — Native Client, в котором бы исполнялся запесоченный для безопасности скомпилированный код C и C++. Однако ни то, ни другое решение не смогло завладеть умами людей и разработчиков.

WebAssembly — это новая попытка разработать новый стандарт, который решит старые проблемы и будет принят всеми основными участниками. Объединились производители основных браузеров, поэтому есть надежда, что в этот раз она окажется успешной.

Что из себя представляет WebAssembly, главный репозиторий которого находится здесь? Это не совсем привычный нам байткод. WebAssembly имеет формат AST — абстрактного синтасического дерева, которое может быть представлено как в бинарном виде — основном для распространения, так и в текстовом, соответствующим двоичному.

Вот пример WebAssembly в человекочитаемой форме.


(module
  (func $return_i32 (result i32)
    (unreachable))
  (func $return_f64 (result f64)
    (unreachable))

  (func $if (param i32) (result f32)
   (if_else (get_local 0) (unreachable) (f32.const 0)))

  (func $block
   (block (i32.const 1) (unreachable) (i32.const 2)))

  (func $return_i64 (result i64)
   (return (i64.const 1))
   (unreachable))

  (func $call (result f64)
   (call $return_i32)
   (unreachable))

  (export "return_i32" $return_i32)
  (export "return_f64" $return_f64)
  (export "if" $if)
  (export "block" $block)
  (export "return_i64" $return_i64)
  (export "call" $call)
)

Лисперам должно понравиться. Конечно, компилироваться wasm будет в бинарную форму.

План захвата мира

В первую очередь, WebAssembly рассчитан на web-платформу. Вот как определяется эта цель:

Проектируется, чтобы запускаться внутри и хорошо интегрироваться с существующей веб-платформой:

    • сохранять безверсионную, протестированную и обратносовместимую историю Веб;
    • запускаться в той же семантической вселенной, что и JavaScript;
    • позволять синхронизированные вызовы из и в JavaScript;
    • соблюдать такие же политики безопасности;
    • иметь доступ к функциональности браузера через такие же Web API, которые доступны в JavaScript;
    • определить человекоредактируемый форма, конвертируемый в и из двоичного для поддержки функциональности просмотра исходников.

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

Для программистов самое интересное – это то, для генерации приложений в WebAssembly можно будет использовать не JavaScript, а другие языки. Первым, для кого делается поддержка, является C++. Ветераны указатели и шаблонов снова впереди!

Эпилог

Будущее покажет, перерастёт ли это попытка в лавину. Если да – веб-разработка (прямая и обратная) стоит на пороге больших перемен и становится ближе к традиционной.

Программы для развития.