Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Леонид Каганов ([info]lleokaganov)
@ 2023-04-07 02:30:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:программирование

WASM-JS
взято отсюда: https://lleo.me/dnevnik/2023/04/07

Ещё немного про 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


<input ... > <input ... > <input ... >

<input ... >   <input ... >   <input ... >   <input ... >


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