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

Программирование идёт на обычных статически типизированных языках, таких как Си, 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 — экспериментальная поддержка.
  • 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].

Примечания

  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. Ruby 3.2.0 Released.
  18. Mozilla развивает WASI для использования WebAssembly вне браузера — Викиновости.
  19. WebAssembly support now shipping in all major browsers (англ.). The Mozilla Blog (13 ноября 2017). Дата обращения: 31 октября 2019. Архивировано 31 октября 2019 года.
  20. WebAssembly — Chrome Platform Status. Дата обращения: 7 июня 2017. Архивировано 17 февраля 2017 года.
  21. Firefox 52: Introducing Web Assembly, CSS Grid and the Grid Inspector (англ.) (7 марта 2017). Дата обращения: 7 июня 2017. Архивировано 27 мая 2017 года.
  22. New WebKit Features in Safari 11 (англ.) (22 сентября 2017). Дата обращения: 30 сентября 2017. Архивировано 30 сентября 2017 года.
  23. Introducing new JavaScript optimizations, WebAssembly, SharedArrayBuffer, and Atomics in EdgeHTML 16 (англ.) (31 октября 2017). Дата обращения: 14 ноября 2017. Архивировано 15 ноября 2017 года.
  24. WebAssembly. Can I use. Дата обращения: 22 марта 2020. Архивировано 13 ноября 2021 года.

Ссылки

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.