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, а также консультантом, помогающим командам работать более гибко. Он написал книгу о дизайне пользовательского интерфейса и с тех пор пишет технические статьи. Подробнее Дэвид Истман