WebAssembly | |
---|---|
![]() | |
Класс языка | Expression-oriented[en] |
Появился в | 2015[1] |
Расширение файлов |
.wast или .wasm |
Выпуск |
|
Система типов | статическая |
Испытал влияние | Asm.js и Native Client |
Лицензия | Apache License |
Сайт | webassembly.org |
WebAssembly (сокращенно wasm) — это бинарный формат инструкций для стековой виртуальной машины. WebAssembly спроектирован как портативная цель компиляции для высокоуровневых языков, таких как C/C++/Rust, которую можно развертывать в web для клиентских и серверных приложений.[3]
WebAssemblу представляет собой переносимое абстрактное синтаксическое дерево[4], обеспечивающее как более быстрый парсинг, так и более быстрое выполнение кода, чем JavaScript[5]. Изначально 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))
)
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .