WebAssembly
WebAssembly | |
---|---|
![]() | |
Класс языка | Expression-oriented[англ.] |
Появился в | 2015[2] |
Автор | Консорциум Всемирной паутины |
Разработчик | |
Расширение файлов | .wast или.wasm [3] |
Выпуск | 2.0.1[1] (24 июля2023 года) |
Система типов | статическая |
Испытал влияние | Asm.js и Native Client |
Лицензия | Apache License 2.0 |
Сайт | webassembly.org |
![]() |
WebAssembly (сокращённоwasm) —язык программирования низкого уровня[источник не указан 137 дней], призванный внестипрограммируемость туда, где нужныкроссплатформенность, эффективность ибезопасность, в первую очередь на клиентскую сторонуВсемирной паутины.
Программирование идёт на обычных статически типизированных языках, таких какСи,C++,C#,Rust,Go. Стековая виртуальная машина, исполняющая инструкции бинарного формата wasm, может быть запущена как в среде браузера, так и в серверной среде. Код на wasm — переносимоеабстрактное синтаксическое дерево, что обеспечивает как более быстрый анализ, так и более эффективное выполнение в сравнении сJavaScript.
Проект стартовал 17 июня 2015 года[4], 15 марта 2016 года была продемонстрирована работа игры Angry Bots из набора примеров дляUnity в браузереChromium[5]. Изначально проект основывался наasm.js[6] иPNaCl[7]. В марте 2017 года сообщество разработчиков достигло соглашения о бинарном формате, API для JavaScript и о эталонном интерпретаторе. В конце мая 2017 года команда проекта Chromium объявила о планах по отказу отPNaCl в пользу WebAssembly[8].
По состоянию на 2021 год группа, работающая над WebAssembly, включает разработчиков изMozilla,Google,Microsoft иApple, которые представляют на рынке четыре наиболее распространённых браузера —Firefox,Chrome,Microsoft Edge иSafari соответственно[7].
Существует расширение форматовTrueType/OpenType и типографского движкаHarfbuzz, позволяющее писать рендеринг текста на WebAssembly[9]. Полученный шрифт меньше по размеру, лучше стандартизован (ожидается меньше расхождений от движка к движку) и обрабатывается быстрее, чем традиционные таблицы OpenType. А некоторые эффекты — многослойный рендеринг цветного шрифта (сначала рисуются все глифы заднего плана, потом все переднего) или качественная сборка стиля арабской вязи «настали́к» — принципиально недостижимы таблицами OpenType[10].
Представление
[править |править код]Следующая таблица показывает три различных представления одного и того же исходного кода по мере трансляции его в wasm:
Исходный код на C (*.c) | Линейный ассемблерный текст (*.wat) | Байт-код WASM (*.wasm) |
intfactorial(intn){if(n==0)return1;elsereturnn*factorial(n-1);} | get_local 0i64.eqzif i64 i64.const 1else get_local 0 get_local 0 i64.const 1 i64.sub call 0 i64.mulend | 20 005004 7e42 010520 0020 0042 017d10 007e0b |
Компилятор внутри использует представление в видеs-выражения, которое содержит больше информации, чем линейный текст или байт-код. Например:
(module(type$FUNCSIG$dd(func(paramf64)(resultf64)))(import"global.Math""exp"(func$exp(paramf64)(resultf64)))(memory256256)(export"memory"(memory0))(func$doubleExp(param$0f64)(resultf64)(f64.mul(call$exp(get_local$0))(f64.const2)))(export"doubleExp"(func$doubleExp)))
Поддержка
[править |править код]Компиляция в WebAssembly поддерживается для множества языков, реализация находится на разных стадиях[11]:
- Си иC++ — через набор инструментовEmscripten и Binaryen обеспечивается компиляция вasm.js и wasm, используетLLVM.
- C# — черезAvalonia,Blazor и Uno Platform (на основеmono).
- Rust — экспериментальная поддержка компиляции в wasm поддерживается с версии 1.14[12].
- Elixir иErlang — через компилятор Lumen, разработанный специально для WebAssembly[13].
- Go — экспериментальная поддержка компиляции в wasm поддерживается с версии 1.11[14].
- TypeScript — черезAssemblyScript.
- D — LDC начиная с версии 1.11 поддерживает компиляцию и линковку кода на D напрямую в WebAssembly[15].
- Lazarus — поддерживает сборку в WebAssembly[16]
- Kotlin — экспериментальная поддержка.
- Ruby — с версии 3.2.0[17], через WASI[18].
Поддержка в браузерах
[править |править код]Реализация WebAssembly есть во всех основных браузерах (кроме Internet Explorer) с конца 2017 года[19]:
- Google Chrome — wasm поддерживается с версии 57[20].
- Mozilla FireFox — поддержка wasm появилась в версии 52[21].
- Safari — поддерживается начиная с версии 11[22]
- Microsoft Edge — поддерживается начиная с версии 16[23].
По состоянию на июль 2021 год 94 % установленных браузеров поддерживают WebAssembly[24]. Для устаревших браузеров существуетполифил asm.js[7].
Примечания
[править |править код]- ↑2.0.1 (неопр.).
- ↑http://webassembly.org/roadmap/
- ↑https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming
- ↑Working on the Future of Compile-to-Web Applications (англ.). Mike Holman's Blog (17 июня 2015). Дата обращения: 7 июня 2017. Архивировано 2 июня 2017 года.
- ↑Wagner, Luke. A WebAssembly Milestone: Experimental Support in Multiple Browsers (неопр.). Mozilla Hacks (14 марта 2016). Дата обращения: 6 июня 2017. Архивировано 11 августа 2017 года.
- ↑WebAssembly: a binary format for the web (англ.). ②ality — JavaScript and more (18 июня 2015). Дата обращения: 2 февраля 2016. Архивировано 5 февраля 2016 года.
- ↑123Bright, Peter. The Web is getting its bytecode: WebAssembly (неопр.). Ars Technica. Condé Nast (18 июня 2015). Дата обращения: 20 ноября 2015. Архивировано 21 ноября 2015 года.
- ↑Goodbye PNaCl, Hello WebAssembly! (англ.) (30 мая 2017). Дата обращения: 10 июня 2017. Архивировано 30 мая 2017 года.
- ↑Источник (неопр.). Дата обращения: 6 ноября 2023. Архивировано 6 ноября 2023 года.
- ↑GitHub - harfbuzz/harfbuzz-wasm-examples (неопр.). Дата обращения: 6 ноября 2023. Архивировано 6 ноября 2023 года.
- ↑Awesome WebAssembly Languages (неопр.). Дата обращения: 18 октября 2019. Архивировано 12 ноября 2019 года.
- ↑Announcing Rust 1.14 (англ.) (22 декабря 2016). Дата обращения: 7 июня 2017. Архивировано 5 мая 2017 года.
- ↑An alternative BEAM implementation, designed for WebAssembly: lumen/lumen. — 2019-12-06. Архивировано 27 декабря 2019 года.
- ↑Go 1.11 Release Notes - The Go Programming Language (неопр.). tip.golang.org. Дата обращения: 16 июля 2018. Архивировано 14 августа 2018 года.
- ↑Generating WebAssembly with LDC (неопр.). Дата обращения: 13 ноября 2018. Архивировано 14 ноября 2018 года.
- ↑WebAssembly - Free Pascal wiki (неопр.). wiki.freepascal.org. Дата обращения: 15 мая 2020. Архивировано 11 октября 2021 года.
- ↑Ruby 3.2.0 Released (неопр.).
- ↑Mozilla развивает WASI для использования WebAssembly вне браузера — Викиновости (неопр.).
- ↑WebAssembly support now shipping in all major browsers (англ.). The Mozilla Blog (13 ноября 2017). Дата обращения: 31 октября 2019. Архивировано 31 октября 2019 года.
- ↑WebAssembly — Chrome Platform Status (неопр.). Дата обращения: 7 июня 2017. Архивировано 17 февраля 2017 года.
- ↑Firefox 52: Introducing Web Assembly, CSS Grid and the Grid Inspector (англ.) (7 марта 2017). Дата обращения: 7 июня 2017. Архивировано 27 мая 2017 года.
- ↑New WebKit Features in Safari 11 (англ.) (22 сентября 2017). Дата обращения: 30 сентября 2017. Архивировано 30 сентября 2017 года.
- ↑Introducing new JavaScript optimizations, WebAssembly, SharedArrayBuffer, and Atomics in EdgeHTML 16 (англ.) (31 октября 2017). Дата обращения: 14 ноября 2017. Архивировано 15 ноября 2017 года.
- ↑WebAssembly (неопр.). Can I use. Дата обращения: 22 марта 2020. Архивировано 13 ноября 2021 года.
Ссылки
[править |править код]- Официальный веб-сайт WebAssemblyАрхивная копия от 1 мая 2017 наWayback Machine (англ.)
- WebAssembly Community GroupАрхивная копия от 1 февраля 2016 наWayback Machine
- WebAssembly DesignАрхивная копия от 1 апреля 2021 наWayback Machine
- Awesome wasmАрхивная копия от 16 мая 2017 наWayback Machine (англ.) — список ссылок по WebAssembly
- Страницы, использующие устаревший тег source
- Википедия:Cite web (не указан язык)
- Википедия:Статьи с источниками из Викиданных
- ПРО:ИТ:Статьи по алфавиту
- ПРО:ИТ:Последняя правка: в текущем году
- Википедия:Статьи без источников (тип: формат файла)
- Википедия:Нет источников с октября 2024
- Википедия:Статьи с утверждениями без источников более 14 дней