Лекция
Привет, Вы узнаете о том , что такое webassembly, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое webassembly, wasm , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend).
WebAssembly ( Wasm ) определяет переносимый формат двоичного кода и соответствующий текстовый формат для исполняемых программ , а также программные интерфейсы для облегчения связи между такими программами и их хост-средой.
Основная цель WebAssembly — способствовать созданию высокопроизводительных приложений на веб-страницах , но он также разработан для использования в не-веб-средах. Это открытый стандарт , предназначенный для поддержки любого языка в любой операционной системе, и на практике многие из самых популярных языков уже имеют по крайней мере некоторый уровень поддержки.
Анонсированный в 2015 году и впервые выпущенный в марте 2017 года , WebAssembly стал рекомендацией Консорциума Всемирной паутины 5 декабря 2019 года и получил премию Programming Languages Software Award от ACM SIGPLAN в 2021 году. Консорциум Всемирной паутины (W3C) поддерживает стандарт при участии Mozilla , Microsoft , Google , Apple , Fastly , Intel и Red Hat .
Название WebAssembly призвано казаться синонимом языка ассемблера . Название предполагает перенос ассемблероподобного программирования в Интернет , где оно будет выполняться на стороне клиента — компьютером пользователя веб-сайта через веб-браузер пользователя . Чтобы достичь этого, WebAssembly должен быть гораздо более аппаратно-независимым, чем настоящий язык ассемблера.
WebAssembly был впервые анонсирован в 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.
В июне 2019 года был выпущен Chrome 75 с потоками WebAssembly, включенными по умолчанию.
С апреля 2022 года WebAssembly 2.0 находится в статусе черновика в который добавлено множество инструкций, связанных с SIMD , и новый тип данных v128 с возможностью функций возвращать несколько значений, а также инициализировать/копировать массовую память.
Хотя WebAssembly изначально был разработан для обеспечения скорости выполнения кода, близкой к скорости машинного кода в веб-браузере, он считался ценным и за его пределами, в более общих контекстах. Поскольку среды выполнения WebAssembly (RE) представляют собой низкоуровневые виртуальные стековые машины (похожие на JVM или Flash VM ), которые могут быть встроены в хост-приложения, некоторые реализации создают автономные среды выполнения, такие как Wasmtime [ Wikidata ] и Wasmer [ Wikidata ] . Среды выполнения WebAssembly встроены в серверы приложений для размещения «серверных» приложений WebAssembly и в другие приложения для поддержки архитектур расширений программного обеспечения на основе подключаемых модулей , например, «WebAssembly для прокси» (proxy-wasm), которая определяет ABI на основе WebAssembly для расширения прокси-серверов .
В ноябре 2017 года Mozilla заявила о поддержке «во всех основных браузерах» после того, как WebAssembly был включен по умолчанию в Edge 16. Эта поддержка также включает мобильные веб-браузеры для iOS и Android. По состоянию на март 2024 года 99% отслеживаемых веб-браузеров поддерживают WebAssembly (версия 1.0), больше, чем для его предшественника asm.js. стандарта 2.0 поддержка может быть ниже, но все равно более 90% веб-браузеров уже могут поддерживать, например, для расширения ссылочных типов.
Реализации WebAssembly обычно используют либо компиляцию до начала (AOT), либо компиляцию точно в срок (JIT), но также могут использовать интерпретатор . Хотя первые реализации появились в веб-браузерах , существуют также небраузерные реализации для общего назначения, включая Wasmer, Wasmtime или WAMR, wasm3, WAVM и многие другие.
Поскольку исполняемые файлы WebAssembly предварительно скомпилированы, для их создания можно использовать различные языки программирования. Это достигается либо путем прямой компиляции в Wasm, либо путем реализации соответствующих виртуальных машин в Wasm. Сообщается, что около 40 языков программирования поддерживают Wasm в качестве цели компиляции.
Emscripten компилирует C и C++ в Wasm , используя Clang в качестве интерфейса, заменяя LLVM в качестве бэкэнда и используя Binaryen в качестве оптимизатора. Emscripten SDK может компилировать исходный код любого языка, поддерживаемого LLVM (например , C , C++ или Rust и т. д.), в двоичный файл, который запускается в той же изолированной среде , что и код JavaScript. [ примечание 1 ] Emscripten предоставляет привязки для нескольких часто используемых интерфейсов среды, таких как WebGL .
Начиная с версии 8, автономный Clang может компилировать C и C++ в Wasm. Первоначальной целью была поддержка компиляции из C и C++ , хотя также появляется поддержка других исходных языков, таких как Rust , языки .NET и AssemblyScript ( подобные TypeScript ).
После выпуска MVP WebAssembly добавил поддержку многопоточности и сборки мусора ( WasmGC , а также веб-браузеры, включая Safari, добавили ее поддержку) , что позволило более эффективно компилировать языки программирования со сборкой мусора, такие как C# (поддерживается через Blazor ), F# (поддерживается через Bolero с помощью Blazor) и Python .
Некоторые другие языки имеют некоторую поддержку, включая Python , Julia , Ruby и Ring .
Ряд систем могут компилировать Java и другие языки JVM в JavaScript и WebAssembly. К ним относятся CheerpJ, JWebAssembly и TeaVM. Об этом говорит сайт https://intellect.icu . Kotlin напрямую поддерживает WebAssembly.
Веб-браузеры не позволяют коду WebAssembly напрямую манипулировать Document Object Model . Для этого код Wasm должен подчиняться JavaScript . [ примечание 2 ]
В опросе разработчиков, проведенном в октябре 2023 года, менее половины из 303 участников были удовлетворены состоянием WebAssembly. Подавляющее большинство указало на необходимость улучшения в четырех областях: WASI, поддержка отладки, интеграция с JavaScript и API браузера, а также инструменты сборки.
Для интенсивного выделения памяти в WebAssembly существуют «серьезные ограничения, которые делают невозможным надежное развертывание многих приложений в мобильных браузерах [...] В настоящее время выделение более ~300 МБ памяти не является надежным ни в Chrome на Android без использования специфичных для Chrome обходных путей, ни в Safari на iOS».
Все основные браузеры разрешают WebAssembly, если Content-Security-Policy не указан или если используется "unsafe-eval", но в противном случае ведут себя по-разному. Chrome требует "unsafe-eval", хотя рабочий поток может быть решением.
В июне 2018 года исследователь безопасности представил возможность использования WebAssembly для обхода браузерных мер по смягчению уязвимостей Spectre и Meltdown после добавления поддержки потоков с общей памятью. Из-за этой проблемы разработчики WebAssembly приостановили эту функцию. Однако для того, чтобы исследовать эти будущие расширения языка, Google Chrome добавил экспериментальную поддержку предложения потоков WebAssembly в октябре 2018 года.
WebAssembly подвергался критике за то, что позволял разработчикам вредоносного ПО , мошенникам и фишинговым атакам с большей легкостью скрывать улики; WebAssembly присутствует на компьютере пользователя только в скомпилированной форме, что «[затрудняет] обнаружение вредоносного ПО». Скорость и легкая возможность сокрытия в WebAssembly привели к его использованию для скрытого майнинга криптовалют на устройстве посетителя веб-сайта. Coinhive , ныне несуществующий сервис, облегчающий майнинг криптовалют в браузерах посетителей веб-сайта, утверждает, что их «майнер использует WebAssembly и работает примерно с 65% производительности собственного майнера». Исследование, проведенное в июне 2019 года в Техническом университете Брауншвейга, проанализировало использование WebAssembly на 1 миллионе веб-сайтов, входящих в топ-1 по версии Alexa, и обнаружило, что преобладающим применением был вредоносный майнинг криптовалют, и что вредоносное ПО составляло более половины исследованных веб-сайтов, использующих WebAssembly. Исследование, проведенное в апреле 2021 года в Университете Штутгарта, показало, что с тех пор майнинг криптовалют был отодвинут на второй план, упав до менее 1% всех модулей WebAssembly, собранных из широкого спектра источников, включая также 1 миллион веб-сайтов, входящих в топ-1 по версии Alexa.
Поскольку WebAssembly поддерживает только структурированный поток управления , он пригоден для методов проверки безопасности, включая символическое выполнение .
WebAssembly System Interface (WASI) — это простой интерфейс ( ABI и API ), разработанный Mozilla, который предполагается переносить на любую платформу. Он предоставляет функции, подобные POSIX , такие как файловый ввод-вывод, ограниченный безопасностью на основе возможностей . Существуют дополнительные предлагаемые ABI/API.
WASI находится под влиянием CloudABI и Capsicum .
Соломон Хайкс , соучредитель Docker , написал в 2019 году: «Если бы WASM+WASI существовал в 2008 году, нам не пришлось бы создавать Docker. Вот насколько он важен. WebAssembly на сервере — это будущее вычислений».
Общий стандарт содержит основные спецификации для JavaScript API и сведения о внедрении.
Код Wasm (двоичный код, т. е. байт-код) предназначен для запуска на портативной виртуальной стековой машине (ВМ). ВМ разработана для более быстрого анализа и выполнения, чем JavaScript, и для компактного представления кода. Любая внешняя функциональность (например, системные вызовы ), которая может ожидаться двоичным кодом Wasm, не предусмотрена стандартом. Он скорее предоставляет способ предоставления интерфейса через модули хост-средой, в которой работает ВМ.
Программа Wasm разработана как отдельный модуль, содержащий наборы различных значений, определенных Wasm, и определений типов программ. Они предоставляются в двоичном или текстовом формате (см. ниже), которые имеют общую структуру. Такой модуль может предоставлять функцию запуска, которая выполняется при создании двоичного файла wasm.
Основной стандарт для двоичного формата программы Wasm определяет архитектуру набора инструкций (ISA), состоящую из определенных двоичных кодировок типов операций, которые выполняются виртуальной машиной (без указания того, как именно они должны выполняться). Список инструкций включает стандартные инструкции загрузки/сохранения памяти, числовые, параметрические, инструкции управления потоком типов и инструкции переменных, специфичные для Wasm.
Количество опкодов, используемых в исходном стандарте (MVP), было немного меньше 200 из 256 возможных опкодов. Последующие версии WebAssembly увеличили количество опкодов немного больше 200. Предложение WebAssembly SIMD (для параллельной обработки) вводит альтернативный префикс опкода (0xfd) для 128-битного SIMD. Конкатенация префикса SIMD и опкода, который допустим после префикса SIMD, образует опкод SIMD. Опкоды SIMD приносят дополнительные 236 инструкций для возможности SIMD «минимально жизнеспособного продукта» (MVP) (всего около 436 инструкций). Эти инструкции, «завершенные коды операций» включены по умолчанию в Google V8 (в Google Chrome), движке SpiderMonkey в Mozilla Firefox и движке JavaScriptCore в Safari от Apple и есть также некоторые дополнительные предложения по инструкциям для более позднего «post SIMD MVP», а также есть отдельное предложение «relaxed-simd» на столе.
Эти коды операций SIMD также переносимы и транслируются в собственные наборы инструкций, такие как x64 и ARM. Напротив, ни JVM Java , ни CIL не поддерживают SIMD на уровне кодов операций , т. е. в стандарте; у обоих есть некоторые параллельные API, которые обеспечивают ускорение SIMD. Существует расширение для Java, добавляющее встроенные функции для x64 SIMD, которое непереносимо, т. е. не может использоваться на ARM или смартфонах. Смартфоны могут поддерживать SIMD, вызывая ассемблерный код с SIMD, и C# имеет аналогичную поддержку.
В марте 2017 года группа сообщества WebAssembly достигла консенсуса по первоначальному (MVP) двоичному формату, JavaScript API и эталонному интерпретатору. [ 106 ] Она определяет двоичный формат WebAssembly ( .wasm
), который не предназначен для использования людьми, а также понятный человеку текстовый формат WebAssembly ( .wat
), который напоминает нечто среднее между S-выражениями и традиционными языками ассемблера.
В таблице ниже показан пример функции факториала , написанной на языке C , и соответствующий ей код WebAssembly после компиляции, представленный как в текстовом формате .wat (текстовое представление WebAssembly, понятное человеку), так и в двоичном формате .wasm (необработанный байт-код , представленный ниже в шестнадцатеричном виде ), который выполняется веб-браузером или средой выполнения, поддерживающей WebAssembly.
Исходный код на языке С | Текстовый формат WebAssembly .wat | Двоичный формат WebAssembly .wasm |
---|---|---|
int factorial(int n) {
if (n == 0)
return 1;
else
return n * factorial(n-1);
}
|
( func ( param i64 ) ( result i64 )
local.get 0
i64.eqz
if ( result i64 )
i64.const 1
else
local.get 0
local.get 0
i64.const 1
i64.sub
call 0
i64.mul
end )
|
00 61 73 6D 01 00 00 00
01 06 01 60 01 7E 01 7E
03 02 01 00
0A 17 01
15 00
20 00 50
04
7E
42 01
05
20 00
20 00
42 01
7Д
10 00
7Е
0Б
0Б
|
Все целочисленные константы кодируются с использованием кодировки LEB128 с переменной длиной и эффективным использованием пространства . [ 107 ]
Текстовый формат WebAssembly более канонически записан в свернутом формате с использованием S-выражений . Для инструкций и выражений этот формат является чисто синтаксическим сахаром и не имеет поведенческих различий с линейным форматом. С помощью wasm2wat
код выше декомпилируется в:
( module
( type $t0 ( func ( param i64 ) ( result i64 )))
( func $f0 ( type $t0 ) ( param $p0 i64 ) ( result i64 )
( if $I0 ( result i64 ) ;; $I0 — неиспользуемое имя метки
( i64.eqz
( local.get $p0 )) ;; имя $p0 здесь такое же, как 0
( then
( i64.const 1 ))
( else
( i64.mul
( local.get $p0 )
( call $f0 ;; имя $f0 здесь такое же, как 0
( i64.sub
( local.get $p0 )
( i64.const 1 ))))))))
Модуль неявно генерируется компилятором. Функция ссылается на запись таблицы типов в двоичном файле, отсюда раздел типов и typeвыдаваемый декомпилятором. Компилятор и декомпилятор могут быть доступны онлайн.
Исследование, описанное в статье про webassembly, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое webassembly, wasm и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)
Комментарии
Оставить комментарий
Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)
Термины: Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)