0
<< предыдущая заметкаследующая заметка >>
07 апреля 2023
WASM-JS

Ещё немного про WASM и язык Rust. Современный браузер имеет в целом два языка программирования: классический JavaScript, а также браузерный ассемблер WASM. Который собственно языком программирования не является, а является сущностью, в которую можно скомпилировать код с любого другого языка. Для чего это может пригодиться?

— Если у вас есть библиотеки на других языках — какая-нибудь обработка звука на С или блокчейн-парсеры на Rust
— Если у вас очень дорогие вычисления, и повышение производительности от 30% вам критично.

Чего WASM не даст? Компактного объема не даст — все процедуры компилятор туда потащит с нуля, и код раздуется на сотни кб по сравнению с JS. Бешеной производительности тоже не ждём: от 30% можно повысить производительность, ну и время старта страницы теоретически должно повыситься (хотя на практике ощущения такого нет). Никаких интересных возможностей, которых не было в JS, WASM точно не даст. Он вообще никаких возможностей не даст, более того — по всем вопросам, связанным с браузером, он будет всё равно бегать в JS. И запускать его придется тоже из JS, там специальный костыль script type='module' и еще придется отдельно объявлять все его функции.

Тем не менее я приподохуел от программирования сайтов на Rust YEW, потому что к сложному языке Rust добавляются адские глюки костылей YEW, который пытается бегать в JS по всем своим надобностям, и не всегда успешно. И в целом это получается такая каша из костылей, которая с программированием сайтов как-то совсем не помогает. Я пришел к выводу, что самое эффективное использование WASM — это собирать в нем процедуры чистых вычислений, а по всем браузерным делам активно использовать мостики между WASM и JS.

Для демонстрации удобства такого подхода я собрал модельку. Смысл ее следующий: мы на языке Rust объявляем процедуры внутри WASM, к которым сможем обращаться из JS, передавая параметры и получая ответы. И наоборот: в процессе работы на Rust мы сможем из WASM вызвать любые процедуры своих библиотек JS (из заранее объявленного списка), передать им параметры и получить от них тоже данные. Процедурам JS разумно поручить общение с браузером и внешним миром — они это умеют хорошо. Даже сбегать на сайт биржи скачать данные (как в примере ниже) имеет смысл тоже на JS, а вот обработкой результата можно заняться и внутри WASM на Rust.

Я накидал несколько простых примеров в lib.rs и подключил библиотечкe своего JS-фреймворка от блога — сильно урезанного. Но он умеет рисовать всякие красивые окошечки по разным надобностям, дает легкий доступ к элементам страницы, всякие там звуки, картинки, разрешения экрана, запись текста в клипбоард, и прочая ерунда, которую порой и на JS написать сложно, чтобы поняли все браузеры, а уж изнутри WASM и вовсе не дотянуться. Отдельно я заканался решать в Расте вопрос с глобальными переменными, которые там в целом запрещены по причинам безопасности, поэтому тупо завел на странице невидимый DIV и просто храню все глобальные переменные в его атрибутах, чего и вам советую, это удобно.

В общем, кому вдруг интересно, как можно сделать обращения из JS в WASM и обратно простыми и понятными, моделька лежит на Гитхабе, а здесь — демка Хотя эту демку WASM с обвязкой можно вставить в любую страницу, например прямо в эту на моем сайте:

RUST/JS Bridge


     


Возможно этот пример мостика WASM-JS с простой библиотечкой функций будет кому-то полезен. А если вы спросите, зачем это мне и почему не что-нибудь другое, то просто у меня по работе задача соединять всякие сайтовые движки с библиотеками, написанными на Rust, такое ТЗ.

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок

Комментарии к этой заметке скрываются - они будут видны только вам и мне.

Оставить комментарий