Как создавать компоненты WebAssembly с помощью языка MoonBit

MoonBit — это современный язык плюс рабочий процесс, предназначенный для создания эффективных проектов WebAssembly; он также может быть ориентирован на JavaScript. Последний раз я смотрел MoonBit в июне 2024 года, поэтому мне хотелось посмотреть, продвинулся ли он в использовании Wasm. (Кроме того: если вы все еще не совсем поняли суть Васма, вы не совсем одиноки.)

Теперь MoonBit также может работать в рамках модели веб-компонентов, которую мы вскоре рассмотрим. Мы реализуем это, а затем проверим, что это работает. Мы собираемся реализовать только простой метод сложения.

Краткий курс повышения квалификации по языку MoonBit

Но нам лучше ненадолго вернуться к языку MoonBit, чтобы освежить знания.

Начнем, конечно, с Hello World:

fn print_hello() -> Unit { println(«Привет, мир!») } 123 fn print_hello() -> Unit { println(«Привет, мир!») }

Единственное, что несколько неожиданно, это термин Unit, но это всего лишь объектный эквивалент первого класса MoonBit для void.

Вот еще один пример:

fn add3(x: Int, y: Int, z: Int) -> Int { x + y + z } 123 fn add3(x: Int, y: Int, z : Int) -> Int { x + y + z }

Это функция «верхнего уровня»; и обратите внимание, что мы должны явно указывать типы. Но чтобы глубже изучить сам язык, просто совершите экскурсию.

Интеграция WebAssembly через модель компонентов

Однако мы здесь ради интеграции WebAssembly. MoonBit работает с моделью компонентов WebAssembly, которая избавляет от некоторых сложностей при реализации базовых функций. Модели компонентов всегда являются следующим этапом развития языковых проектов, поскольку они фиксируют интерфейсы, контракты и типы.

Логически компонент — это структура, которая может содержать основные модули и/или другие компоненты. Компонент выражает интерфейсы этих содержащихся в нем модулей и подкомпонентов с использованием типов интерфейса WebAssembly (WIT). Если это звучит как классическое, слишком академическое определение, не волнуйтесь слишком сильно. Он будет отлично работать в производственной цепочке инструментов. Этот пост следует из документации MoonBit по компонентам WebAssembly.

Установка необходимых инструментов и цепочек инструментов

Прежде чем мы сделаем что-нибудь еще, нам понадобится инструмент CLI wit-bindgen для создания привязок, совместимых с WIT; который основан на Rust, поэтому вам понадобится Cargo. Это бесплатно, если мы просто установим Rust:

