У дяди WASI
2022-08-07 15:15![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
На виртуальные машины я пожаловался, теперь глянем на дело конструктивно. Предположим, мы хотим сделать софт, которому суждена долгая жизнь. Скажем, декодер звука MP3, или отрисовщик документов в формате DJVU, или парсер санскрита. Лет через сто какой-нибудь марсианин захочет прослушать или прочитать древний файл из архива землян. Понятно, что бинарники за сто лет устареют. А виртуальные машины выживут (не все), и могут спасти ситуацию. Тут я задумался. Какие из современных вариантов имеют лучшие шансы? И сдаётся мне, что самая распространённая нынче и живучая виртуальная машина это JavaScript. В каждом компьютере установлен как минимум один браузер, и в нём эта машина. Можно было бы на неё положиться.
Возникает вопрос: каким образом можно разрабатывать софт для запуска на VM внутри браузеров? Ответ состоит в магическом слове WebAssembly. Это стандарт, Draft Release 2.0 на настоящее время, определяющий бинарный формат и софтверные интерфейсы. Существующие компиляторы Си/Cи++ (clang) и Rust умеют генерить бинарный код для Wasm.
Отлично! С чего же начать? В сети есть куча примеров, как скомпилировать Си-код, вычисляющий функцию Фибоначчи, и вызвать её из браузера. Но этот не то, чего хочется. Вот есть у меня симулятор древней ЭВМ БЭСМ-6. Как скомпилировать его для Wasm, и вызывать как обычно, из командной строки? Ведь виртуальная машина браузера изолирует ваш код от окружения и мало чего ему позволяет. Оказывается, умные люди об этом уже позаботились. Встречайте проект WASI: интерфейс из WebAssembly к сервисам локальной операционной системы.
Компилируем простейший код:
Возникает вопрос: каким образом можно разрабатывать софт для запуска на 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
В следующий раз попробую запустить бенчмарк Dhrystone.$ wasmtime hello.wasm
Hello, WebAssembly!
no subject
Date: 2022-08-08 00:23 (UTC)Классно! Бум знать. Вообще линки на твои посты хоть все записывай в wowiki.
no subject
Date: 2022-08-08 00:39 (UTC)Стараюсь, если где чего вычитаю любопытного, сразу постить в блог.
Чтобы потом знать, где искать.
no subject
Date: 2022-08-08 03:31 (UTC)no subject
Date: 2022-08-08 11:43 (UTC)С одной стороны, сегодняшний WASM это хорошо изолированный от внешнего мира автомат с собственным состоянием. Слишком много зависимости от внешней VM с ее собственным GC (особенно если это какая-то конкретная машина вроде v8) нарушит эту изолированность, отвязанность от внешних платформ. Но понимаю, неприятно, когда приходится в каждой WASM-памяти держать ее собственный memory allocator.
Но вот interface types, component model, witx, вообще любой способ обеспечить Interface Definition Language, нужны немедленно, конечно. Печально, когда даже два wasm-модуля не могут найти общий язык для структурированных данных.
no subject
Date: 2022-08-08 18:25 (UTC)no subject
Date: 2022-08-09 08:17 (UTC)C:\Test>wasmtime hello.wasm
не пишет ничего. Как я понимаю, проблема именно в wasmtime, потому что hello.wasm под WLS получается такой же точно (там и wasmtime работает).
А если этот hello.wasm браузером запускать, то как?
no subject
Date: 2022-08-09 20:38 (UTC)https://www.infoq.com/news/2019/10/wasmer-js-wasi-wasm-browser/
no subject
Date: 2022-08-10 12:13 (UTC)no subject
Date: 2022-08-10 18:27 (UTC)