Я работаю над 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>
, не нашел никакого простого способа сделать это.