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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
м Удаление шаблонов: {{нп5}}×1
Строка 13: Строка 13:
Проект стартовал 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}}</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>. Изначально проект основывался на [[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>. В марте 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}}</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}}</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>. Изначально проект основывался на [[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>. В марте 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}}</ref>.


По состоянию на конец 2010-х годов группа, работающая над 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"/>. По состоянию на июль 2021, 94% установленных браузеров поддерживают WebAssembly.<ref name="caniuse.com">{{cite web |title=WebAssembly |url=https://caniuse.com/wasm |work=Can I use |access-date=22 March 2020}}</ref> Но для старых браузеров Wasm может быть скомпилирован в asm.js с помощью Javascript [[:en:polyfill (programming)|polyfill]].<ref name="ars2015">{{Cite news|url=https://arstechnica.com/information-technology/2015/06/the-web-is-getting-its-bytecode-webassembly/|title=The Web is getting its bytecode: WebAssembly|last=Bright|first=Peter|date=18 June 2015|work=Ars Technica|access-date=23 December 2017|language=en-us}}</ref>


== Представление ==
== Представление ==

Версия от 06:24, 13 ноября 2021

WebAssembly
Изображение логотипа
Класс языка Expression-oriented[англ.]
Появился в 2015[2]
Автор Консорциум Всемирной паутины
Разработчик
Расширение файлов .wast или .wasm[3]
Выпуск
Система типов статическая
Испытал влияние Asm.js и Native Client
Лицензия Apache License 2.0
Сайт webassembly.org
Логотип Викисклада Медиафайлы на Викискладе

WebAssembly (сокращённо wasm) — язык программирования низкого уровня для стековой виртуальной машины, спроектированный как портативная цель компиляции для высокоуровневых языков, таких как Си, 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]. По состоянию на июль 2021, 94% установленных браузеров поддерживают WebAssembly.[9] Но для старых браузеров Wasm может быть скомпилирован в asm.js с помощью Javascript polyfill.[10]

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

Следующая таблица показывает три различных представления одного и того же исходного кода по мере трансляции его в wasm:

Исходный код на C «линейный ассемблерный байт-код» бинарный код 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# — через 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]

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

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

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

На конец октября 2019 года WebAssembly поддерживается в 86,92 % используемых браузеров[22].

Примечания

  1. Release 2.0 — 2022.
  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.
  5. Wagner, Luke A WebAssembly Milestone: Experimental Support in Multiple Browsers. Mozilla Hacks (14 марта 2016).
  6. WebAssembly: a binary format for the web (англ.). ②ality — JavaScript and more (18 июня 2015).
  7. 1 2 Bright, Peter The Web is getting its bytecode: WebAssembly. Ars Technica. Condé Nast (18 июня 2015).
  8. Goodbye PNaCl, Hello WebAssembly! (англ.) (30 мая 2017). Дата обращения: 10 июня 2017.
  9. WebAssembly. Can I use. Дата обращения: 22 марта 2020.
  10. Bright, Peter (18 June 2015). "The Web is getting its bytecode: WebAssembly". Ars Technica (англ.). Дата обращения: 23 декабря 2017.
  11. Awesome WebAssembly Languages
  12. Announcing Rust 1.14 (англ.) (22 декабря 2016). Дата обращения: 7 июня 2017.
  13. An alternative BEAM implementation, designed for WebAssembly: lumen/lumen. — 2019-12-06.
  14. Go 1.11 Release Notes - The Go Programming Language. tip.golang.org. Дата обращения: 16 июля 2018.
  15. Generating WebAssembly with LDC.
  16. WebAssembly - Free Pascal wiki. wiki.freepascal.org. Дата обращения: 15 мая 2020.
  17. WebAssembly support now shipping in all major browsers (англ.). The Mozilla Blog (13 ноября 2017). Дата обращения: 31 октября 2019.
  18. WebAssembly — Chrome Platform Status. Дата обращения: 7 июня 2017.
  19. Firefox 52: Introducing Web Assembly, CSS Grid and the Grid Inspector (англ.) (7 марта 2017). Дата обращения: 7 июня 2017.
  20. New WebKit Features in Safari 11 (англ.) (22 сентября 2017).
  21. Introducing new JavaScript optimizations, WebAssembly, SharedArrayBuffer, and Atomics in EdgeHTML 16 (англ.) (31 октября 2017). Дата обращения: 14 ноября 2017.
  22. Can I use WebAssembly

Ссылки