wasm runtime встраивать в плюсовый код для экспорта функций из wasm (udf/plugin like функциональность)?
Из вариантов которые я посмотрел
v8 — очень здоровый, передача аргументов через gc, и в целом скорее интеграция через js (нет i64 типов по сути)
wasm3 — только интерпретатор что как то печально
wamr — вроде то что нужно, но не уверен в его надежности
wasmtime, wasmer — выглядят довольно похоже и вроде популярны, из минусов это раст и не очень понятно насколько комфортно это будет интегрировать в плюсовый проект (ну через c-api). Еще у wasmer несколько бекендов
Скорее всего вы не сильно хорошо смотрели на V8 и увидели только какой-то высокоуровневый API вперемешку с JS, в то время когда там есть целая иерархия апишек/интерфейсов разного уровня (вплоть до того что можно вручную создать инстанс класса который парсит wasm а потом инстанс класса турбофан-движка с нужными оптимизациями и после прогона получить буффер с нативым кодом которого дальше можно запустить) Вот например смотрели на это - https://stackoverflow.com/questions/53925972/call-webassembly-from-embedded-v8-without-js ?
// module_instance_exports.add(77, 88) args_type add_args{Int32::New(isolate, 77), Int32::New(isolate, 88)}; Local<Int32> adder_res = module_instance_exports ->Get(context, String::NewFromUtf8(isolate, "add")) .ToLocalChecked().As<Function>() ->Call(context, context->Global(), 2, add_args) .ToLocalChecked().As<Int32>(); Это по сути js api
То есть исполнение будет безусловно wasm, но работать с этим как с wasm по сути как будто нельзя. Только через js
есть еще некий fast api - https://github.com/nodejs/node/blob/main/deps/v8/include/v8-fast-api-calls.h
Мне показалось что это во первых что-то недоделанное, во вторых скорее в обратную сторону вызов из js нативного кода. Но я могу ошибаться. В целом по определенным причинам я рад сейчас бы использовать v8 если бы было можно сделать что-то похожее на то что могут другие рантаймы в плане встраивания, но пока сложилось впечатление что нельзя
https://00f.net/2023/01/04/webassembly-benchmark-2023/ Не только бенчмарк, но и список всех основных реализаций Wasm на текущий момент.
Да я смотрел. А потом видел такое https://cobweb.cs.uga.edu/~wenwen/papers/iiswc2022.pdf И как то оно все biased. Например, у автора по ссылке, нет кода бенчмарков публично, только данные :( wamr понравился тем что бинарь маленький получился. По поводу wasmer я читал это утверждение, но в чем именно заключаются отличия от других рантаймов с точки зрения встраивания я не нашел инфы.
Я бы код бенчмарков вот тут поискал: https://github.com/jedisct1/libsodium/tree/master/test/default 😉
Also https://github.com/wasmerio/wasmer/tree/master/lib/c-api JFYI
Я когда-то раньше изучал исходный код V8 и у меня есть уверенность что c v8 можно получить все что что хочешь (например напрямую без жс скомпилировать wasm в нативный код и напрямую взаемодействовать с ним с нулевым с-calling-conv оверхедом и без всякого жс) просто это потребует большего погружения в исходный код (изучение хедеров внутренних классов, юнит-тестов, дебаг/трейсинг для понимания как оно все взаимодействует и т.д) Я уже кстати думал про это и у меня есть даже план заняться этим когда будет время - а именно есть идея сделать форк v8 и выпилить все что связано c жс (то есть оставить только wasm-парсер и turbofan c x64/arm бэкендами) и таким образом сделать минимальный wasm-aot компилятор и получить некого конкурента другим aot-компиляторам (wasmtime/wasmer/etc)
Ну оно у всех перечисленных есть кроме v8 по сути
Может быть, но тут вопрос в том что это нужно для рабочих нужд и желания заниматься поддержкой патчей да и в целом погружением внутрь v8 не хочется
У Wasmtime я не видел, но я и не смотрел давно... Раз у всех есть — я тогда не очень понимаю сути Вашего вопроса?
https://docs.wasmtime.dev/c-api/
Ну вопрос просто что выбрать
Я уже предложил выбрать Wasmer. 🤷♀️
Наверняка у каждого будут свои нюансы, но хочется как то на менее неприятные попасть
Нет. 😁
А отрицательный?
Тоже нет. Никакого не было. 😊
Обсуждают сегодня