WebAssembly: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Изменена версия
Метки: с мобильного устройства из мобильной версии через расширенный мобильный режим
 
(не показано 46 промежуточных версий 17 участников)
Строка 1: Строка 1:
{{Карточка языка программирования
{{Карточка языка программирования
|name=WebAssembly
| name = WebAssembly
|paradigm={{нп5|Expression-oriented programming language|Expression-oriented}}
| paradigm = {{нп5|Expression-oriented programming language|Expression-oriented}}
| дата выпуска последней версии = [[24 июля]] [[2023 год]]а
|typing=[[статическая типизация|статическая]]
| typing = [[статическая типизация|статическая]]
|license=[[Apache License]] 2.0
| license = [[Apache License]] 2.0
|file ext={{Unbulleted list|.wat|.wasm}}
| file ext = {{Unbulleted list|.wat|.wasm}}
|website={{url|http://webassembly.org/}}
| website = {{url|http://webassembly.org/}}
|influenced by=[[asm.js]], [[Google Native Client|PNaCl]]
| influenced by = [[asm.js]], [[Google Native Client|PNaCl]]
| developer = {{Unbulleted list|[[World Wide Web Consortium|W3C]]|[[Mozilla]]|[[Microsoft]]|[[Google (компания)|Google]]|[[Apple Inc.|Apple]]}}
| developer = {{Unbulleted list|[[World Wide Web Consortium|W3C]]|[[Mozilla]]|[[Microsoft]]|[[Google (компания)|Google]]|[[Apple Inc.|Apple]]}}
| последняя версия = 2.0.1<ref>{{cite web|title=2.0.1|url=https://github.com/WebAssembly/spec/releases/tag/opam-2.0.1}}</ref>
}}
}}
'''WebAssembly''' (сокращённо ''wasm'') — [[язык программирования низкого уровня]]{{Нет АИ|15|10|2024}}, призванный внести [[Полнота по Тьюрингу|программируемость]] туда, где нужны [[кроссплатформенность]], эффективность и [[кибербезопасность|безопасность]], в первую очередь на клиентскую сторону [[Всемирная паутина|Всемирной паутины]].
'''WebAssembly''' (сокращенно '''wasm''') — это '''бинарный формат''' инструкций для '''стековой виртуальной машины'''. WebAssembly спроектирован как портативная цель компиляции для высокоуровневых языков, таких как [[Си_(язык_программирования)|C]]/[[C++]]/[[Rust_(язык_программирования)|Rust]]/[[Go]], которую можно развертывать в '''web''' для клиентских и '''серверных''' приложений.<ref>{{Cite web|url=https://webassembly.org/|title=WebAssembly|publisher=webassembly.org|accessdate=2018-11-25}}</ref>


Программирование идёт на обычных статически типизированных языках, таких как [[Си (язык программирования)|Си]], [[C++]], [[C Sharp|C#]], [[Rust (язык программирования)|Rust]], [[Go]]. Стековая виртуальная машина, исполняющая инструкции бинарного формата wasm, может быть запущена как в среде браузера, так и в серверной среде. Код на wasm — переносимое [[абстрактное синтаксическое дерево]], что обеспечивает как более быстрый анализ, так и более эффективное выполнение в сравнении с [[JavaScript]].
WebAssemblу представляет собой переносимое [[абстрактное синтаксическое дерево]]<ref>{{cite web|url=https://github.com/WebAssembly/design/blob/master/Rationale.md#why-ast|title=design/Rationale.md at master · WebAssembly/design|work=[[GitHub]]}}</ref>, обеспечивающее как более быстрый анализ, так и более быстрое выполнение кода, чем [[JavaScript]]<ref name="github.com">{{cite web|url=https://github.com/WebAssembly/design/blob/master/HighLevelGoals.md|title=design/HighLevelGoals.md at master · WebAssembly/design|work=[[GitHub]]}}</ref>. Изначально WebAssembly основывался на [[asm.js]]<ref>{{cite web |url=http://2ality.com/2015/06/web-assembly.html |title=WebAssembly: a binary format for the web |work=②ality — JavaScript and more |date=2015-06-18 |lang=en}}</ref> и [[Native Client|PNaCl]]<ref name="ars">{{cite web |first=Peter|last=Bright|url=http://arstechnica.com/information-technology/2015/06/the-web-is-getting-its-bytecode-webassembly|title=The Web is getting its bytecode: WebAssembly|work=[[Ars Technica]]|publisher=[[Condé Nast]]|date=18 June 2015}}</ref>.


Проект стартовал 17 июня 2015 года<ref>{{cite web |url=https://blogs.msdn.microsoft.com/mikeholman/2015/06/17/working-on-the-future-of-compile-to-web-applications/ |title=Working on the Future of Compile-to-Web Applications |date=2015-06-17 |publisher=Mike Holman's Blog |lang=en |accessdate=2017-06-07 |archive-date=2017-06-02 |archive-url=https://web.archive.org/web/20170602184623/https://blogs.msdn.microsoft.com/mikeholman/2015/06/17/working-on-the-future-of-compile-to-web-applications/ |deadlink=no }}</ref>, 15 марта 2016 года была продемонстрирована работа игры Angry Bots из набора примеров для [[Unity (игровой движок)|Unity]] в браузере [[Chromium]]<ref>{{Cite web|url=https://hacks.mozilla.org/2016/03/a-webassembly-milestone/|title=A WebAssembly Milestone: Experimental Support in Multiple Browsers|last=Wagner|first=Luke|date=2016-03-14|website=Mozilla Hacks|access-date=2017-06-06|archive-date=2017-08-11|archive-url=https://web.archive.org/web/20170811143725/https://hacks.mozilla.org/2016/03/a-webassembly-milestone/|deadlink=no}}</ref>. Изначально проект основывался на [[asm.js]]<ref>{{cite web |url=http://2ality.com/2015/06/web-assembly.html |title=WebAssembly: a binary format for the web |work=②ality — JavaScript and more |date=2015-06-18 |lang=en |access-date=2016-02-02 |archive-date=2016-02-05 |archive-url=https://web.archive.org/web/20160205101405/http://www.2ality.com/2015/06/web-assembly.html |deadlink=no }}</ref> и [[Native Client|PNaCl]]<ref name="ars">{{cite web|first=Peter|last=Bright|url=http://arstechnica.com/information-technology/2015/06/the-web-is-getting-its-bytecode-webassembly|title=The Web is getting its bytecode: WebAssembly|work=[[Ars Technica]]|publisher=[[Condé Nast]]|date=2015-06-18|access-date=2015-11-20|archive-date=2015-11-21|archive-url=https://web.archive.org/web/20151121032815/http://arstechnica.com/information-technology/2015/06/the-web-is-getting-its-bytecode-webassembly/|deadlink=no}}</ref>. В марте 2017 года сообщество разработчиков достигло соглашения о бинарном формате, API для JavaScript и о эталонном интерпретаторе. В конце мая 2017 года команда проекта Chromium объявила о планах по отказу от [[Native Client|PNaCl]] в пользу WebAssembly<ref>{{cite web |url=https://blog.chromium.org/2017/05/goodbye-pnacl-hello-webassembly.html |title=Goodbye PNaCl, Hello WebAssembly! |lang=en |date=2017-05-30 |accessdate=2017-06-10 |archive-date=2017-05-30 |archive-url=https://web.archive.org/web/20170530233036/https://blog.chromium.org/2017/05/goodbye-pnacl-hello-webassembly.html |deadlink=no }}</ref>.
Команда, работающая над WebAssembly, включает разработчиков из компаний [[Mozilla]], [[Google (компания)|Google]], [[Microsoft]] и [[Apple]], которые представляют на рынке четыре наиболее распространённых браузера — [[Firefox]], [[Google Chrome|Chrome]], [[Microsoft Edge]] и [[Safari]] соответственно<ref name="ars"/>.


По состоянию на 2021 год группа, работающая над WebAssembly, включает разработчиков из [[Mozilla]], [[Google (компания)|Google]], [[Microsoft]] и [[Apple]], которые представляют на рынке четыре наиболее распространённых браузера — [[Firefox]], [[Google Chrome|Chrome]], [[Microsoft Edge]] и [[Safari]] соответственно<ref name="ars"/>.
== История ==
WebAssembly был анонсирован 17 июня 2015 года<ref>{{Cite web |url=https://github.com/WebAssembly/design/issues/150 |title=Launch bug |date=2015-06-11 |website=[[GitHub]] / WebAssembly / design |lang=en}}</ref><ref>{{cite web |url=https://blogs.msdn.microsoft.com/mikeholman/2015/06/17/working-on-the-future-of-compile-to-web-applications/ |title=Working on the Future of Compile-to-Web Applications |date=2015-06-17 |publisher=Mike Holman's Blog |lang=en |accessdate=2017-06-07}}</ref>, а 15 марта 2016 года была продемонстрирована работа игры ''Angry Bots'', взятой из набора примеров для [[Unity (игровой движок)|Unity]], в браузере Chromium<ref>{{Cite web|url=https://hacks.mozilla.org/2016/03/a-webassembly-milestone/|title=A WebAssembly Milestone: Experimental Support in Multiple Browsers|last=Wagner|first=Luke|date=14 March 2016|website=Mozilla Hacks}}</ref>.


Существует расширение форматов [[TrueType]]/[[OpenType]] и типографского движка [[Harfbuzz]], позволяющее писать рендеринг текста на WebAssembly<ref>{{Cite web |url=https://github.com/harfbuzz/harfbuzz/blob/main/docs/wasm-shaper.md |title=Источник |access-date=2023-11-06 |archive-date=2023-11-06 |archive-url=https://web.archive.org/web/20231106182958/https://github.com/harfbuzz/harfbuzz/blob/main/docs/wasm-shaper.md |url-status=live }}</ref>. Полученный шрифт меньше по размеру, лучше стандартизован (ожидается меньше расхождений от движка к движку) и обрабатывается быстрее, чем традиционные таблицы OpenType. А некоторые эффекты — многослойный рендеринг цветного шрифта (сначала рисуются все глифы заднего плана, потом все переднего) или качественная сборка стиля арабской вязи «[[насталик|настали́к]]» — принципиально недостижимы таблицами OpenType<ref>{{Cite web |url=https://github.com/harfbuzz/harfbuzz-wasm-examples |title=GitHub - harfbuzz/harfbuzz-wasm-examples<!-- Заголовок добавлен ботом --> |access-date=2023-11-06 |archive-date=2023-11-06 |archive-url=https://web.archive.org/web/20231106183832/https://github.com/harfbuzz/harfbuzz-wasm-examples |url-status=live }}</ref>.
В марте 2017 года команда WebAssembly Community Group достигла соглашения о бинарном формате, API для JavaScript, и о «референсном» интерпретаторе<ref name=roadmap>{{Cite web|url=http://webassembly.org/roadmap/|title=Roadmap |website=WebAssembly |date=March 2017 |lang=en}}</ref>.

В конце мая 2017 года команда проекта Chromium объявила о планах по отказу от [[Native Client|PNaCl]] в пользу WebAssembly<ref>{{cite web |url=https://blog.chromium.org/2017/05/goodbye-pnacl-hello-webassembly.html |title=Goodbye PNaCl, Hello WebAssembly! |lang=en |date=2017-05-30 |accessdate=2017-06-10}}</ref>.


== Представление ==
== Представление ==
Строка 27: Строка 26:
{| class="wikitable"
{| class="wikitable"
|-
|-
|style="width:33%"| Исходный код на C
|style="width:33%"| Исходный код на C (*.c)
|style="width:33%"| «линейный ассемблерный байт-код»
|style="width:33%"| Линейный ассемблерный текст (*.wat)
|style="width:33%"| бинарный код WASM
|style="width:33%"| Байт-код WASM (*.wasm)
|- style="vertical-align:top"
|- style="vertical-align:top"
|
|
Строка 72: Строка 71:
|}
|}


Компилятор внутри использует представление в виде [[s-выражение|s-выражения]], которое содержит больше информации, чем «линейный ассемблерный байт-код». Например:
Компилятор внутри использует представление в виде [[s-выражение|s-выражения]], которое содержит больше информации, чем линейный текст или байт-код. Например:
<source lang="lisp">
<source lang="lisp">
(module
(module
Строка 91: Строка 90:
</source>
</source>


== Поддержка в языках программирования ==
== Поддержка ==
Поддерживается компиляция в WebAssembly из множества языков, реализация находится на разных стадиях<ref>[https://github.com/appcypher/awesome-wasm-langs Awesome WebAssembly Languages]</ref>:
Компиляция в WebAssembly поддерживается для множества языков, реализация находится на разных стадиях<ref>{{Cite web |url=https://github.com/appcypher/awesome-wasm-langs |title=Awesome WebAssembly Languages |access-date=2019-10-18 |archive-date=2019-11-12 |archive-url=https://web.archive.org/web/20191112201709/https://github.com/appcypher/awesome-wasm-langs |deadlink=no }}</ref>:
* C/C++ — через набор инструментов [[Emscripten]] и Binaryen обеспечивается компиляция в [[asm.js]] и wasm, использует [[LLVM]].
* [[Си (язык программирования)|Си]] и [[C++]] — через набор инструментов [[Emscripten]] и Binaryen обеспечивается компиляция в [[asm.js]] и wasm, использует [[LLVM]].
* [[C Sharp|C#]] — через [[Avalonia]], [[Blazor]] и Uno Platform (на основе [[mono]]).
* [[Rust (язык программирования)|Rust]] — экспериментальная поддержка компиляции в wasm поддерживается с версии 1.14<ref>{{cite web |url=https://blog.rust-lang.org/2016/12/22/Rust-1.14.html |title=Announcing Rust 1.14 |date=2016-12-22 |lang=en |accessdate=2017-06-07}}</ref>.
* [[Rust (язык программирования)|Rust]] — экспериментальная поддержка компиляции в wasm поддерживается с версии 1.14<ref>{{cite web |url=https://blog.rust-lang.org/2016/12/22/Rust-1.14.html |title=Announcing Rust 1.14 |date=2016-12-22 |lang=en |accessdate=2017-06-07 |archive-date=2017-05-05 |archive-url=https://web.archive.org/web/20170505201919/https://blog.rust-lang.org/2016/12/22/Rust-1.14.html |deadlink=no }}</ref>.
*[[Elixir (язык программирования)|Elixir]]/[[Erlang]] — через компилятор Lumen, разработанный специально для WebAssembly<ref>{{Статья|ссылка=https://github.com/lumen/lumen|заглавие=An alternative BEAM implementation, designed for WebAssembly: lumen/lumen|год=2019-12-06}}</ref>.
* [[Elixir (язык программирования)|Elixir]] и [[Erlang]] — через компилятор Lumen, разработанный специально для WebAssembly<ref>{{Статья|ссылка=https://github.com/lumen/lumen|заглавие=An alternative BEAM implementation, designed for WebAssembly: lumen/lumen|год=2019-12-06|издание=|archivedate=2019-12-27|archiveurl=https://web.archive.org/web/20191227000638/https://github.com/lumen/lumen}}</ref>.
* [[Go]] — экспериментальная поддержка компиляции в wasm поддерживается с версии 1.11<ref>{{Cite web|url=https://tip.golang.org/doc/go1.11#wasm|title=Go 1.11 Release Notes - The Go Programming Language|publisher=tip.golang.org|accessdate=2018-07-16}}</ref>.
* [[Go]] — экспериментальная поддержка компиляции в wasm поддерживается с версии 1.11<ref>{{Cite web|url=https://tip.golang.org/doc/go1.11#wasm|title=Go 1.11 Release Notes - The Go Programming Language|publisher=tip.golang.org|accessdate=2018-07-16|archive-date=2018-08-14|archive-url=https://web.archive.org/web/20180814150449/https://tip.golang.org/doc/go1.11#wasm|deadlink=no}}</ref>.
* [[TypeScript]] — через AssemblyScript.
* [[C Sharp|C#]] — через [[:en:Blazor|Blazor]] и Uno Platform — на основе [[mono]]
* [[TypeScript]] — через [[AssemblyScript]].
* [[D (язык программирования)|D]] — LDC начиная с версии 1.11 поддерживает компиляцию и линковку кода на D напрямую в WebAssembly<ref>{{Cite web|url=https://wiki.dlang.org/Generating_WebAssembly_with_LDC|title=Generating WebAssembly with LDC}}</ref>.
* [[D (язык программирования)|D]] — LDC начиная с версии 1.11 поддерживает компиляцию и линковку кода на D напрямую в WebAssembly<ref>{{Cite web|url=https://wiki.dlang.org/Generating_WebAssembly_with_LDC|title=Generating WebAssembly with LDC|access-date=2018-11-13|archive-date=2018-11-14|archive-url=https://web.archive.org/web/20181114061659/https://wiki.dlang.org/Generating_WebAssembly_with_LDC|deadlink=no}}</ref>.
*[[Lazarus]] - поддерживает сборку в WebAssembly в WebAssembly<ref>{{Cite web|url=https://wiki.freepascal.org/WebAssembly|title=WebAssembly - Free Pascal wiki|publisher=wiki.freepascal.org|accessdate=2020-05-15}}</ref>
* [[Lazarus]] — поддерживает сборку в WebAssembly<ref>{{Cite web|url=https://wiki.freepascal.org/WebAssembly|title=WebAssembly - Free Pascal wiki|publisher=wiki.freepascal.org|accessdate=2020-05-15|archive-date=2021-10-11|archive-url=https://web.archive.org/web/20211011121627/https://wiki.freepascal.org/WebAssembly|deadlink=no}}</ref>
* [[Kotlin]] — экспериментальная поддержка.


== Поддержка в браузерах ==
== Поддержка в браузерах ==
Реализация WebAssembly есть во всех основных браузерах (кроме Internet Explorer) с конца 2017 года<ref>{{Cite web|url=https://blog.mozilla.org/blog/2017/11/13/webassembly-in-browsers/ |title=WebAssembly support now shipping in all major browsers |website=The Mozilla Blog |language=en |date=2017-11-13 |access-date=2019-10-31}}</ref>:
Реализация WebAssembly есть во всех основных браузерах (кроме Internet Explorer) с конца 2017 года<ref>{{Cite web |url=https://blog.mozilla.org/blog/2017/11/13/webassembly-in-browsers/ |title=WebAssembly support now shipping in all major browsers |website=The Mozilla Blog |language=en |date=2017-11-13 |access-date=2019-10-31 |archive-date=2019-10-31 |archive-url=https://web.archive.org/web/20191031205718/https://blog.mozilla.org/blog/2017/11/13/webassembly-in-browsers/ |deadlink=no }}</ref>:
* [[Google Chrome]] — wasm поддерживается с версии 57<ref>{{cite web |url=https://www.chromestatus.com/feature/5453022515691520 |title=WebAssembly — Chrome Platform Status |accessdate=2017-06-07}}</ref>.
* [[Google Chrome]] — wasm поддерживается с версии 57<ref>{{cite web |url=https://www.chromestatus.com/feature/5453022515691520 |title=WebAssembly — Chrome Platform Status |accessdate=2017-06-07 |archive-date=2017-02-17 |archive-url=https://web.archive.org/web/20170217154227/https://www.chromestatus.com/feature/5453022515691520 |deadlink=no }}</ref>.
* [[Mozilla FireFox]] — поддержка wasm появилась в версии 52<ref>{{cite web|url=https://hacks.mozilla.org/2017/03/firefox-52-introducing-web-assembly-css-grid-and-the-grid-inspector/ |title=Firefox 52: Introducing Web Assembly, CSS Grid and the Grid Inspector |date=2017-03-07 |lang=en |accessdate=2017-06-07}}</ref>.
* [[Mozilla FireFox]] — поддержка wasm появилась в версии 52<ref>{{cite web |url=https://hacks.mozilla.org/2017/03/firefox-52-introducing-web-assembly-css-grid-and-the-grid-inspector/ |title=Firefox 52: Introducing Web Assembly, CSS Grid and the Grid Inspector |date=2017-03-07 |lang=en |accessdate=2017-06-07 |archive-date=2017-05-27 |archive-url=https://web.archive.org/web/20170527153334/https://hacks.mozilla.org/2017/03/firefox-52-introducing-web-assembly-css-grid-and-the-grid-inspector/ |deadlink=no }}</ref>.
* [[Safari]] — поддерживается начиная с версии 11<ref>{{cite web |url=https://webkit.org/blog/7956/new-webkit-features-in-safari-11/ |title=New WebKit Features in Safari 11 |lang=en |date=2017-09-22}}</ref>
* [[Safari]] — поддерживается начиная с версии 11<ref>{{cite web |url=https://webkit.org/blog/7956/new-webkit-features-in-safari-11/ |title=New WebKit Features in Safari 11 |lang=en |date=2017-09-22 |access-date=2017-09-30 |archive-date=2017-09-30 |archive-url=https://web.archive.org/web/20170930175631/https://webkit.org/blog/7956/new-webkit-features-in-safari-11/ |deadlink=no }}</ref>
* [[Microsoft Edge]] — поддерживается начиная с версии 16<ref>{{cite web |url=https://blogs.windows.com/msedgedev/2017/10/31/optimizations-webassembly-sharedarraybuffer-atomics-edgehtml-16/ |title=Introducing new JavaScript optimizations, WebAssembly, SharedArrayBuffer, and Atomics in EdgeHTML 16 |date=2017-10-31 |lang=en |accessdate=2017-11-14}}</ref>.
* [[Microsoft Edge]] — поддерживается начиная с версии 16<ref>{{cite web |url=https://blogs.windows.com/msedgedev/2017/10/31/optimizations-webassembly-sharedarraybuffer-atomics-edgehtml-16/ |title=Introducing new JavaScript optimizations, WebAssembly, SharedArrayBuffer, and Atomics in EdgeHTML 16 |date=2017-10-31 |lang=en |accessdate=2017-11-14 |archive-date=2017-11-15 |archive-url=https://web.archive.org/web/20171115015019/https://blogs.windows.com/msedgedev/2017/10/31/optimizations-webassembly-sharedarraybuffer-atomics-edgehtml-16/ |deadlink=no }}</ref>.
По состоянию на июль 2021 год 94 % установленных браузеров поддерживают WebAssembly<ref name="caniuse.com">{{cite web |title=WebAssembly |url=https://caniuse.com/wasm |work=Can I use |access-date=2020-03-22 |archive-date=2021-11-13 |archive-url=https://web.archive.org/web/20211113062453/https://caniuse.com/wasm |deadlink=no }}</ref>. Для устаревших браузеров существует [[полифил]] asm.js<ref name="ars"/>.
На конец октября 2019 года WebAssembly поддерживается в 86,92 % используемых браузеров<ref>[https://caniuse.com/#feat=wasm Can I use WebAssembly]</ref>.


== Примечания ==
== Примечания ==
{{примечания|2}}
{{примечания}}


== Ссылки ==
== Ссылки ==
* [http://webassembly.org/ Официальный веб-сайт WebAssembly]{{ref-en}}
* [http://webassembly.org/ Официальный веб-сайт WebAssembly] {{Wayback|url=http://webassembly.org/ |date=20170501072536 }}{{ref-en}}
* [https://w3.org/community/webassembly WebAssembly Community Group]
* [https://w3.org/community/webassembly WebAssembly Community Group] {{Wayback|url=https://w3.org/community/webassembly |date=20160201163351 }}
* [https://github.com/WebAssembly/design WebAssembly Design]
* [https://github.com/WebAssembly/design WebAssembly Design] {{Wayback|url=https://github.com/WebAssembly/design |date=20210401043754 }}
* [https://github.com/mbasso/awesome-wasm Awesome wasm]{{ref-en}} — список ссылок по WebAssembly
* [https://github.com/mbasso/awesome-wasm Awesome wasm] {{Wayback|url=https://github.com/mbasso/awesome-wasm |date=20170516003006 }}{{ref-en}} — список ссылок по WebAssembly


[[Категория:Веб-программирование]]
[[Категория:Веб-программирование]]

Текущая версия от 11:51, 13 ноября 2024

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) — язык программирования низкого уровня[источник не указан 70 дней], призванный внести программируемость туда, где нужны кроссплатформенность, эффективность и безопасность, в первую очередь на клиентскую сторону Всемирной паутины.

Программирование идёт на обычных статически типизированных языках, таких как Си, 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)
int factorial(int n) {
  if (n == 0)
    return 1;
  else
    return n * factorial(n-1);
}
get_local 0
i64.eqz
if i64
    i64.const 1
else
    get_local 0
    get_local 0
    i64.const 1
    i64.sub
    call 0
    i64.mul
end
20 00
50
04 7e
42 01
05
20 00
20 00
42 01
7d
10 00
7e
0b

Компилятор внутри использует представление в виде s-выражения, которое содержит больше информации, чем линейный текст или байт-код. Например:

(module
  (type $FUNCSIG$dd (func (param f64) (result f64)))
  (import "global.Math" "exp" (func $exp (param f64) (result f64)))
  (memory 256 256)
  (export "memory" (memory 0))
  (func $doubleExp (param $0 f64) (result f64)
    (f64.mul
      (call $exp
        (get_local $0)
      )
      (f64.const 2)
    )
  )
  (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 — экспериментальная поддержка.

Поддержка в браузерах

[править | править код]

Реализация WebAssembly есть во всех основных браузерах (кроме Internet Explorer) с конца 2017 года[17]:

  • Google Chrome — wasm поддерживается с версии 57[18].
  • Mozilla FireFox — поддержка wasm появилась в версии 52[19].
  • Safari — поддерживается начиная с версии 11[20]
  • Microsoft Edge — поддерживается начиная с версии 16[21].

По состоянию на июль 2021 год 94 % установленных браузеров поддерживают WebAssembly[22]. Для устаревших браузеров существует полифил asm.js[7].

Примечания

[править | править код]
  1. 2.0.1.
  2. http://webassembly.org/roadmap/
  3. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming
  4. Working on the Future of Compile-to-Web Applications (англ.). Mike Holman's Blog (17 июня 2015). Дата обращения: 7 июня 2017. Архивировано 2 июня 2017 года.
  5. Wagner, Luke A WebAssembly Milestone: Experimental Support in Multiple Browsers. Mozilla Hacks (14 марта 2016). Дата обращения: 6 июня 2017. Архивировано 11 августа 2017 года.
  6. WebAssembly: a binary format for the web (англ.). ②ality — JavaScript and more (18 июня 2015). Дата обращения: 2 февраля 2016. Архивировано 5 февраля 2016 года.
  7. 1 2 3 Bright, Peter The Web is getting its bytecode: WebAssembly. Ars Technica. Condé Nast (18 июня 2015). Дата обращения: 20 ноября 2015. Архивировано 21 ноября 2015 года.
  8. Goodbye PNaCl, Hello WebAssembly! (англ.) (30 мая 2017). Дата обращения: 10 июня 2017. Архивировано 30 мая 2017 года.
  9. Источник. Дата обращения: 6 ноября 2023. Архивировано 6 ноября 2023 года.
  10. GitHub - harfbuzz/harfbuzz-wasm-examples. Дата обращения: 6 ноября 2023. Архивировано 6 ноября 2023 года.
  11. Awesome WebAssembly Languages. Дата обращения: 18 октября 2019. Архивировано 12 ноября 2019 года.
  12. Announcing Rust 1.14 (англ.) (22 декабря 2016). Дата обращения: 7 июня 2017. Архивировано 5 мая 2017 года.
  13. An alternative BEAM implementation, designed for WebAssembly: lumen/lumen. — 2019-12-06. Архивировано 27 декабря 2019 года.
  14. Go 1.11 Release Notes - The Go Programming Language. tip.golang.org. Дата обращения: 16 июля 2018. Архивировано 14 августа 2018 года.
  15. Generating WebAssembly with LDC. Дата обращения: 13 ноября 2018. Архивировано 14 ноября 2018 года.
  16. WebAssembly - Free Pascal wiki. wiki.freepascal.org. Дата обращения: 15 мая 2020. Архивировано 11 октября 2021 года.
  17. WebAssembly support now shipping in all major browsers (англ.). The Mozilla Blog (13 ноября 2017). Дата обращения: 31 октября 2019. Архивировано 31 октября 2019 года.
  18. WebAssembly — Chrome Platform Status. Дата обращения: 7 июня 2017. Архивировано 17 февраля 2017 года.
  19. Firefox 52: Introducing Web Assembly, CSS Grid and the Grid Inspector (англ.) (7 марта 2017). Дата обращения: 7 июня 2017. Архивировано 27 мая 2017 года.
  20. New WebKit Features in Safari 11 (англ.) (22 сентября 2017). Дата обращения: 30 сентября 2017. Архивировано 30 сентября 2017 года.
  21. Introducing new JavaScript optimizations, WebAssembly, SharedArrayBuffer, and Atomics in EdgeHTML 16 (англ.) (31 октября 2017). Дата обращения: 14 ноября 2017. Архивировано 15 ноября 2017 года.
  22. WebAssembly. Can I use. Дата обращения: 22 марта 2020. Архивировано 13 ноября 2021 года.