WebAssembly

редактировать

двоичный формат исполняемых файлов, используемых веб-страницами
WebAssembly
WebAssembly Logo.svg
Paradigm Императивный, структурированный, ориентированный на выражение
Разработан W3C
Разработчик
Первое появлениемарт 2017 г.; 3 года назад (2017-03)
Дисциплина набора текста Статическая
Лицензия Лицензия Apache 2.0
Расширения имен файлов
  • .wat
  • .wasm
Веб-сайтwebassembly.org
Под влиянием

WebAssembly (часто сокращается до Wasm или просто WA ) - это открытый стандарт, который определяет переносимый формат двоичного кода для исполняемых программ и соответствующую текстовую сборку язык, а также интерфейсы для облегчения взаимодействия между такими программами и их основной средой. Основная цель WebAssembly - включить высокопроизводительные приложения на веб-страницах, но этот формат разработан для выполнения и интеграции и в других средах, включая автономные.

WebAssembly ( т.е. базовая спецификация WebAssembly и интерфейс JavaScript WebAssembly) стал рекомендацией Консорциума всемирной паутины 5 декабря 2019 года и, наряду с HTML, CSS и JavaScript - это четвертый язык, который изначально работает в браузерах. Чтобы использовать Wasm в браузерах, пользователи могут использовать Emscripten SDK для компиляции C ++ (или любого другого поддерживаемого LLVM языка, такого как D или Rust ) исходный код в двоичный файл, который выполняется в той же изолированной программной среде, что и обычный код JavaScript. Emscripten предоставляет привязки для нескольких часто используемых интерфейсов среды, таких как WebGL. Blazor поддерживается через веб-сборку Mono-Wasm. Нет прямого доступа к объектной модели документа (DOM); однако для этого можно создать прокси-функции, например, через stdweb, web_sys и js_sys при использовании языка Rust..

WebAssembly обычно либо опережает время (AOT) или точно в срок (JIT) скомпилирован, при этом также доступна «WebAssembly Micro Runtime (WAMR), среда выполнения WebAssembly на основе интерпретатора для встроенных устройств».

Консорциум Всемирной паутины (W3C) поддерживает стандарт при участии Mozilla, Microsoft, Google, Apple, Fastly, Intel и Red Hat.

Содержание

  • 1 История
  • 2 Реализации
    • 2.1 Веб-браузеры
  • 3 Компиляторы
  • 4 Соображения безопасности
  • 5 WASI
  • 6 Спецификация
    • 6.1 Хост-среда
    • 6.2 Виртуальная машина
    • 6.3 Программа Wasm
      • 6.3.1 Набор команд
      • 6.3.2 Код представление
  • 7 Литература
  • 8 Примечания
  • 9 Ссылки
  • 10 Демо
  • 11 Внешние ссылки

История

WebAssembly был первым ced в 2015 году, и первая демонстрация заключалась в выполнении Angry Bots Unity в Firefox, Google Chrome и Microsoft Edge. Технологиями-предшественниками были asm.js из Mozilla и Google Native Client, а первоначальная реализация была основана на наборе функций asm.js. Технология asm.js уже обеспечивает скорость выполнения кода, близкую к нативному, и может считаться жизнеспособной альтернативой для браузеров, которые не поддерживают WebAssembly или отключили ее по соображениям безопасности.

В марте 2017 года было объявлено, что разработка минимально жизнеспособного продукта (MVP) завершена, и завершился этап предварительного просмотра. В конце сентября 2017 года с поддержкой был выпущен Safari 11. В феврале 2018 года рабочая группа WebAssembly опубликовала три общедоступных рабочих проекта базовой спецификации, интерфейса JavaScript и веб-API.

Реализации

, хотя изначально WebAssembly был разработан для обеспечения выполнения кода, близкого к машинному. скорость в веб-браузере считается ценным вне такового, в более общем контексте. Поскольку среды выполнения WebAssembly (RE) представляют собой виртуальные стековые машины низкого уровня (похожие на JVM или Flash VM ), которые можно встраивать в хост-приложения, некоторые из них нашли способ автономных сред выполнения, таких как Wasmtime и Wasmer.

Веб-браузеры

