وب اسمبلی چیست
فهرست مطالب
وب اسمبلی چیست و کاربرد آن در دنیای طراحی وبسایت به چه صورت است.
این موضوعی است که در این مقاله قصد بررسی آن به صورت کامل را داریم.
وب اسمبلی یکی از مفاهیم نسبتا جدید دنیای وب می باشد که یک مکملی برای تسریع و بهبود روند طراحی سایت است.
پس تا پایان با ما همراه باشید تا به صورت کامل مفاهیم آن را شرح دهیم.
WebAssembly چیست ؟
خب قبل از هر چیزی اجازه دهید یک تعریف کلی را از وب اسمبلی داشته باشیم.
WebAssembly در سال 2017 به عنوان یک فرمت ساختار باینری برای یک virtual machine مبتنی بر پشته راه اندازی شد که برای اجرا در مرورگرهای وب مدرن توسعه یافته است ، تا اجرای کارآمد و نمایش فشرده کد را در پردازنده های مدرن از جمله در یک مرورگر وب ارائه دهد.
WebAssembly همچنین مستقل از زبان و پلتفرم است زیرا WebAssembly را می توان از زبان های دیگر کامپایل کرد و می تواند بر روی مرورگر (Web API) یا virtual machine اجرا شود.
دو دهه است که ما فقط یک زبان برنامه نویسی برای استفاده به صورت نیتیو در مرورگر وب داریم : بله درست حدس زدید ، جاوا اسکریپت .
مرگ آهسته پلاگین های باینری شخص ثالث ، زبان های دیگری مانند جاوا و Flash’s ActionScript را به عنوان زبان های درجه یک برای توسعه وب رد کرده است.
اما اکنون یک امکان جدید داریم : بله ، WebAssembly یا به اختصار Wasm for short یک فرمت باینری کوچک و سریع که طبق توضیحات بالا نوید عملکرد تقریباً نیتیو را برای برنامه های کاربردی وب می دهد.
بعلاوه، WebAssembly برای همه زبان ها طراحی شده است که جاوا اسکریپت تنها یکی از آنهاست.
با توجه به اینکه همه مرورگرهای اصلی اکنون از WebAssembly پشتیبانی می کنند ، زمان آن رسیده است که به طور جدی در مورد نوشتن برنامه های client-side apps برای وب که می توانند به عنوان WebAssembly کامپایل شوند، فکر کنیم.
شایان ذکر است که برنامه های WebAssembly قرار نیست جایگزین برنامه های جاوا اسکریپت شوند ؛ حداقل هنوز نه.
در عوض ، WebAssembly را به عنوان یک همراه جاوا اسکریپت در نظر بگیرید.
جایی که جاوا اسکریپت انعطاف پذیر است ، به صورت پویا تایپ می شود و از طریق سورس کد قابل خواندن توسط انسان ارائه می شود ، و WebAssembly با سرعت بالا، تایپ قوی، و از طریق یک فرمت باینری فشرده ارائه می شود.
توسعه دهندگان باید WebAssembly را برای موارد استفاده فشرده مانند بازی ها، پخش موسیقی، ویرایش ویدیو و برنامه های CAD در نظر بگیرند.
بسیاری از وب سرویس ها ، مانند Google Earth، قبلاً این حرکت را انجام داده اند.
از دیگر برنامه ها می توان به Figma اشاره کرد ؛ یک برنامه مشترک طراحی و نمودار که برای کاهش زمان بارگذاری و سرعت اجرا حتی زمانی که WebAssembly نسبتا جدید بود، به WebAssembly روی آورد.
به طور خلاصه مزایای اصلی استفاده از WebAssembly عبارتند از :
- عملکرد نزدیک به نیتو
- امنیت بالا
- اشکال زدایی آسان
- متن باز
- سخت افزار ، زبان و مستقل از پلتفرم
- سبک وزن
WebAssembly چگونه کار می کند ؟
WebAssembly که توسط W3C توسعه یافته است ، به قول سازندگان آن یک “هدف تلفیقی (compilation target)” است.
توسعه دهندگان ، WebAssembly را مستقیماً نمی نویسند.
آنها به زبان دلخواه خود می نویسند که سپس در بایت کد WebAssembly کامپایل می شود.
و در نهایت bytecode در سمت کلاینت اجرا می شود.
معمولاً در یک مرورگر وب ، جایی که به کد ماشین نیتیو ترجمه شده و با سرعت بالا اجرا می شود.
کد WebAssembly برای بارگذاری ، تجزیه و اجرا سریعتر از جاوا اسکریپت است.
هنگامی که WebAssembly توسط یک مرورگر وب استفاده می شود ، هزینه ی بهینه سازی بارگیری ماژول Wasm و راه اندازی آن وجود دارد.
برای پروژههای بزرگتر Wasm ، این ماژولها میتوانند تا چندین مگابایت اجرا شوند، بنابراین این تاخیرها میتوانند در سرعت لود قابل توجه باشند.
اما اگر همه این شرایط برابر باشد ، WebAssembly سریعتر اجرا می شود.
WebAssembly همچنین یک مدل اجرای sandboxed را بر اساس همان مدلهای امنیتی که اکنون برای جاوا اسکریپت وجود دارد، ارائه میکند.
برنامههای Wasm نمیتوانند مستقیماً به هیچ چیز خارج از سندباکس دسترسی داشته باشند، از جمله DOM web page که در آن اجرا میشوند.
هر گونه تعامل با بقیه دستگاه ها باید از ABI مانند رابط سیستم WebAssembly (WASI) استفاده کند.
WASI دسترسی کنترل شده ای به فایل ها، شبکه، ساعت سیستم و سایر سرویس های سیستمی که اغلب در برنامه ها مورد نیاز است را فراهم می کند.
در حال حاضر، اجرای WebAssembly در مرورگرهای وب رایج ترین مورد استفاده است، اما WebAssembly بیش از یک راه حل مبتنی بر وب در نظر گرفته شده است.
پروژه Wasmer برنامه های WebAssembly را در سمت سرور اجرا می کند، تقریباً به همان روشی که Node.js جاوا اسکریپت را به صورت ریل تایم ، خارج از مرورگر اجرا می کند.
با تمامی توضیحات بالا می توان گفت که به طور خلاصه ، پنج مرحله برای ایجاد پروژه با WebAssembly وجود دارد :
هسته Emscripten (کامپایلر مبتنی بر LLVM/Clang که سورس C و C++ را در WebAssembly کامپایل می کند) و زنجیره ابزار مورد نیاز را نصب کنید.
- کد خود را در C، C++ یا Rust ایجاد کنید.
- کد خود را با Emscripten در WebAssembly کامپایل کنید.
- کد WebAssembly کامپایل شده (via glue code) را به یک صفحه HTML تبدیل کنید.
- برنامه جدید خود را از طریق HTTP ارائه دهید.
هشت شی کلیدی WebAssembly
WebAssembly.Module : این شی حاوی کد WebAssembly stateless است که توسط مرورگر از قبل کامپایل شده است.
WebAssemly.Global : این شی یک نمونه متغیر سراسری را نشان می دهد که هم از جاوا اسکریپت و هم از طریق یک یا چند نمونه از WebAssembly.Module قابل importable/exportable است.
WebAssembly.Instance : این آبجکت یک نمونه stateful و قابل اجرا از WebAssembly.Module است.
WebAssembly.Memory : این شی یک ArrayBuffer یا SharedArrayBuffer منعطف است که raw bytes حافظه قابل دسترسی توسط WebAssembly.Instance را نگهداری می کند.
WebAssembly.Table : این شی یک پوشش جاوا اسکریپت است که ارجاعات تابع را ذخیره می کند.
WebAssembly.CompileError : این شیء در هنگام رمزگشایی یا اعتبار سنجی خطا را نشان می دهد.
WebAssembly.LinkError : این شیء خطا را در طول نمونه سازی ماژول نشان می دهد.
WebAssembly.RuntimeError : این شی خطایی است که وقتی WebAssembly یک تله را مشخص می کند ایجاد می شود.
کاربرد های WebAssembly
اساسی ترین کاربرد برای WebAssembly به عنوان هدفی برای نوشتن browser software است.
اجزایی که در WebAssembly کامپایل می شوند را می توان به هر یک از زبان ها نوشت.
سپس payload WebAssembly از طریق جاوا اسکریپت به سمت کلاینت داده می شود.
WebAssembly با تعدادی از کاربردهای مبتنی بر مرورگر با عملکرد فشرده طراحی شده است : بازی ها ، پخش موسیقی ، ویرایش ویدیو ، CAD ، رمزگذاری و تشخیص تصویر و …
به طور کلی تر، آموزنده است که هنگام تعیین کاربردهای WebAssembly روی این سه مورد تمرکز کنید :
کد با کارایی بالا که از قبل در یک زبان قابل هدف وجود دارد.
به عنوان مثال ، اگر یک تابع ریاضی با سرعت بالا قبلاً به زبان C نوشته شده است و میخواهید آن را در یک web application قرار دهید ، میتوانید آن را به عنوان یک ماژول WebAssembly اجرا کنید.
بخش هایی از برنامه که عملکرد کمتری دارند و رو به روی کاربر است ، می توانند در جاوا اسکریپت باقی بمانند.
کد با کارایی بالا که باید از ابتدا نوشته شود ، جایی که جاوا اسکریپت ایده آل نیست.
قبلاً ممکن بود کسی از asm.js برای نوشتن چنین کدی استفاده کند.
شما هنوز هم می توانید این کار را انجام دهید، اما WebAssembly به عنوان یک راه حل بلند مدت بهتر در نظر گرفته شده است.
انتقال یک برنامه دسکتاپ به یک محیط وب.
بسیاری از فناوری های asm.js و WebAssembly در این دسته قرار می گیرند.
WebAssembly می تواند بستری برای برنامه هایی فراهم کند که جاه طلبانه تر از GUI ارائه شده از طریق HTML هستند.
برای دو مثال، دموهای WebDSP و Windows 2000 را در مرورگر مشاهده کنید.
اگر یک برنامه جاوا اسکریپت موجود دارید که هیچ گونه pushing performance را تحت فشار قرار نمی دهد، بهتر است در این مرحله از توسعه WebAssembly را رها کنید.
اما اگر به آن برنامه نیاز دارید که سریعتر کار کند، WebAssembly ممکن است کمک کند.
پشتیبانی از زبان WebAssembly
WebAssembly قرار نیست مستقیماً نوشته شود.
همانطور که از نام آن پیداست ، بیشتر شبیه یک زبان اسمبلی است ، چیزی که ماشین باید مصرف کند تا یک زبان برنامه نویسی سطح بالا را تحویل دهد.
اکثر سناریوها برای کار با WebAssembly شامل نوشتن کد به زبان سطح بالا و تبدیل آن به WebAssembly است.
این کار را می توان به هر یک از سه روش اصلی انجام داد :
Direct compilation
ترنسلیت مستقیم سورس از طریق زنجیره ابزار کامپایلر خود زبان به WebAssembly ترجمه می شود.
Rust، C/C++، Kotlin/Native، و D اکنون همه راههایی برای انتشار Wasm از کامپایلرهایی که از آن زبانها دارند پشتیبانی میکنند.
Third-party tools
ابزارهای شخص ثالث این زبان در زنجیره ابزار خود از Wasm نیتیو پشتیبانی نمیکند ، اما میتوان از ابزار بخش ثالث برای تبدیل به Wasm استفاده کرد.
Java, Lua, و .زبان های Net همگی از پشتیبانی هایی مانند این برخوردار هستند.
WebAssembly-based interpreter
در اینجا، خود زبان به WebAssembly ترنسلیت نمی شود.
در عوض ، یک interpreter برای زبان ، که در WebAssembly نوشته شده است، کدهای نوشته شده در زبان را اجرا می کند.
این دست و پا گیرترین رویکرد است، زیرا interpreter ممکن است چندین مگابایت کد باشد، اما به کدهای موجود که در زبان نوشته شده است اجازه می دهد بدون تغییر اجرا شوند.
پایتون (برای مثال از طریق PyScript) و روبی هر دو دارای interpreter هایی هستند که به Wasm ترنسلیت شده اند.
ویژگی های WebAssembly
Garbage collection primitives
WebAssembly مستقیماً از زبان هایی که از مدل های garbage-collected memory استفاده می کنند پشتیبانی نمی کند.
زبانهایی مانند Lua یا Python را میتوان تنها با محدود کردن مجموعه فیچر ها یا با جاسازی کل زمان اجرا به عنوان یک فایل اجرایی WebAssembly پشتیبانی کرد.
اما کار در حال انجام است تا از مدلهای collected memory بدون در نظر گرفتن زبان یا اجرا پشتیبانی شود.
Threading
پشتیبانی نیتیو از Threading در زبان هایی مانند Rust و C++ رایج است.
عدم پشتیبانی از threading در WebAssembly به این معنی است که کل کلاس های نرم افزار هدفمند WebAssembly را نمی توان به آن زبان ها نوشت.
پیشنهاد اضافه کردن threading به WebAssembly از مدل ++threading C به عنوان یکی از الهامهای خود استفاده میکند.
Bulk memory operations and SIMD
Bulk memory operations and SIMD برای برنامه هایی ضروری است که در میان انبوهی از داده ها آسیب های بهینه سازی وارد می کنند و به شتاب اصلی CPU نیاز دارند ، مانند machine learning یا برنامه های علمی.
WebAssembly و گیم
هر سایتی را که در آن یک بازی یونیتی را اجرا می کند قطعا از WebAssembly استفاده می کند.
WebAssembly همچنین کاملاً قادر به ساخت برنامه های مبتنی بر وب برای پردازش کلمه ، صفحات گسترده ، اسلایدها ، ویرایش عکس/فیلم و موارد دیگر است.
و اگرچه WebAssembly ممکن است در حال حاضر پرکاربردترین فناوری نباشد ، اما روز به روز محبوبیت و کاربرد آن در حال افزایش است.
از سال 2020 ، اکثریت قریب به اتفاق استفاده از WebAssembly برای استخراج و بازی رمزنگاری استفاده می شد.
با این حال ، با توجه به ماهیت چگونگی تکامل برنامههای کاربردی وب و موبایل ، انتظار داریم WebAssembly به صورت تصاعدی در آینده نزدیک به کار گرفته شود.
منبع
مهرسا امینی
برنامه نویس ، انیماتور ، سئوکار
همه چیز در زمان خودش اتفاق می افتد ، پس صبور باشید.