2025-04-27

vak: (Default)
На наших глазах родилась новая компьютерная архитектура: WebAssembly. Я уже упоминал как-то. Спецификацию можно скачать по ссылке:

webassembly.github.io/spec/core/_download/WebAssembly.pdf

Фактически это самая массовая виртуальная машина нынче. WebAssembly реализована во всех современных веб-браузерах:
  • Google Chrome: полная поддержка с версии 57 (март 2017 г.).
  • Mozilla Firefox: полная поддержка с версии 52 (март 2017 г.).
  • Microsoft Edge: полная поддержка с версии 16 (октябрь 2017 г.).
  • Safari: полная поддержка с версии 11 (сентябрь 2017 г.).
  • Opera: полная поддержка с версии 44 (март 2017 г.).
  • Brave: поддерживает WebAssembly, так как он основан на Chromium.
  • Samsung Internet: полная поддержка в последних версиях.
  • UC Browser: поддерживает WebAssembly в современных версиях.
  • Tor Browser: поддерживает WebAssembly, так как он основан на Firefox.
Кроме того, WebAssembly работает в Node.js (на стороне сервера) и других средах с движками JavaScript, такими как V8, SpiderMonkey или JavaScriptCore.

Чтобы программы, написанные на WebAssembly (в простонародии Wasm), могли общаться с внешним миром, разработан стандарт WASI. По аналогии с юниксом можно считать это набором системных вызовов.

Чтобы программировать на самом близком к "железу" уровне, для традиционных компьютеров используют язык ассемблера. Но мы же не дикари какие в 21-м веке. 😀 Для Wasm сделан высокоуровневый язык AssemblyScript. Он напоминает TypeScript, но со статической типизацией, и транслируется непосредственно в машинные команды Wasm.

В качестве примера попросим Грок реализовать на AssemblyScript традиционную юниксную команду /bin/echo.
исходный код )
Как можно видеть, используются системные вызовы args_sizes_get, args_get, fd_write. Некоторую трудность вызывает преобразование строк из внутреннего формата UTF-16 в UTF-8 для fd_write. Компилируем, запускаем:
$ asc echo.ts --use abort= -O -o echo.wasm
$ wasmtime echo.wasm foobar йцукенг 12 3 456
foobar йцукенг 12 3 456
Работает! И даже русские буквы в кодировке UTF-8 правильно показывает. Глянем, как выглядят машинные команды. Дизассемблируем с помощью wasm2wat и отыщем функцию _start().
машинные инструкции )
Вроде ничо так выглядит. На этом вполне можно программировать. А если учесть, что в последнем WASIX появились системные вызовы fork(), exec() и wait(), можно даже попробовать портонуть юниксный /bin/sh и весь прочий набор команд BSD.