Skip to content
EN

WASI — WebAssembly System Interface

Коротко:

WASI (WebAssembly System Interface) — стандарт системных вызовов для WASM-модулей вне браузера (server, CLI, edge). Позволяет WASM читать файлы, открывать сокеты, работать с clock — но только через capability-based access (caller передаёт handle, модуль не может gethostname-аллочить). WASI 0.2 (2024) построено на Component Model. Runtimes: Wasmtime, WasmEdge, Spin.

Ниже: подробности, пример, смежные термины, FAQ.

Проверить свой сайт →

Детали

  • Capability-based security: WASM модуль не имеет ambient authority
  • Sandboxed-by-default: по умолчанию нет доступа к fs, network, env
  • WASI Preview 2 (0.2) = Component Model + разбитый API на интерфейсы
  • Preview 1 — legacy (wasi_snapshot_preview1), ещё работает в Wasmtime
  • Typical use: serverless (Fermyon Spin), CDN compute (Fastly), plugins (Shopify Functions)

Пример

// Rust → WASI binary
$ cargo build --target wasm32-wasi --release
$ wasmtime --dir=. target/wasm32-wasi/release/app.wasm

// Fermyon Spin app.toml
[[component.trigger]]
route = "/"
[component.source]
path = "target/wasm32-wasi/release/hello.wasm"

Связанные термины

Что такое WASI?

WASI (WebAssembly System Interface) — это стандарт, позволяющий WebAssembly (Wasm) выполнять системные вызовы, необходимые для взаимодействия с операционной системой. WASI предоставляет разработчикам API для работы с файловой системой, сетью и другими системными ресурсами, обеспечивая при этом безопасность и изоляцию выполнения кода. Это делает Wasm более универсальным для создания веб-приложений и серверных решений.

Практическое применение WASI

Для использования WASI в вашем проекте, необходимо интегрировать Wasm-библиотеку с поддержкой WASI. Рассмотрим пример использования WASI с помощью инструмента wasmtime. Сначала установите wasmtime:

curl https://wasmtime.dev/install.sh -sSf | bash

После установки создайте файл hello.wat с простым кодом:

(module
  (import "wasi_unstable" "args_get" (func $args_get (param i32 i32) (result i32)))
  (import "wasi_unstable" "args_sizes_get" (func $args_sizes_get (param i32 i32) (result i32)))
  (func (export "main")
    (call $args_sizes_get (i32.const 0) (i32.const 0))
  )
)

Скомпилируйте его в Wasm:

wasm2wat hello.wat -o hello.wasm

Запустите его с помощью wasmtime:

wasmtime hello.wasm

Этот пример демонстрирует, как можно использовать WASI для получения аргументов командной строки. WASI предоставляет функции для работы с аргументами, что значительно упрощает разработку приложений.

Преимущества использования WASI

Внедрение WASI в ваши проекты имеет множество преимуществ:

  • Безопасность: WASI изолирует выполнение кода, предотвращая доступ к системе без разрешения.
  • Кроссплатформенность: Код, написанный с использованием WASI, может работать на различных платформах, включая серверные и клиентские окружения.
  • Производительность: WebAssembly исполняется быстрее, чем JavaScript, что позволяет создавать более отзывчивые приложения.
  • Гибкость: WASI позволяет разработчикам использовать мощные системные функции, не беспокоясь о деталях реализации на разных платформах.

В итоге, использование WASI дает возможность разработчикам создавать более мощные и безопасные приложения, которые могут работать в различных окружениях. Это особенно актуально в условиях растущего интереса к серверным функциям и облачным вычислениям.

Больше по теме

Часто задаваемые вопросы

WASI vs Docker?

Docker = linux kernel + container runtime. WASI = capability-API, isolation без kernel, cold-start ~1ms vs ~100ms Docker.

Production-ready?

Для CLI, plugins, serverless — да (Fastly, Shopify). Full web-server на WASI — пока experimental (нет async sockets в preview2).

Поддержка async?

WASI 0.2 добавляет async (poll_oneoff). Tokio для WASI — в процессе интеграции.

Запустить инструмент, который описан в этой статье

Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.