۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

Intro to Extism: یک کتابخانه WebAssembly برای برنامه ها و افزونه های قابل ارتقا

Extism به شما امکان می دهد پسوندهای WASM را برای برنامه هایی که تقریباً به هر زبانی نوشته شده اند بنویسید. در اینجا نحوه استفاده از Extism برای نوشتن برنامه‌ها و پلاگین‌های قابل توسعه آورده شده است.

Extism به شما امکان می دهد پسوندهای WASM را برای برنامه هایی که تقریباً به هر زبانی نوشته شده اند بنویسید. در اینجا نحوه استفاده از Extism برای نوشتن برنامه‌ها و پلاگین‌های قابل توسعه آورده شده است.

WebAssembly در اصل برای ارائه روشی به برنامه‌های وب درون مرورگر برای اجرای باینری‌های قابل حمل، جعبه‌شنی ماسه‌ای و با کارایی بالا طراحی شده بود. همانطور که WASM فراتر از مرورگر بالغ می شود، کاربردهای جدیدی از این فناوری در حال ظهور است. استفاده از WASM برای ایجاد برنامه‌ریزی و توسعه‌پذیری در برنامه‌ها یکی از موارد استفاده‌ای است که بخار جمع‌آوری می‌کند.

کتابخانه نرم افزار Extism به شما امکان می دهد برنامه هایی بنویسید که می توانند با برنامه های افزودنی نوشته شده در WebAssembly ارتباط برقرار کنند. Extism رابط فراخوانی داده و تابع بین کدهای نوشته شده در برنامه میزبان شما و برنامه های افزودنی WASM را مدیریت می کند. این به شما امکان می‌دهد به جای پرداختن به انواع داده‌های WASM یا قراردادهای فراخوانی، روی نوشتن عملکرد در برنامه و برنامه‌های افزودنی خود تمرکز کنید.

نوشتن یک برنامه مبتنی بر Extism

کتابخانه Extism تقریباً با هر زبان پرکاربردی کار می کند. در حال حاضر، از C/C++، Java، JavaScript، Go، Rust پشتیبانی می کند. ، Ruby، Python، خانواده زبان دات نت (به ویژه C# و F#)، Elixir، PHP، OCaml، Zig، Haskell، و D. از آنجایی که خود کتابخانه به زبان Rust نوشته شده است و یک رابط C-types را نشان می دهد، هر زبانی با یک رابط کاربری خارجی C می تواند با کمی کار از افراط گرایی حمایت کنید.

مهندسی تمام پشته یک سوم خوب است

افزونه‌ها یا پسوندهای WASM را می‌توان به هر زبانی که در WASM کامپایل می‌شود، نوشت. Rust یک انتخاب واضح است، زیرا زبان Extism با آن نوشته شده است، اما توسعه دهندگان می توانند از AssemblyScript (که مستقیماً در WASM کامپایل می شود) یا JavaScript، Go، C#، F#، C، Haskell یا Zig استفاده کنند.

فلسفه Extism این است که از نوشتن برنامه ها به گونه ای پشتیبانی کند که عملکرد آنها را بتوان آزادانه با افزونه های نوشته شده در WASM گسترش داد. این توسعه پذیری می تواند به اندازه دلخواه کم عمق یا عمیق باشد. زمان اجرا WASM Extism همچنین به طور خودکار مواردی مانند اجرای sandboxing و دسترسی به حافظه را کنترل می کند. به این ترتیب، نسبت به راه حل های دیگری که ممکن است برای گسترش عملکرد یک برنامه استفاده کنید، محافظت بیشتری از فرآیند ارائه می دهد، مانند جاسازی مترجم 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 است، اما رشته ها برای این مثال کار می کنند.

زبان برنامه نویسی Rust تیم امنیتی اختصاصی را به دست می آورد

ما همچنین باید تعریف کنیم که کدام توابع در افزونه ما به صورت خارجی در دسترس هستند. این کار بین زبان‌ها متفاوت است، اما در AssemblyScript از طریق کلمه کلیدی export انجام می‌شود. همچنین می‌توانیم ویژگی‌های پیشرفته رسیدگی به خطا را تعریف کنیم – به عنوان مثال، تابعی برای فراخوانی اگر خود افزونه خطایی ایجاد کند – اما برای سادگی آن را کنار می‌گذاریم.

نمونه ای از یک برنامه Extism

برای نوشتن برنامه‌ای که از افزونه Extism استفاده می‌کند، از کتابخانه Extism برای زبانی که برای نوشتن برنامه استفاده می‌کنید استفاده می‌کنید. برای این مثال، از Python استفاده خواهیم کرد، زیرا هم زبان و هم نحوه کار Extism با آن بسیار ساده است.

با پایتون در Visual Studio Code شروع کنید

در اینجا برنامه پایتونی است که ما برای کار با این افزونه استفاده می کنیم:


import extism

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

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

print(greet("Jeffrey"))

این را اجرا کنید و پاسخ را دریافت خواهید کرد: سلام جفری!

برای استفاده از افزونه خود، باید یک مانیفست ایجاد کنیم—یک فرهنگ لغت پایتون، در این case—که توضیح می‌دهد که کجا می‌توان افزونه را پیدا کرد (در اینجا، این افزونه در یک زیر شاخه پروژه به نام myplugin قرار دارد). مانیفست‌ها همچنین می‌توانند برای توصیف رفتارهای دیگر استفاده شوند، مانند مقدار حافظه که افزونه می‌تواند اختصاص دهد، یا از چه مسیرهایی روی دیسک مجاز است.

هنگامی که یک شی برای نمایش افزونه ایجاد می‌کنیم، می‌توانیم با استفاده از روش .call() آن را فراخوانی کنیم.

توجه داشته باشید که این مثال ساده فقط برای یک پلاگین از پیش تعیین شده کار می کند. اگر برنامه شما می‌خواهد افزونه‌های دلخواه را بپذیرد، باید رابط‌هایی را برای اتصال افزونه‌ها تعریف کند. سپس می‌تواند وجود افزونه‌ها را به‌طور خودکار کشف کند یا از نوعی ابرداده ارائه‌شده توسط کاربر استفاده کند.

نتیجه گیری

Extism، مانند خود WASM، نسبتاً جوان است و بهترین موارد استفاده از آن هنوز در حال تکامل است. Extism با داشتن موانع کم برای نوشتن افزونه های WASM و ایجاد برنامه هایی که از آنها استفاده می کنند، روشی مفید برای آزمایش WASM در خارج از مرورگر است. شما از اکتشافات و سود سهام دریافت خواهید کرد.