В ноябре 2017 года Mozilla объявила о поддержке «всех основных браузеров» (на данный момент все основные на мобильных и настольных компьютерах) после того, как WebAssembly был включен по умолчанию в Edge 16. Поддержка включает мобильные веб-браузеры для iOS и Android. По состоянию на октябрь 2020 года 92,06% установленных браузеров (92,93% браузеров для настольных компьютеров и 93,44% браузеров для мобильных устройств) поддерживают WebAssembly. Но для старых браузеров Wasm может быть скомпилирован в asm.js с помощью JavaScript polyfill.

Compilers

Поскольку исполняемые файлы WebAssembly предварительно скомпилированы, можно использовать различные языки программирования для их создания. Это достигается либо путем прямой компиляции в Wasm, либо путем реализации соответствующих виртуальных машин в Wasm. Сообщается, что около 40 языков программирования поддерживают Wasm в качестве цели компиляции.

Emscripten компилирует C и C ++ в Wasm с использованием Binaryen и LLVM в качестве бэкэнда.

Начиная с версии 8, автономный Clang может компилировать C и C ++ в Wasm.

Его первоначальная цель - поддержка компиляции из C и C ++, хотя и поддерживает другие исходные языки , такие как Rust, языки.NET и AssemblyScript (TypeScript -подобный) также появляется. После выпуска MVP планируется поддержать многопоточность и сборку мусора, что сделает WebAssembly целью компиляции для языков программирования со сборкой мусора, таких как C # (поддерживается через Blazor ), F # (поддерживается через Bolero с помощью Blazor), Python и даже JavaScript, где браузера просто -время компиляции скорость считается слишком низкой. Некоторые другие языки имеют некоторую поддержку, включая Python, Java, Julia и Ruby, а также Go.

соображения безопасности.

В июне 2018 года исследователь безопасности представил возможность использования WebAssembly для обхода средств защиты браузера от уязвимостей безопасности Spectre и Meltdown после поддержки нитей с общей памятью добавлено. Из-за этой проблемы разработчики WebAssembly приостановили эту функцию. Однако, чтобы изучить эти будущие языковые расширения, в октябре 2018 года Google Chrome добавил экспериментальную поддержку предложения потока WebAssembly.

WebAssembly подвергся критике за упрощение сокрытия улик для вредоносного ПО писатели, мошенники и фишинговые злоумышленники; WebAssembly присутствует на компьютере пользователя только в скомпилированном виде, что «затрудняет обнаружение вредоносных программ». Скорость и маскировка WebAssembly привели к его использованию в скрытом крипто-майнинге на устройстве посетителя веб-сайта. Coinhive, ныне несуществующий сервис, облегчающий добычу криптовалюты в браузерах посетителей веб-сайта, утверждает их «Майнер использует WebAssembly и работает примерно на 65% производительности собственного майнера». В исследовании, проведенном в июне 2019 г. Техническим университетом Брауншвейга, было проанализировано использование WebAssembly на 1 млн веб-сайтов, входящих в топ-1 Alexa, и установлено, что в основном используется вредоносный крипто-майнинг, и на это вредоносное ПО приходится более половины WebAssembly -использование изученных веб-сайтов.

Возможность эффективно скрывать большие объемы кода также может использоваться для отключения блокировки рекламы и инструментов конфиденциальности, которые предотвращают веб-отслеживание, например Privacy Badger.

Поскольку WebAssembly поддерживает только структурированный поток управления , он поддается методам проверки безопасности, включая символьное выполнение. Текущие усилия в этом направлении включают в себя механизм символьного выполнения Manticore.

WASI

WebAssembly System Interface (WASI) - это простой интерфейс (ABI и API ), разработанный Mozilla и предназначенный для переносимости на любую платформу. Он обеспечивает POSIX -подобные функции, такие как файловый ввод-вывод, ограниченный безопасностью на основе возможностей. Есть также несколько других предлагаемых ABI / API.

WASI зависит от CloudABI и Capsicum.

Specification

Host environment

Общий стандарт предоставляет основные спецификации для JavaScript API и подробности по встраиванию.

Виртуальная машина

