Пролог Вестерновый салун где-то на восточно-европейских просторах. Несколько олдфагов и миддлфагов играют в техасский холдем опкодами 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 в человекочитаемой форме. Code: (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++. Ветераны указатели и шаблонов снова впереди! Эпилог Будущее покажет, перерастёт ли это попытка в лавину. Если да – веб-разработка (прямая и обратная) стоит на пороге больших перемен и становится ближе к традиционной. P.s полезная информация. Програмирование на fasm под Win64 часть 1 "Ассемблер, отладчик, IDE" http://wasm.ru/article/538 Програмирование на fasm под Win64 часть 2 "Системы счисления, память, регистры" http://wasm.ru/article/540 Програмирование на fasm под Win64 часть 3 "Окна WinDbg, метки, основные команды" http://wasm.ru/article/541