[Перевод] WebAssembly: начало новой эры
Веб ожидает большое будущее.
Вчера Брендан Айк «взорвал» сообщество веб-разработки: веб получит новый низкоуровневый бинарный компилируемый формат, который будет работать гораздо лучше, чем JavaScript.
Google, Microsoft, Mozilla, а также несколько независимых специалистов работают над новым проектом в W3C WebAssembly Community Group, и то, над чем они работают, совсем не маленькая вещь.WebAssembly — это:
- Улучшение JavaScript: Реализуйте все критичные вещи на wasm (сокращение от WebAssembly — прим. переводчика) и импортируйте его как стандартный JavaScript модуль.
- Новый язык программирования: WebAssembly определяет абстрактное синтаксическое дерево (как и JavaScript) в бинарном формате. Вы можете писать код и чистить его от ошибок в текстовом формате. WebAssembly легко читаем.
- Улучшение для браузеров: Браузеры будут понимать бинарный формат, а это значит, что разработчики смогут компилировать бинарники, которые можно сжать гораздо больше, чем используемые сегодня текстовые файлы с JavaScript. Чем меньше файл, тем быстрее загрузка. В зависимости от возможностей оптимизации времени компиляции, код на WebAssembly может передаваться и запускаться быстрее, чем на JavaScript!
- Целевая компиляций: Возможность другим языкам, получить первоклассную двоичную поддержку через весь стек веб-платформы.
Что это значит для JavaScript?
Прежде, чем ответить на этот вопрос, давайте отмотаем время назад. Вернемся во времена до React, Angular, Backbone и jQuery.
Вот мы и на месте.
Сеть — это набор гипертекстовых документов, отображаемых с помощью систем доставки сообщений, которые, однако, пока еще не связаны между собой. Первый веб-сервер был запущен на компьютере NeXT (см. ниже) в ЦЕРНе…
На дворе 1991 год. Я еще не успел поседеть. Я пытаюсь взломать десятитысячную текстовую игру-квест (я их все не считал).
Я выбрал своеобразный язык программирования для этой цели. На тот момент мне уже успел надоесть и BASIC, и Pascal. Я хотел использовать С, но не мог: я все еще копил на коробочную версию Borland Turbo C++ (они буквально приходят в упакованных коробках с инструкцией и установочным диском). Тогда у меня не было даже простейшего Turbo Assembler.
Я писал на языке ассемблера и «компилировал» в исполняемую программу с помощью командной строки в ДОСе и «debug». Если это звучит безумно, поверьте мне, так оно и было. Держу пари, что даже те из Вас, которым посчастливилось работать с ДОС, не знают, что можно использовать «debug» для отладки ассемблера и диссасемблеризации (обратный инжиринг) существующего кода.
Звучит круто? Нет. Я ненавидел это. Я не мог дождаться момента, когда смогу сесть за новенький Borland Turbo C++ и программировать по-человечески. В общем, мне его подарили. Ура!
Мне нравился Borland Turbo C++ потому, что на нем был предустановлен Borland Turbo Assembler. Что?! Зачем программировать на языке ассемблера, когда у тебя есть замечательный высокоуровневый, объектно-ориентированный инструмент C++?
Иногда вы хотите работать с голым железом, или близким к нему, без плавления мозга. Кстати, я упоминал что написал много машинного кода до использования C++?
Я сошел с ума.
Добиться реальных результатов не так легко, когда пишешь код на языке ассемблера. Тогда зачем же нам нужен WebAssembly?
Мы нуждаемся в WebAssembly потому, что при всей гибкости Javascript, все еще сложно представить много вещей, которые мы бы хотели в нем видеть, и особенности языка, которые нам нужно туда добавить, только усложнят язык, что уже смущает пользователей.
WebAssembly позволяет нам работать с простыми, низкоуровневыми блоками кода, которые можно использовать для программирования чего угодно.
Чем он отличается от JavaScript? Ключевое слово — «низкоуровневый». Он определяет примитивы, включая ряд типов и операций над этими типами, литералы для них, control-flow, вызовы, кучи и т.д.
Это очень простые примитивы. Ничего сложного. Нет сложной объектной системы (прототипной или какой-то другой). Нет встроенной, автоматической «сборки мусора» следующей за Вами и периодически Вас останавливающей, когда ей нужно собрать мусор.
На самом деле, это будет полезным, чтобы не думать о WebAssembly как о языке вообще. Это больше похоже на машину, немного похожую на машину Тьюринга…
Что же такое WebAssembly?
WebAssembly определяет абстрактное синтаксическое дерево (AST), которое хранится в бинарном формате. Бинарность это здорово, так как позволяет создавать меньшие приложения. Наверняка вы задаетесь вопросом, как можно отлаживать бинарный код.
К счастью, уже сейчас активно идет разработка отладчика, который будет работать в браузерах, а абстрактное синтаксическое дерево будет представлено в (относительно) легко читаемом текстовом формате. Я бы хотел показать примеры, но их пока не особо много. Пожалуй, код на WebAssembly будет все же прочитать сложнее, чем аналогичный код, написанный руками на JavaScript, но, его как минимум будет так же легко читать, как ASM.js. Может даже и легче. Посмотрим.
Для чего будет использоваться WebAssembly?
Среди всего прочего, его можно будет использовать для простой работы с тредами и SIMD (single instruction, multiple data) — проще говоря, с одним потоком команд и несколькими потоками данных. Вы можете поставить в очередь множество блоков данных, а затем прописать одну команду для одновременной работы с ними.
Это значит, что параллельная обработка потокового видео будет обрабатываться процессором. Если вы держите руку на пульсе, то слышали об этом решении в JS, но я всегда считал неудобным решать низкоуровневые вещи посредством JavaScript.
Именно в таких случаях Вам, пожалуй, стоит забыть про объектную систему, «уборщики мусора» и динамическую обработку запросов. Просто поставьте потоки данных в очередь и максимально быстро и эффективно обработайте их.
Как насчет приложений?
На настоящий момент, такие приложения, как Ableton Live (написание музыки) и Adobe Premiere Pro (создание видео), не слишком подходят для портирования в Веб. Замечу, что это возможно, но все же пока затруднительно. Надо решить еще много проблем. Например, надо решить, как лучше синхронизировать данные для real-time приложений.
Кроме того, можно будет разрабатывать приложения, которые будут передавать большие объемы данных через сети обрабатывающих функций. Например, такие, как приложение гитарной педали. Когда люди задумываются о таких вещах, они как правило не думают о JavaScript. Много людей вероятно думают, что это чистое сумасшествие, чтобы даже попытаться.
Но, в любом случае, JavaScript — действительно отличный язык, чтобы построить большую часть приложения, о котором вы только можете мечтать.
WebAssembly органично заполнит пробелы, которые есть в функциональности JavaScript.
Пробелы в функциональности JavaScript есть, и это далеко не секрет. Даже самые преданные его фанаты вряд будут спорить с утверждением, что порой язык пытается «проглотить» слишком много, теряя гибкость и эффективность. Еще вчера я думал, что эти пробелы можно устранить, просто добавив больше функциональности в сам JavaScript. Брендан Айк предложил тот же путь на конференции Fluent. Я аплодировал.
Однако, все это время мы упускали один момент: все хотят программировать на языке высокого уровня, но в то же время и иметь возможность «опускаться» до языка ассемблера, когда надо увеличить скорость.
WebAssembly может увеличить скорость JavaScript в разы!
Я уверен, что сегодня по всей Сети появятся десятки, если не сотни, статей про WebAssembly. Я более чем уверен, что большая их часть будет посвящена не тому, о чем я писал ранее, а совсем другой особенности этого языка программирования. От нее я, кстати, тоже в восторге.WebAssembly позволяет использовать больше языков в веб-разработке
Конечно, на самом деле нам не нужен WebAssembly, чтобы использовать в веб-разработке другие языки программирования. Например, у нас уже есть отличные игровые AAA-движки, которые прекрасно работают с компиляцией из JavaScript.
Если вы слышите, что JavaScript работает медленно… Это не так.
WebAssembly добавляет вещи, которые большинство JS разработчиков не хотят видеть в JavaScript. Сама функциональность нужна, но вот в JavaScript ей места точно нет. Тем более, что мы можем получить все эти функции с помощью компиляции с других языков программирования.
Фактически, WebAssembly предоставляет нам альтернативный компилятор — созданный специально для этих целей.
Теперь, нам будет гораздо легче портировать код, который сильно зависит от, например, совместно используемых цепочек памяти. Я уверен, что написать компилятор для WebAssembly будет легче, чем написать компилятор для JavaScript, а все потому, что первый гарантирует лучший перенос функций языка в заданное абстрактное синтаксическое дерево.
То, что все старые языки программирования теперь без проблем могут быть использованы в Сети — это хорошо, однако главное не в этом. Дело в том, что:
WebAssembly является отличным основанием для разработчиков начать работу над новыми языками программирования.
Сеть ожидает большое будущее. Так что лучше выходить из тени и браться за дело, пока не поздно.Дополнения + FAQ
В: Что такое wasm?
О: Сокращение от WebAssembly.
В: Почему бы не использовать JVM?
О: Попытки добавить JVM в браузеры с помощью плагинов были и не раз. К сожалению, ничего хорошего из этого не вышло. В JavaScript есть встроенная виртуальная машина, поэтому добавление еще одной приводит к появлению второго набора API подключений, чтобы дать виртуальной машине доступ к DOM, сетям, сенсорам, устройствам ввода и т.п. За это придется кое чем пожертвовать. Например, как будут процессы в виртуальной машине распределять между собой имеющиеся ресурсы? Ответить на этот вопрос сложнее, чем кажется.
Сначала, WebAssembly будет работать как ASM.js полифил, то есть он сможет использовать виртуальную машину JavaScript. Дизайн языка развился исходя именно из этого, и именно поэтому в WebAssembly будет более гладкая интеграция с браузерами, чем могут предложить альтернативные виртуальные машины.
В: Означает ли появление WebAssembly, что в будущем появится много новых языков программирования? Не приведет ли это к фрагментации?
JavaScript в полной безопасности. Его экосистема будет процветать еще много лет. WebAssembly больше касается производительности, разнообразия и движения вперед, а не фрагментации.
О: У JavaScript всегда была очень серьезная конкуренция на стороне сервера, а также в программировании для встраиваемых систем, таких как небольшие компьютеры и роботы. Несмотря на наличие большого количества довольно неплохих альтернатив с развитыми экосистемами и профессиональными командами разработчиков, Node продолжает быстрыми темпами наращивать присутствие на серверах стартапов и коммерческих предприятий.
К тому же, JavaScript имеет неплохую поддержку в лице плеяды разработчиков, а также мощной экосистемы. Я люблю добавлять в статьи графики популярности различных модулей. Смотришь на эти кривые и поражаешься.
Обратите внимание на зеленую кривую. Это npm, стандартный репозиторий для JavaScript, который поставляется в связке с Node.
JavaScript все чаще используется в разработке игр, в программировании роботов и IoT устройств. Хотя в этих областях есть значительная конкуренция со стороны C, C++ и Java, на положение JavaScript как для главного языка веб-программирования это никак не влияет. У всех разработчиков есть выбор, и они используют JavaScript не просто так, а потому, что он им нравится.
JavaScript выживет. «Есть только два вида языков программирования: те, на которые люди постоянно жалуются, и те, которые никто не использует». Бьёрн Страуструп
Полезные материалы
W3C WebAssembly Community Group
Mailing List
IRC: irc://irc.w3.org:6667/#webassembly
GitHub
Who«s involved? Об авторе
Эрик Эллиот (Eric Elliott) — автор книг «Programming JavaScript Applications» и «Learn JavaScript Universal Development with Node, ES6, & React». Он участвовал в разработке программных продуктов для Adobe Systems, Zumba Fitness, The Wall Street Journal, ESPN, BBC, а также для таких исполнителей, как Usher, Frank Ocean, Metallica и многих других. Эрик проводит большую часть времени в Кремниевой долине вместе с самой красивой женщиной в мире.
Над переводом работали: greebn9k (Сергей Грибняк), seninrom (Роман Сенин), silmarilion (Андрей Хахарев)
Singree