Русская Википедия:WebAssembly

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Карточка языка программирования WebAssembly (сокращённо wasm) — язык программирования низкого уровня для стековой виртуальной машины, спроектированный как портативная цель компиляции для высокоуровневых языков, таких как Си, C++, C#, Rust, Go. Стековая виртуальная машина, исполняющая инструкции бинарного формата wasm, может быть запущена как в среде браузера, так и в серверной среде. Код на wasm — переносимое абстрактное синтаксическое дерево, что обеспечивает как более быстрый анализ, так и более эффективное выполнение в сравнении с JavaScript.

Проект стартовал 17 июня 2015 года[1], 15 марта 2016 года была продемонстрирована работа игры Angry Bots из набора примеров для Unity в браузере Chromium[2]. Изначально проект основывался на asm.js[3] и PNaCl[4]. В марте 2017 года сообщество разработчиков достигло соглашения о бинарном формате, API для JavaScript и о эталонном интерпретаторе. В конце мая 2017 года команда проекта Chromium объявила о планах по отказу от PNaCl в пользу WebAssembly[5].

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

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

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

  • Си и C++ — через набор инструментов Emscripten и Binaryen обеспечивается компиляция в asm.js и wasm, использует LLVM.
  • C# — через Avalonia, Blazor и Uno Platform (на основе mono).
  • Rust — экспериментальная поддержка компиляции в wasm поддерживается с версии 1.14[7].
  • Elixir и Erlang — через компилятор Lumen, разработанный специально для WebAssembly[8].
  • Go — экспериментальная поддержка компиляции в wasm поддерживается с версии 1.11[9].
  • TypeScript — через AssemblyScript.
  • D — LDC начиная с версии 1.11 поддерживает компиляцию и линковку кода на D напрямую в WebAssembly[10].
  • Lazarus — поддерживает сборку в WebAssembly[11]

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

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

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

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

Примечания

Шаблон:Примечания

Ссылки