WebAssembly, байт-код для браузера

Этот совместный проект редакторов браузера предлагает промежуточный язык для Интернета на основе asm.js.

Представлен Бренданом Эйхом, создателем JavaScript и частично Asm.js, WebAssembly или Wasm, является новым языком промежуточного представления (IRL), совместимым со всеми браузерами. Он позволит различным высокоуровневым языкам работать в браузерах, будучи скомпилированным в Wasm. Первоначальная цель - компиляция программ и библиотек C и C++ в WebAssembly. Тогда придется следовать и другим языкам.

В июне 2015 года разработка только начинается. Но ему способствует использование Asm.js в качестве отправной точки. Это подмножество JavaScript совместимо со всеми браузерами.

WebAssembly schéma de fonctionnement

Цель - сохранить совместимость Asm.js и wasm в течение нескольких лет. Не только для поддержки с браузерами, но и потому, что Asm.js тоже находится в разработке, и новые возможности, которые в него включены, также будут незаменимы для wasm. Например, потоки с общей памятью, поддержка многоядерных процессоров.

Впоследствии, когда все браузеры будут поддерживать новый язык WebAssembly, оба языка могут расходиться. Второй будет изменен без касания Asm.js, а значит, JavaScript.

В частности, Wasm получает поддержку Google с привлечением команды NaCl, поэтому можно предвидеть отказ от последней, чья цель была довольно близка: заставить нативные приложения работать в браузере. Также команда V8 объявила о продолжающейся интеграции wasm в компилятор JavaScript. Таким образом, движок wasm может создавать IR-код (промежуточное представление), который непосредственно интерпретируется в JIT.

Эксперименты показали, что за время разбора нового кода (не скорость выполнения) может быть в 20 раз быстрее, чем у Asm.. js. Размер производимого бинарного кода он также меньше, чем в Asm.js.
По словам Брендона Эйха, на самом деле wasm - это «сжатое АСТ-кодирование», а не настоящий байтекод. AST для Abstract Syntax Tree - дерево кода.

Еще несколько преимуществ wasm:

И один недостаток:

Даже если языки, скомпилированные в WebAssembly, становятся возможной альтернативой JavaScript, он останется поддерживаемым и привилегированным браузерами. Wasm станет частью компилятора JS.

Зачем новый промежуточный язык

?

Почему бы тебе просто не использовать LLVM, байт-код Java или .NET ?

Главная цель wasm - заставить исходный код, написанный на C и C++, работать в веб-приложениях. На этих языках написано огромное количество функций, возможность их повторного использования с сопоставимым временем выполнения действительно заметна. 3D-игры тоже в основном написаны на C++: они становятся портативными с wasm .
Wasm хочет быть к приложениям в браузере тем, чем Vulkan является в OpenGL и DirectX: универсальным и носимым промежуточным кодом со скоростью экшн, близкой к родной.

LLVM

Битовый код LLVM не был сохранен, так как не является переносимым. Он содержит мета-данные и предназначен для создания исполняемых бинарных файлов, а не для управляемой работы на всех системах.
Кстати, Google уже пыталась использовать LLVM в браузере с NaCL и это не было принято другими издателями.
Однако для компиляции промежуточного языка LLVM в wasm используется Emscribtem, поэтому мы сохраняем преимущества его инструментов.

.NET

Runtime .NET имеет промежуточный код, который может выполняться с виртуальной машиной или быть скомпилирован. Однако он не подходит для языков C и C++. Microsoft использует C + +/CLI, который отличается от собственного C++.

JVM

Виртуальная машина Java тоже не одна из них, потому что хотя на этой платформе было много языков, это не так С и С++. Даже не говоря уже о склонности Oracle к судебному преследованию по такому тщетному мотиву, как использование ее API. Вся Сеть может столкнуться с армией угрюмых юристов фирмы, что было бы катастрофически. WebAssembly обеспечит мирное развитие.

Котировки Брендона Эйха в WebAssembly

Продолжение эволюции ASM.js - это wasm.

Сначала WebAssembly начинается как ASM.js, но при сжатом синтаксисе это бинарный синтаксис. Но как только все браузеры будут поддерживать и wasm, и ASM.js, и после приличного интервала обновлений браузеров, тогда wasm сможет начать расти с лишней семантики, которую не нужно ставить в JavaScript.

Есть количество языков, которые ты мог бы скомпилировать в wasm.

Предполагать, что сеть находится в стазисе - это нехорошая гипотеза, я думаю, это та ошибка, которая давно произошла с такими проектами, как Portable Native Client, и Dart тоже.

WebAssembly vs Java

Lest создатели языка увидели гораздо дальше браузера, когда определили его спецификацию. Фактически она разделена на два слоя:

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

Целью проекта WASI является создание стандартного интерфейса для всех операционных систем, чтобы один и тот же бинарный код wasm можно было компилировать один раз и использовать везде. Затем можно сравнить WebAssembly с Java. Первый имеет преимущество работать в изоляции с собственной памятью, поэтому позволяет более безопасные приложения. Также нет тени Oracle и ее ограничений на «интеллектуальную собственность».

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

Создание и использование кода WebAssembly

Вы должны установить emsdk, и wasmer или wasmtime, чтобы создать программы wasm.

Затем можно скомпилировать источник C или C++ в wasm с помощью этой команды:

emcc demo.cpp -o demo.wasm

и выполнить программу с помощью этой команды:

wasmtime demo.wasm

Полный учебник на французском языке представлен на сайте: webassembly.fr.

Инструменты для генерации кода и его запуска доступны на GitHub.

Ссылки