Wasm-код (двоичный или байт-код) предназначен для запуска на портативном виртуальная стековая машина (ВМ). Виртуальная машина разработана таким образом, чтобы ее анализировать и выполнять быстрее, чем JavaScript, и иметь компактное представление кода. Внешняя функциональность (например, syscalls ), которую может ожидать двоичный код Wasm, не предусмотрена стандартом. Скорее, он предоставляет способ обеспечить взаимодействие через модули в среде хоста, в которой работает реализация виртуальной машины.

Программа Wasm

Программа Wasm разработана как отдельный модуль, содержащий коллекции различных Wasm -определенные значения и определения типов программ. Они выражаются либо в двоичном, либо в текстовом формате (см. Ниже), оба имеют общую структуру.

Набор команд

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

Представление кода

В марте 2017 года группа сообщества WebAssembly достигла консенсуса по начальному двоичному формату (MVP), JavaScript API и эталонному интерпретатору. Он определяет двоичный формат WebAssembly (.wasm), который не предназначен для использования людьми, а также удобочитаемый текстовый формат WebAssembly (.wat), который напоминает помесь S-выражений и традиционных языков ассемблера.

В таблице ниже представлены три разных представления одного и того же исходного кода, введенного слева, поскольку он конвертируется в промежуточное представление Wasm , а затем в двоичные инструкции Wasm:

То же исходный код на C, ассемблере и Wasm
C источник вводабайт-код линейной сборки (промежуточное представление )двоичная кодировка Wasm (шестнадцатеричные байты)
int factorial (int n) {if (n == 0) return 1; else return n * factorial (n-1);}
; магическое число; тип for (func (param i64) (result i64)); функциональный раздел; начало раздела кода (func (параметр i64) (результат i64) local.get 0 i64.eqz if (результат i64) i64.const 1 else local.get 0 local.get 0 i64.const 1 вызов i64.sub 0 i64.mul end); конец модуля, размеры
00 61 73 6D 01 00 00 00 01 00 01 60 01 73 01 73 06 03 00 01 00 02 0A 00 01 00 00 20 00 50 04 7E 42 01 05 20 00 20 00 42 01 7D 10 00 7E 0B 0B 15 17

Все целочисленные константы кодируются с использованием компактного кодирования переменной длины LEB128.

Текстовый формат WebAssembly более каноничен в свернутом формате с использованием s-выражений. Для инструкций и выражений этот формат является чисто синтаксическим сахаром и не имеет поведенческих отличий от линейного формата. Через wasm2watприведенный выше код декомпилируется в:

(module (type $ t0 (func (param i64) (result i64))) (func $ f0 (type $ t0) (param $ p0 i64) (результат i64) (если $ I0 (результат i64); $ I0 - неиспользуемое имя метки (i64.eqz (local.get $ p0)); имя $ p0 здесь совпадает с 0 (тогда (i64.const 1)) (else (i64.mul (local.get $ p0) (вызов $ f0; имя $ f0 здесь то же, что и 0 (i64.sub (local.get $ p0) (i64.const 1))))))))

Обратите внимание, что модуль неявно генерируется компилятором. На функцию фактически ссылается запись таблицы типов в двоичном файле, отсюда раздел типов и тип, создаваемый декомпилятором. Компилятор и декомпилятор доступны в Интернете.

Литература

Примечания

Ссылки

Определение логотипа бесплатных культурных работ notext.svg Эта статья включает текст из бесплатного контента. Под лицензией Apache License 2.0 Лицензионное заявление / разрешение на Wikimedia Commons. Текст взят из Text Format, jfbastien; Россберг-хром; крипкен; титзер; s3thompson; sunfishcode; lukewagner; flagxor; enricobacis; c3d; бинджи; andrewosh, GitHub. WebAssembly / дизайн. Чтобы узнать, как добавить текст открытой лицензии в статьи Википедии, см. . Для получения информации о повторном использовании текста из Википедии см. условия использования.

Демо

  • Демонстрация виджетов: [1] с NWSTK
  • Демонстрация синтеза трехмерной геометрии гор: [2] с NWSTK
  • Демо для загрузки и рисования файла jpg : [3] с NWSTK

Внешние ссылки

Последняя правка сделана 2021-06-20 10:27:18
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте