Пролог
Вестерновый салун где-то на восточно-европейских просторах. Несколько олдфагов и миддлфагов играют в техасский холдем опкодами 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++. Ветераны указатели и шаблонов снова впереди!
Эпилог
Будущее покажет, перерастёт ли это попытка в лавину. Если да – веб-разработка (прямая и обратная) стоит на пороге больших перемен и становится ближе к традиционной.