November 11, 2019

Web Assembly: что это вообще такое и с чем его едят?

Web Assembly поддерживается всеми основными браузерами и обеспечивает некоторые преимущества в производительности по сравнению с JavaScript. Веб-сборка имеет большой потенциал и поддержку.

Что такое веб-сборка?

Web Assembly — это спецификация для виртуальной машины, которая работает в браузере. По сравнению с высокодинамичной веб-сборкой JavaScript можно добиться гораздо более высокой производительности. Вопреки распространенному заблуждению, хотя Web Assembly не полностью заменяет JavaScript.

Веб-сборка основана на LLVM (низкоуровневая виртуальная машина), на которую могут ориентироваться компиляторы. Если кто-то хочет создать новый язык программирования, у него может быть компилятор для его языка, создающий код LLVM, а затем можно использовать уже существующую цепочку инструментов, чтобы скомпилировать его для конкретного кода платформы. Человеку, создающему компилятор для нового языка, не нужно было бы создавать совершенно разные системы для разных архитектур ЦП. Web Assembly, основанная на LLVM, может запускать код, написанный на разных языках.

Пока еще не поддерживается сборка мусора, что ограничивает языки, на которые она нацелена в настоящее время. C/C++, C# и Rust — это несколько языков, которые на сегодняшний день могут использоваться с веб-сборкой, но в будущем ожидается больше.

Какие другие языки можно использовать?

C/C++, C#/.Net, Elixir, Go, Java, Python, Rust.

Зачем использовать веб-сборку?

Web Assembly в первую очередь можно использовать для повышения производительности в вычислительно дорогих операциях. Используемый двоичный формат гораздо более строг, чем JavaScript, и он больше подходит для вычислительных операций. Существует также много существующего и проверенного кода для работы, такого как криптография или видеодекодеры, который существует в C/C++, который можно использовать на странице. Несмотря на всю свою гибкость, интерпретируемый код JavaScript работает не так быстро, как собственный двоичный файл. Для некоторых типов приложений эта разница в производительности не важна (например, в текстовом редакторе). Для других приложений различия в производительности приводят к различиям в опыте.

Хотя спрос на производительность является мотивацией для создания собственного двоичного файла, существуют также соображения безопасности. Собственные двоичные файлы могут иметь доступ к большему количеству системных ресурсов, чем реализованное в сети решение. Также важна забота о том, чтобы программа (особенно если она от третьей стороны) не делала ничего вредоносного или не получала доступ к ресурсам без разрешения. Веб-сборка помогает преодолеть разрыв между этими двумя потребностями. Это обеспечивает более высокую производительность среды.

C++? Разве этим не переполнится буфер?

Конечно. Но только в пределах песочницы, в которой будет выполняться код. Это может привести к сбою программы, но не может вызвать произвольное выполнение кода вне песочницы.
В настоящее время Web Assembly не имеет никаких привязок к Host API. Когда кто-то ориентируется на веб-сборку, у него нет среды, позволяющей обойти ограничения безопасности, в которых будет выполняться код JavaScript. Нет прямого доступа к файловой системе, нет доступа к памяти вне программы, есть ограниченность в общении с WebSockets и HTTP-запросом, который не нарушает ограничения CORS.

Оригинал и пример использования тут.