На наших глазах родилась новая компьютерная архитектура: WebAssembly. Я уже упоминал как-то. Спецификацию можно скачать по ссылке:
webassembly.github.io/spec/core/_download/WebAssembly.pdf
Фактически это самая массовая виртуальная машина нынче. WebAssembly реализована во всех современных веб-браузерах:
Чтобы программы, написанные на WebAssembly (в простонародии Wasm), могли общаться с внешним миром, разработан стандарт WASI. По аналогии с юниксом можно считать это набором системных вызовов.
Чтобы программировать на самом близком к "железу" уровне, для традиционных компьютеров используют язык ассемблера. Но мы же не дикари какие в 21-м веке. 😀 Для Wasm сделан высокоуровневый язык AssemblyScript. Он напоминает TypeScript, но со статической типизацией, и транслируется непосредственно в машинные команды Wasm.
В качестве примера попросим Грок реализовать на AssemblyScript традиционную юниксную команду /bin/echo.
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 (в простонародии Wasm), могли общаться с внешним миром, разработан стандарт WASI. По аналогии с юниксом можно считать это набором системных вызовов.
Чтобы программировать на самом близком к "железу" уровне, для традиционных компьютеров используют язык ассемблера. Но мы же не дикари какие в 21-м веке. 😀 Для Wasm сделан высокоуровневый язык AssemblyScript. Он напоминает TypeScript, но со статической типизацией, и транслируется непосредственно в машинные команды Wasm.
В качестве примера попросим Грок реализовать на AssemblyScript традиционную юниксную команду /bin/echo.
( исходный код )
Как можно видеть, используются системные вызовы args_sizes_get, args_get, fd_write. Некоторую трудность вызывает преобразование строк из внутреннего формата UTF-16 в UTF-8 для fd_write. Компилируем, запускаем:Работает! И даже русские буквы в кодировке UTF-8 правильно показывает. Глянем, как выглядят машинные команды. Дизассемблируем с помощью wasm2wat и отыщем функцию _start().$ asc echo.ts --use abort= -O -o echo.wasm $ wasmtime echo.wasm foobar йцукенг 12 3 456 foobar йцукенг 12 3 456
( машинные инструкции )
Вроде ничо так выглядит. На этом вполне можно программировать. А если учесть, что в последнем WASIX появились системные вызовы fork(), exec() и wait(), можно даже попробовать портонуть юниксный /bin/sh и весь прочий набор команд BSD.