0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>WebAssembly - портируемый бинарный формат. Это значит, что один и тот же файл может быть запущен везде. Но каждая платформа, на которой мы захотим запускать этот самый "один и тот же файл", должна уметь выполнять Wasm-код - и делать это максимально быстро и максимально безопасно.</p>
1
<p>WebAssembly - портируемый бинарный формат. Это значит, что один и тот же файл может быть запущен везде. Но каждая платформа, на которой мы захотим запускать этот самый "один и тот же файл", должна уметь выполнять Wasm-код - и делать это максимально быстро и максимально безопасно.</p>
2
<p>Wasmer - это среда исполнения WebAssembly, написанная на Rust. И среда эта - встраиваемая. Она может быть включена в состав программ на Rust, а ещё её можно подключить из других языков: PHP (<a>php-ext-wasm</a>), Python (<a>PyPI:wasmer</a>), Ruby (<a>Gem:wasmer</a>) и других.</p>
2
<p>Wasmer - это среда исполнения WebAssembly, написанная на Rust. И среда эта - встраиваемая. Она может быть включена в состав программ на Rust, а ещё её можно подключить из других языков: PHP (<a>php-ext-wasm</a>), Python (<a>PyPI:wasmer</a>), Ruby (<a>Gem:wasmer</a>) и других.</p>
3
<p>Wasmer полностью сфокусирован на запуске модулей WebAssembly на стороне сервера. Мы начинали с запуска сгенерированных с помощью Emscripten модулей, но постепенно добавляли поддержку других ABI (application binary interface, двоичный интерфейс приложений) - WASI, Wascap и так далее.</p>
3
<p>Wasmer полностью сфокусирован на запуске модулей WebAssembly на стороне сервера. Мы начинали с запуска сгенерированных с помощью Emscripten модулей, но постепенно добавляли поддержку других ABI (application binary interface, двоичный интерфейс приложений) - WASI, Wascap и так далее.</p>
4
<p>Вы можете запускать разные программы с каждым ABI, например, Nginx (Emscripten) и Cowsay (WASI).</p>
4
<p>Вы можете запускать разные программы с каждым ABI, например, Nginx (Emscripten) и Cowsay (WASI).</p>
5
<p>Со временем мы поняли, что среда исполнения выполняла много проверок перед запуском экземпляра приложения, чтобы убедиться, что модуль совместим с определенным ABI (Emscripen или WASI). Это означает проверку соответствия импортов и экспортов модуля ожиданиям среды. Например, речь идёт о проверке сигнатур функций или совпадении глобальных типов.</p>
5
<p>Со временем мы поняли, что среда исполнения выполняла много проверок перед запуском экземпляра приложения, чтобы убедиться, что модуль совместим с определенным ABI (Emscripen или WASI). Это означает проверку соответствия импортов и экспортов модуля ожиданиям среды. Например, речь идёт о проверке сигнатур функций или совпадении глобальных типов.</p>
6
<p>Оказывается, эти проверки важны не только потому, что позволяют убедиться в совместимости модуля со средой исполнения. Они также полезны тем, что позволяют убедиться в совместимости модуля с конкретным API.</p>
6
<p>Оказывается, эти проверки важны не только потому, что позволяют убедиться в совместимости модуля со средой исполнения. Они также полезны тем, что позволяют убедиться в совместимости модуля с конкретным API.</p>
7
<p>Это может быть ключом к созданию экосистемы плагинов для любой программы, использующей WebAssembly как часть системы плагинов, в которой каждый модуль должен быть совместимым с определённым интерфейсом, например, с заголовочными файлами в C.</p>
7
<p>Это может быть ключом к созданию экосистемы плагинов для любой программы, использующей WebAssembly как часть системы плагинов, в которой каждый модуль должен быть совместимым с определённым интерфейсом, например, с заголовочными файлами в C.</p>
8
<p>С помощью интерфейсов WebAssembly и WAPM (<a>WebAssembly Package Manager</a>) вы можете легко использовать всю экосистему WAPM для создания, верификации и распространения плагинов.</p>
8
<p>С помощью интерфейсов WebAssembly и WAPM (<a>WebAssembly Package Manager</a>) вы можете легко использовать всю экосистему WAPM для создания, верификации и распространения плагинов.</p>
9
<p>Поэтому мы решили поработать над способами проверки и<a>предложить их как стандарт определения наборов импортов и экспортов</a>, которые должны быть в модуле.</p>
9
<p>Поэтому мы решили поработать над способами проверки и<a>предложить их как стандарт определения наборов импортов и экспортов</a>, которые должны быть в модуле.</p>
10
<h2>Содержание</h2>
10
<h2>Содержание</h2>
11
<ul><li><a>Покажите мне интерфейсы Wasm</a></li>
11
<ul><li><a>Покажите мне интерфейсы Wasm</a></li>
12
<li><a>Как использовать интерфейсы Wasm</a></li>
12
<li><a>Как использовать интерфейсы Wasm</a></li>
13
<li><a>Ручная проверка интерфейса модуля</a></li>
13
<li><a>Ручная проверка интерфейса модуля</a></li>
14
<li><a>Автоматическая проверка интерфейсов для модуля с помощью WAPM</a></li>
14
<li><a>Автоматическая проверка интерфейсов для модуля с помощью WAPM</a></li>
15
<li><a>Как создать новый интерфейс с помощью WAPM</a></li>
15
<li><a>Как создать новый интерфейс с помощью WAPM</a></li>
16
</ul><h2>Покажите мне интерфейсы Wasm</h2>
16
</ul><h2>Покажите мне интерфейсы Wasm</h2>
17
<p>Интерфейсы WebAssembly созданы под влияением ЛИСП-подобного текстового формата Wasm. Мы намеренно настаивали, чтобы формат не зависел от будущих предложений, так как хотели, чтобы интерфейсы были близки к внутренним форматам Wasm (только четыре типа: i32, i64, f32, f64).</p>
17
<p>Интерфейсы WebAssembly созданы под влияением ЛИСП-подобного текстового формата Wasm. Мы намеренно настаивали, чтобы формат не зависел от будущих предложений, так как хотели, чтобы интерфейсы были близки к внутренним форматам Wasm (только четыре типа: i32, i64, f32, f64).</p>
18
<p>Ниже представлены интерфейсы WebAssembly для WASI:</p>
18
<p>Ниже представлены интерфейсы WebAssembly для WASI:</p>
19
<p>Это значит, что модуль, в котором реализуется интерфейс WASI, должен быть совместимым с представленными сигнатурами.</p>
19
<p>Это значит, что модуль, в котором реализуется интерфейс WASI, должен быть совместимым с представленными сигнатурами.</p>
20
<h2>Как использовать интерфейсы Wasm</h2>
20
<h2>Как использовать интерфейсы Wasm</h2>
21
<p>Некоторые проекты уже используют представленный синтаксис для определения модулей WebAssembly. Пионером интеграции интерфейсов Wasm стал WAPM.</p>
21
<p>Некоторые проекты уже используют представленный синтаксис для определения модулей WebAssembly. Пионером интеграции интерфейсов Wasm стал WAPM.</p>
22
<p>Если вы используете<a>wapm cli</a>, модули будут автоматически проверяться с помощью имеющегося интерфейса перед публикацией в реестре. Так мы убеждаемся в совместимости новых модулей с ABI, которые они призваны реализовывать.</p>
22
<p>Если вы используете<a>wapm cli</a>, модули будут автоматически проверяться с помощью имеющегося интерфейса перед публикацией в реестре. Так мы убеждаемся в совместимости новых модулей с ABI, которые они призваны реализовывать.</p>
23
<p>В настоящее время в WAPM доступны такие интерфейсы:</p>
23
<p>В настоящее время в WAPM доступны такие интерфейсы:</p>
24
<ul><li><a>WASI</a>. Это модульный системный интерфейс Wasm (WASI - WebAssembly System Interface). Он сфокусирован на безопасности и портативности.</li>
24
<ul><li><a>WASI</a>. Это модульный системный интерфейс Wasm (WASI - WebAssembly System Interface). Он сфокусирован на безопасности и портативности.</li>
25
<li><a>Wascap</a>. Это набор стандартов и соглашений, которые заполняют пробел в облачной среде модулей Wasm.</li>
25
<li><a>Wascap</a>. Это набор стандартов и соглашений, которые заполняют пробел в облачной среде модулей Wasm.</li>
26
</ul><h2>Ручная проверка интерфейса модуля</h2>
26
</ul><h2>Ручная проверка интерфейса модуля</h2>
27
<p>Когда вы используете WAPM и поле interfaces в кофигурациях, мы проверяем модуль на совместимость с интерфейсом. Также мы создали бинарный файл wasm-interface, который доступен на<a>WAPM</a>:</p>
27
<p>Когда вы используете WAPM и поле interfaces в кофигурациях, мы проверяем модуль на совместимость с интерфейсом. Также мы создали бинарный файл wasm-interface, который доступен на<a>WAPM</a>:</p>
28
<h2>Автоматическая проверка интерфейсов для модуля с помощью WAPM</h2>
28
<h2>Автоматическая проверка интерфейсов для модуля с помощью WAPM</h2>
29
<p>Публиковать модули для WASI или Wascap очень просто. Убедитесь, что используете последнюю версию wasmer и wapm с помощью команды wasmer self-update.</p>
29
<p>Публиковать модули для WASI или Wascap очень просто. Убедитесь, что используете последнюю версию wasmer и wapm с помощью команды wasmer self-update.</p>
30
<p>Отредактируйте файл wapm.toml и добавьте секцию [module.interfaces]:</p>
30
<p>Отредактируйте файл wapm.toml и добавьте секцию [module.interfaces]:</p>
31
<p>Как только вы добавите новый интерфейс в модуль и опубликуете его на WAPM, он появится в UI. Смотрите тег WASI рядом с названием.</p>
31
<p>Как только вы добавите новый интерфейс в модуль и опубликуете его на WAPM, он появится в UI. Смотрите тег WASI рядом с названием.</p>
32
<h2>Как создать новый интерфейс с помощью WAPM</h2>
32
<h2>Как создать новый интерфейс с помощью WAPM</h2>
33
<p>Скоро каждый желающий сможет создавать новые интерфейсы WebAssembly на WAPM. Мы решили начать с ручного создания новых интерфейсов, чтобы ускорить итерации при необходимости небольших изменений синтаксиса.</p>
33
<p>Скоро каждый желающий сможет создавать новые интерфейсы WebAssembly на WAPM. Мы решили начать с ручного создания новых интерфейсов, чтобы ускорить итерации при необходимости небольших изменений синтаксиса.</p>
34
<p><em>Адаптированный перевод статьи<a>Introducing WebAssembly Interfaces</a>by Syrus Akbary. Мнение автора оригинальной публикации может не совпадать с мнением администрации "Хекслета".</em></p>
34
<p><em>Адаптированный перевод статьи<a>Introducing WebAssembly Interfaces</a>by Syrus Akbary. Мнение автора оригинальной публикации может не совпадать с мнением администрации "Хекслета".</em></p>