Введение в Extism: библиотека WebAssembly для расширяемых приложений и плагинов.

автор


WebAssembly изначально был разработан для того, чтобы предоставить веб-приложениям в браузере возможность запуска портативных, изолированных и высокопроизводительных двоичных файлов. По мере того, как WASM выходит за рамки браузера, появляются новые возможности использования этой технологии. Использование WASM для обеспечения программируемости и расширяемости приложений — один из вариантов использования, который набирает обороты.

Библиотека программного обеспечения Extism позволяет писать программы, которые могут взаимодействовать с расширениями, написанными на WebAssembly. Extism обрабатывает интерфейс вызова данных и функций между кодом, написанным в вашем хост-приложении, и расширениями WASM. Это позволяет вам сосредоточиться на написании функций вашего приложения и расширений, а не вручную работать с типами данных WASM или соглашениями о вызовах.

Написание приложения на базе Extism

Библиотека Extism работает практически с любым широко используемым языком. В настоящее время она поддерживает C/C++, Java, JavaScript, Go, Rust, Ruby, Python, семейство языков .NET (в частности, C# и F#), Elixir, PHP, OCaml, Zig, Haskell и D. Поскольку библиотека сам написан на Rust и предоставляет интерфейс C-типа, любой язык с интерфейсом внешних функций C может поддерживать Extism после небольшой работы.

Плагины или расширения WASM могут быть написаны на любом языке, который компилируется в WASM. Rust — очевидный выбор, поскольку это язык, на котором написан Extism, но разработчики могут использовать AssemblyScript (который компилируется непосредственно в WASM) или JavaScript, Go, C#, F#, C, Haskell или Zig.

Философия Extism заключается в поддержке написания программ таким образом, чтобы их функциональность можно было свободно расширять с помощью плагинов, написанных на WASM. Эта расширяемость может быть настолько поверхностной или глубокой, насколько вам нравится. Среда выполнения WASM Extism также автоматически обрабатывает такие вещи, как выполнение в песочнице и доступ к памяти. Таким образом, он обеспечивает большую защиту процессов, чем другие решения, которые вы можете использовать для расширения функциональности программы, например встраивание интерпретатора Lua.

Пример плагина Extism

Вот простой пример плагина Extism и хост-приложения, которое его использует. Плагин имеет одну функцию: greet, который принимает строку и возвращает приветствие, используя предоставленную строку. Эта версия плагина (также адаптированная из документации Extism) для простоты написана на AssemblyScript:


import { Host } from '@extism/as-pdk';

export function greet(): i32 {
  let name = Host.inputString();
  let output = `Hello, ${name}!`;
  Host.outputString(output);
  return 0;
}

Комплект разработки плагинов Extism, или PDK, предоставляет объекты, которые мы используем для создания интерфейсов с внешним миром. Host Объект содержит различные абстракции для приема входных данных от хоста и их возврата в разных форматах — в данном случае в строках. Другой вариант — принять и вернуть JSON, поскольку это удобный способ обработки структурированных данных в Extism, но для этого примера подходят строки.

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

Пример приложения Extism

Чтобы написать приложение, использующее плагин Extism, вы используете библиотеку Extism для языка, на котором пишете приложение. В этом примере мы будем использовать Python, поскольку и язык, и способ работы с ним Extism довольно просты.

Вот программа Python, которую мы используем для работы с этим плагином:


import extism

manifest = {"wasm": [{"path":"myplugin/example.wasm"}]}
plugin = extism.Plugin(manifest)

def greet(text: str):
    return plugin.call("greet", text)

print(greet("Jeffrey"))

Запустите это, и вы получите ответ: Hello, Jeffrey!

Чтобы использовать наш плагин, нам нужно создать манифест (в данном случае словарь Python), который описывает, где можно найти плагин (здесь он находится в подкаталоге проекта с именем myplugin). Манифесты также можно использовать для описания другого поведения, например, сколько памяти может выделить плагин или какие пути на диске ему разрешено использовать.

Как только мы создадим объект, представляющий плагин, мы сможем вызывать к нему функции, используя .call() метод.

Обратите внимание, что этот простой пример работает только для одного заранее определенного плагина. Если ваше приложение хочет принимать произвольные плагины, ему необходимо определить интерфейсы для подключения плагинов. Затем он может либо автоматически обнаружить наличие плагинов, либо использовать какие-либо метаданные, предоставленные пользователем.

Заключение

Экстизм, как и сам WASM, относительно молод, и лучшие варианты его использования все еще развиваются. Благодаря низкому порогу входа как для написания плагинов WASM, так и для создания приложений, использующих их, Extism является полезным способом экспериментировать с WASM вне браузера. Вы пожнете плоды открытий и дивидендов.

Дальше читайте это:

  • Почему компании уходят из облака
  • 5 простых способов запустить LLM локально
  • Программирование с помощью ИИ: советы и лучшие практики от разработчиков
  • Знакомьтесь, Zig: современная альтернатива C
  • Что такое генеративный ИИ? Искусственный интеллект, который создает
  • Лучшее программное обеспечение с открытым исходным кодом 2023 года

Related Posts

Оставить комментарий