vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2022-08-07 03:15 pm

У дяди WASI

На виртуальные машины я пожаловался, теперь глянем на дело конструктивно. Предположим, мы хотим сделать софт, которому суждена долгая жизнь. Скажем, декодер звука MP3, или отрисовщик документов в формате DJVU, или парсер санскрита. Лет через сто какой-нибудь марсианин захочет прослушать или прочитать древний файл из архива землян. Понятно, что бинарники за сто лет устареют. А виртуальные машины выживут (не все), и могут спасти ситуацию. Тут я задумался. Какие из современных вариантов имеют лучшие шансы? И сдаётся мне, что самая распространённая нынче и живучая виртуальная машина это JavaScript. В каждом компьютере установлен как минимум один браузер, и в нём эта машина. Можно было бы на неё положиться.

Возникает вопрос: каким образом можно разрабатывать софт для запуска на VM внутри браузеров? Ответ состоит в магическом слове WebAssembly. Это стандарт, Draft Release 2.0 на настоящее время, определяющий бинарный формат и софтверные интерфейсы. Существующие компиляторы Си/Cи++ (clang) и Rust умеют генерить бинарный код для Wasm.

Отлично! С чего же начать? В сети есть куча примеров, как скомпилировать Си-код, вычисляющий функцию Фибоначчи, и вызвать её из браузера. Но этот не то, чего хочется. Вот есть у меня симулятор древней ЭВМ БЭСМ-6. Как скомпилировать его для Wasm, и вызывать как обычно, из командной строки? Ведь виртуальная машина браузера изолирует ваш код от окружения и мало чего ему позволяет. Оказывается, умные люди об этом уже позаботились. Встречайте проект WASI: интерфейс из WebAssembly к сервисам локальной операционной системы.

Компилируем

Меньше слов, больше дела. Устанавливаем компилятор Си/Си++ для WASI отсюда: wasi-sdk-16

Компилируем простейший код:
$ cat hello.c
#include <stdio.h>
int main()
{
printf("Hello, WebAssembly!\n");
}

$ /opt/wasi-sdk-16.0/bin/clang hello.c -o hello.wasm

$ file hello.wasm
hello.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)

$ /opt/wasi-sdk-16.0/bin/size hello.wasm
text data bss dec hex filename
14817 2651 0 17468 443c hello.wasm

Выполняем

Теперь выполним этот бинарник. Необязательно звать весь браузер, есть решение попроще. Устанавливаем утилиту wasmtime, по сути независимую реализацию виртуальной машины WebAssembly. На маке она ставится так:
brew install wasmtime
Установка на Линуксе:
curl https://wasmtime.dev/install.sh -sSf | bash
Теперь запускаем наш пример:
$ wasmtime hello.wasm 
Hello, WebAssembly!
В следующий раз попробую запустить бенчмарк Dhrystone.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org