локон[-sSf|ш1локон[-sSf|ш

(Если вы создали Rust, вам, возможно, придется решить, хотите ли вы, чтобы Rustup постоянно обновлял Rust или нет. Я не обновился должным образом, и позже у меня возникли проблемы, поэтому я бы рекомендовал удалить любую готовую версию.)

Прежде чем сделать это, просто сначала введите «груз», если он у вас уже есть. Я сделал:

Это немного устарело, но работает. Итак, мы устанавливаем инструмент CLI для привязки:

> установка груза с помощью-bindgen-cli 1 > установка груза с помощью-bindgen-cli

Вы можете получить предупреждение о необходимости добавить каталог bin к вашему пути. Я устанавливаю на свой MacBook, поэтому просто добавил его в PATH.

Затем устанавливаем инструменты Wasm для работы с компонентами:

> Грузовая установка Wasm-Tools 1 > Грузовая установка Wasm-Tools

Но нам лучше заняться установкой самого MoonBit:

> локон -fsSL | bash 1 > локон -fsSL | бить

После запуска или запуска новой оболочки (в моем случае):

> источник ~/.zshrc 1 > источник ~/.zshrc

Теперь вы можете запустить организатор проектов Moon на основе Rust:

Итак, теперь у нас есть луна на палке.

Определение программы с помощью файла WIT

Прежде чем мы сможем написать MoonBit, нам нужно создать WIT. Это необходимо для того, чтобы мы могли объявить нашу работу допустимой в мире компонентов WebAssembly:

Создаём wit/world.wit.

документы пакета: adder@0.1.0; интерфейс добавить {добавить: func(x: u32, y: u32) -> u32; } мировой сумматор {экспорт добавить; } 12345678 пакет документов:adder@0.1.0; интерфейс добавить {добавить: func(x: u32, y: u32) -> u32; } мировой сумматор {экспорт добавить; }

Здесь объявляется пакет docs:adder версии 0.1.0 и интерфейс добавления с единственной функцией беззнаковых 32-битных чисел (они сопоставляются с UInts в MoonBit). Остроумие мир — это контейнер, в который вы помещаете все необходимое для работы. В данном случае это просто интерфейс добавления.

Хорошо, давайте сгенерируем это описание для нашего WIT и структуры MoonBit:

> wit-bindgen Moonbit wit/world.wit —out-dir . —derive-eq —derive-show —derive-error 1234 > wit-bindgen Moonbit wit/world.wit —out-dir . —derive-eq —derive-show —derive-error

Итак, у вас должно быть это:

Вы, наверное, догадались, что суффикс .mbt — это файл MoonBit. Но, конечно, мы еще не написали MoonBit. Если мы попробуем проверить это как цель Wasm, мы получим массу предупреждений:

И если мы посмотрим на заглушку, то увидим проблему, соответствующую нашему наблюдению:

Короче говоря, в заглушке нет реального кода, это просто определение интерфейса. Даже используя наше минимальное руководство по MoonBit, приведенное выше, мы все равно можем легко выполнить это:

Основной файл конфигурации gen/moon.pkg.json должен содержать соответствующую информацию о пути.

Как создать модуль и компонент WebAssembly

Итак, мы наконец собираем основной модуль WebAssembly:

> Moon build —target Wasm 1 > Moon build —target Wasm

И мы получаем совершенно новый целевой каталог, включая файл Wasm:

Для подтверждения давайте проверим файл gen.wasm:

Хорошо, значит, это действительная WebAsssembly. Теперь нам нужно правильно обернуть его в модель компонента:

> компонент wasm-tools, встраиваемый с помощью target/wasm/release/build/gen/gen.wasm \ —encoding utf16 \ —output adder.wasm 123 > компонент wasm-tools, встраиваемый с помощью target/wasm/release/build/gen/gen.wasm \—encoding utf16 \—output adder.wasm

…с последующим:

> новый компонент wasm-tools adder.wasm —output adder.comComponent.wasm 1 > новый компонент wasm-tools adder.wasm —output adder.comComponent.wasm

По этому времени он немного отличается от прямого модуля Wasm:

Мы можем использовать Wasmtime, чтобы убедиться, что все работает:

Если Wasmtime не устраивает, скачайте последнюю версию прямо отсюда:

локон -sSf | bash 1 локон -sSf | бить

Вы также можете получить более мощный пример хоста, чтобы доказать, что наш файл .wasm работает.

Заключение

Я пришел проверить MoonBit и обнаружил компоненты WebAssembly. Таков путь разработчика — всегда есть еще один холм.

В какой-то момент MoonBit придется проделать еще немного работы над прямой поддержкой компонентной модели; в противном случае академическая сложность будет по-прежнему удерживать Васма в некотором отдалении от массовой поддержки (или ближе к Rust). Тем не менее, это похоже на другие модели в стиле заглушек — хотя язык описания веб-сервисов не самое лучшее сравнение — они хорошо работают в надежной цепочке инструментов, даже под руководством LLM.

ТЕНДЕНЦИОННЫЕ ИСТОРИИ YOUTUBE.COM/THENEWSTACK Технологии развиваются быстро, не пропустите ни одной серии. Подпишитесь на наш канал YouTube, чтобы смотреть все наши подкасты, интервью, демонстрации и многое другое. ПОДПИСАТЬСЯ Группа, созданная в Sketch. Дэвид работал профессиональным разработчиком программного обеспечения в Лондоне в компаниях Oracle Corp. и British Telecom, а также консультантом, помогающим командам работать более гибко. Он написал книгу о дизайне пользовательского интерфейса и с тех пор пишет технические статьи. Подробнее Дэвид Истман

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *