Как лучше всего общаться между программой Rust и встроенной средой выполнения WebAssembly? - PullRequest
2 голосов
/ 30 апреля 2020

Я работаю над Rust-программой, которую я хочу во время выполнения использовать WebAssembly в качестве языка сценариев для управления его поведением. Предположим, что сценарии также написаны на Rust. Я прочитал учебные пособия для Wasmer, Wasmtime и Lucet, и хотя экспортируемые / импортируемые функции могут принимать в качестве аргументов и возвращать примитивные типы WASM, похоже, не существует простого / безболезненного решения для передачи произвольных данных между двоичным файлом Rust и сценарием WASM работает в нем. В частности, строки должны обрабатываться с помощью , вручную передавая примитив как указатель на линейную память и длину среды выполнения.

wasm-bindgen похоже, что он мог бы решить мою проблему, но он нацелен только на WASM- JS связь в браузере. Для Wasmer и Wasmtime есть *-interface-types ящиков, но у них нет учебных пособий, они являются экспериментальными и могут быть изменены. Мне не нужно передавать struct s, но я бы хотел добиться чего-то вроде этого:

// in the host program
let argument: &[u8] = &[0, 1... n]; // dumb byte slice
let guest_result: Vec<u8> = wasm_runtime.call("guest_function", &[argument]);
// in the guest WASM library/script
let data_from_host: Vec<u8> = imported_function(some_other_bytes);

Просто достаточно пройти и вернуть Vec<u8> s или &[u8] s в обоих направлениях, Я мог бы десериализовать их с помощью bincode или другим способом. Кто-нибудь уже достиг этого? Я мог бы использовать линейную память, как со строками, но это кажется небезопасным, особенно с несколькими сценариями в нескольких потоках.

tl; dr Я хочу использовать WASM в качестве языка сценариев и общаться с ним с помощью &[u8] или Vec<u8>, не нашел никакого простого способа сделать это.

1 Ответ

1 голос
/ 03 мая 2020

Эта проблема с юзабилити известна, и похоже, что над ней активно работают: https://hacks.mozilla.org/2019/08/webassembly-interface-types/

Вот продолжение некоторых заключительных замечаний в этом посте: https://github.com/bytecodealliance/wasmtime/issues/677

У меня очень мало опыта написания C или работы с интерфейсом системного вызова, поэтому мне было неудобно также передавать значения. По большей части я просто потратил время на создание абстракций более высокого уровня (как это сделал wasm-bindgen), чтобы мне было легче передавать данные.

В качестве примера, похоже, что wasi предоставляет интерфейс, который вы можете реализовать, и они абстрагируют все ненужные биты: https://docs.rs/crate/wasi/0.9.0+wasi-snapshot-preview1/source/src/lib_generated.rs вы можете увидеть, как lucet реализует его здесь: https://github.com/bytecodealliance/lucet/blob/master/lucet-wasi/src/runtime.rs

Не думаю, что это вам сильно поможет, если вы не пытаетесь реализовать wasi, но это хороший пример реализации того типа абстракций, для которого вы собираетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...