WebAssembly

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

WebAssembly (wasm) — эффективный низкоуровневый байт-код, предназначенный для исполнения в браузере. В данный момент находится на стадии разработки. Первоначальной целью была поддержка С/С++[3], хотя уже сейчас поддерживается Rust[4], и также в дальнейшем предполагается поддержка других языков. WebAssemblу представляет собой переносимое абстрактное синтаксическое дерево[5], обеспечивающее как более быстрый парсинг, так и более быстрое выполнение кода, чем JavaScript[3]. Изначально WebAssembly основывался на asm.js[6] и PNaCl[7].

Команда, работающая над WebAssembly, включает разработчиков из компаний Mozilla, Google, Microsoft и Apple, которые представляют на рынке четыре наиболее распространённых браузера — Firefox, Chrome, Microsoft Edge и Safari соответственно[7].

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

WebAssembly был анонсирован 17 июня 2015 года[8][9], а 15 марта 2016 года была продемонстрирована работа игры Angry Bots, взятой из набора примеров для Unity, в браузере Chromium[10].

В марте 2017 года команда WebAssembly Community Group достигла соглашения о бинарном формате, API для JavaScript, и о «референсном» интерпретаторе[11].

В конце мая 2017 года команда проекта Chromium объявила о планах по отказу от PNaCl в пользу WebAssembly[12].

Представление[править | править код]

Следующая таблица показывает три различных представления одного и того же исходного кода по мере трансляции его в 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))
)

Инструменты разработки[править | править код]

  • Emscripten и Binaryen — набор инструментов для компиляции из C/C++ в asm.js и wasm, использует LLVM.
  • Rust — экспериментальная поддержка компиляции в wasm поддерживается с версии 1.14[13].
  • Go — экспериментальная поддержка компиляции в wasm будет поддерживаться с версии 1.11[14].

Поддержка в браузерах[править | править код]

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

Примечания[править | править код]

  1. Release 1.0 — 2017.
  2. http://webassembly.org/roadmap/
  3. 1 2 design/HighLevelGoals.md at master · WebAssembly/design. GitHub.
  4. Announcing Rust 1.14 (англ.). The Rust Programming Language Blog (22 December 2016).
  5. design/Rationale.md at master · WebAssembly/design. GitHub.
  6. WebAssembly: a binary format for the web (англ.). ②ality — JavaScript and more (18 June 2015).
  7. 1 2 Bright, Peter The Web is getting its bytecode: WebAssembly. Ars Technica. Condé Nast (18 June 2015).
  8. Launch bug (англ.). GitHub / WebAssembly / design (11 June 2015).
  9. Working on the Future of Compile-to-Web Applications (англ.). Mike Holman's Blog (17 June 2015). Проверено 7 июня 2017.
  10. Wagner, Luke A WebAssembly Milestone: Experimental Support in Multiple Browsers. Mozilla Hacks (14 March 2016).
  11. Roadmap (англ.). WebAssembly (March 2017).
  12. Goodbye PNaCl, Hello WebAssembly! (англ.) (30 May 2017). Проверено 10 июня 2017.
  13. Announcing Rust 1.14 (англ.) (22 December 2016). Проверено 7 июня 2017.
  14. Go 1.11 Release Notes - The Go Programming Language. tip.golang.org. Проверено 16 июля 2018.
  15. WebAssembly — Chrome Platform Status. Проверено 7 июня 2017.
  16. Firefox 52: Introducing Web Assembly, CSS Grid and the Grid Inspector (англ.) (7 March 2017). Проверено 7 июня 2017.
  17. New WebKit Features in Safari 11 (англ.) (22 September 2017).
  18. Introducing new JavaScript optimizations, WebAssembly, SharedArrayBuffer, and Atomics in EdgeHTML 16 (англ.) (31 October 2017). Проверено 14 ноября 2017.

Ссылки[править | править код]