Interested Article - WebAssembly

WebAssembly (сокращённо wasm ) — язык программирования низкого уровня , призванный внести программируемость туда, где нужны кроссплатформенность , эффективность и безопасность , в первую очередь на клиентскую сторону Всемирной паутины .

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

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

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

Существует расширение форматов TrueType / OpenType и типографского движка , позволяющее писать рендеринг текста на WebAssembly . Полученный шрифт меньше по размеру, лучше стандартизован (ожидается меньше расхождений от движка к движку) и обрабатывается быстрее, чем традиционные таблицы OpenType. А некоторые эффекты — многослойный рендеринг цветного шрифта (сначала рисуются все глифы заднего плана, потом все переднего) или качественная сборка стиля арабской вязи « настали́к » — принципиально недостижимы таблицами OpenType .

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

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

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

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

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

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

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

Примечания

  1. .
  2. (англ.) . Mike Holman's Blog (17 июня 2015). Дата обращения: 7 июня 2017. 2 июня 2017 года.
  3. Wagner, Luke . Mozilla Hacks (14 марта 2016). Дата обращения: 6 июня 2017. 11 августа 2017 года.
  4. (англ.) . ②ality — JavaScript and more (18 июня 2015). Дата обращения: 2 февраля 2016. 5 февраля 2016 года.
  5. Bright, Peter . Ars Technica . Condé Nast (18 июня 2015). Дата обращения: 20 ноября 2015. 21 ноября 2015 года.
  6. (англ.) (30 мая 2017). Дата обращения: 10 июня 2017. 30 мая 2017 года.
  7. . Дата обращения: 6 ноября 2023. 6 ноября 2023 года.
  8. . Дата обращения: 6 ноября 2023. 6 ноября 2023 года.
  9. . Дата обращения: 18 октября 2019. 12 ноября 2019 года.
  10. (англ.) (22 декабря 2016). Дата обращения: 7 июня 2017. 5 мая 2017 года.
  11. . — 2019-12-06. 27 декабря 2019 года.
  12. . tip.golang.org. Дата обращения: 16 июля 2018. 14 августа 2018 года.
  13. . Дата обращения: 13 ноября 2018. 14 ноября 2018 года.
  14. . wiki.freepascal.org. Дата обращения: 15 мая 2020. 11 октября 2021 года.
  15. (англ.) . The Mozilla Blog (13 ноября 2017). Дата обращения: 31 октября 2019. 31 октября 2019 года.
  16. . Дата обращения: 7 июня 2017. 17 февраля 2017 года.
  17. (англ.) (7 марта 2017). Дата обращения: 7 июня 2017. 27 мая 2017 года.
  18. (англ.) (22 сентября 2017). Дата обращения: 30 сентября 2017. 30 сентября 2017 года.
  19. (англ.) (31 октября 2017). Дата обращения: 14 ноября 2017. 15 ноября 2017 года.
  20. . Can I use . Дата обращения: 22 марта 2020. 13 ноября 2021 года.

Ссылки

Источник —

Same as WebAssembly