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

Цель - сохранить совместимость 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:
-
В
- JavaScript-программах (как это бывает с asm.js) можно будет использовать модули, написанные на wasm. Это будет происходить через систему модулей ES6.
- В нем будет собирательный гараж и доступ к DOM.
- Возможны два представления кода: бинарное для исполнения или текстовое для чтения. Что касается языка сборки - но это не одно .
- Backend wasm предлагается для LLVM изначально. Мы сможем генерировать код wasm по опциям из C/C + +. Затем он будет доступен для других языков .
- Полифилл - программа JavaScript, которая преобразует код wasm в asm.js для старых браузеров, не поддерживающих первый .
И один недостаток:
- Он пока не поддерживает компиляцию динамических языков (например, JavaScript).
Даже если языки, скомпилированные в 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 для определения интерфейсов между wasm и различными средами. Первая была сделана для JavaScript.
Сам язык таким образом можно использовать на всевозможных платформах: и в Сети, и на рабочем столе, и на любой операционной системе. Это зависит от того, какие 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.
- бинариен. Скрипт для выполнения кода wasm в командной строке.
- asm2wasm. Компиляция asm.js в WebAssembly.
- wasm2asm. Компиляция WebAssembly в asm.js.
- s2wasm. Компилирует код, специально созданный LLVM, в WebAssembly. У LLVM для этого есть свой формат.
- wasm.js. Версия binaryen JavaScript: после включения в веб-страницу она позволяет запускать wasm, даже если браузер еще не поддерживает его .
- Эмскриптем. Компилирует C и C++ в asm.js и с опцией BINARYEN затем компилирует asm.js в wasm.
- Илвасм. Преобразует промежуточный код .NET в wasm. Частично на данный момент.
- Lucet - компилятор под управлением Linux для создания локальных приложений из кода C.
- Родной. Компилятор wasm, создающий бинарные исполняемые файлы для Windows или Linux. Совместим с C.
Ссылки
- WebAssembly.fr. Сайт на французском языке, посвященный языку, предлагает учебники и демонстрации.
- Какой язык программирования для WebAssembly?
- Группа сообщества WebAssembly. На W3C эта группа, посвященная новому языку, открыта для новых участников. В настоящее время авторами являются команда Google V8 и NaCl, команда Mozilla Emscribtem, Microsoft и команда Apple langings и runtime.
- От Asm.js до WebAssembly. Выступление Брендона Эйха. (Английский).
- Дизайн WebAssembly. На GitHub все подробности про wasm. (Английский).