WebAssembly یک فرمت دستورالعمل باینری و ماشین مجازی است که عملکرد تقریباً بومی را برای برنامه های مرورگر وب به ارمغان می آورد و به توسعه دهندگان این امکان را می دهد که برنامه های وب پرسرعت را به زبان مورد نظر خود بسازند.
دو دهه است که ما فقط یک زبان برنامه نویسی برای استفاده به صورت بومی در مرورگر وب داریم: JavaScript. مرگ آهسته پلاگین های باینری شخص ثالث، زبان های دیگر مانند جاوا و اکشن اسکریپت فلش را به عنوان شهروندان درجه یک برای توسعه وب رد کرده است. سایر زبانهای وب، مانند CoffeeScript، صرفاً در جاوا اسکریپت کامپایل میشوند.
اما اکنون یک امکان جدید داریم: WebAssembly یا به اختصار Wasm. WebAssembly یک فرمت باینری کوچک و سریع است که نوید عملکرد تقریباً بومی را برای برنامه های کاربردی وب می دهد. بعلاوه، WebAssembly برای هر زبانی طراحی شده است که جاوا اسکریپت تنها یکی از آنهاست.
با توجه به اینکه همه مرورگرهای اصلی اکنون از WebAssembly پشتیبانی می کنند، زمان آن رسیده است که به طور جدی درباره نوشتن برنامه های سمت سرویس گیرنده برای وب که می توانند به عنوان WebAssembly کامپایل شوند، فکر کنید.
شایان ذکر است که برنامههای WebAssembly برای جایگزینی برنامههای جاوا اسکریپت نیستند — حداقل هنوز نه. در عوض، WebAssembly را به عنوان همراه جاوا اسکریپت در نظر بگیرید. در جایی که جاوا اسکریپت انعطاف پذیر است، به صورت پویا تایپ می شود و از طریق کد منبع قابل خواندن توسط انسان ارائه می شود، WebAssembly با سرعت بالا، تایپ قوی، و از طریق یک قالب باینری فشرده ارائه می شود.
توسعهدهندگان باید WebAssembly را برای موارد استفاده فشرده مانند بازیها، پخش موسیقی، ویرایش ویدیو و برنامههای CAD در نظر بگیرند. بسیاری از سرویسهای وب قبلاً این حرکت را انجام دادهاند، مانند Google Earth. Figma، یک برنامه مشترک طراحی و نمودار، به WebAssembly تبدیل شد تا زمان بارگذاری و سرعت اجرا را کاهش دهد حتی زمانی که WebAssembly نسبتاً جدید بود.
نحوه عملکرد WebAssembly
WebAssembly که توسط W3C توسعه یافته است، به قول سازندگان آن یک “هدف تلفیقی” است. توسعه دهندگان WebAssembly را مستقیماً نمی نویسند. آنها به زبان دلخواه خود می نویسند که سپس در بایت کد WebAssembly کامپایل می شود. سپس بایت کد روی کلاینت اجرا می شود – معمولاً در یک مرورگر وب – جایی که به کد ماشین اصلی ترجمه شده و با سرعت بالا اجرا می شود.
کد WebAssembly برای بارگیری، تجزیه و اجرا سریعتر از جاوا اسکریپت است. هنگامی که WebAssembly توسط یک مرورگر وب استفاده می شود، هنوز هزینه بارگیری ماژول Wasm و راه اندازی آن وجود دارد. برای پروژههای بزرگتر Wasm، این ماژولها میتوانند تا چندین مگابایت اجرا شوند، بنابراین این تاخیرها میتوانند قابل توجه باشند. اما اگر همه چیز برابر باشد، WebAssembly سریعتر اجرا می شود.
WebAssembly همچنین یک مدل اجرای سندباکس را بر اساس همان مدلهای امنیتی که اکنون برای جاوا اسکریپت وجود دارد، ارائه میکند. برنامههای Wasm نمیتوانند مستقیماً به هیچ چیز خارج از سندباکس دسترسی داشته باشند، از جمله DOM صفحه وب که در آن اجرا میشوند. هر گونه تعامل با بقیه دستگاه باید از ABI مانند رابط سیستم WebAssembly (WASI) استفاده کند. WASI دسترسی کنترلشدهای به فایلها، شبکه، ساعت سیستم و سایر سرویسهای سیستمی که اغلب در برنامهها مورد نیاز هستند را فراهم میکند.
در حال حاضر، اجرای WebAssembly در مرورگرهای وب رایج ترین مورد استفاده است، اما WebAssembly بیش از یک راه حل مبتنی بر وب در نظر گرفته شده است. پروژه Wasmer برنامههای WebAssembly را در سمت سرور اجرا میکند، تقریباً به همان روشی که Node.js جاوا اسکریپت را خارج از مرورگر اجرا میکند.
مورد استفاده از WebAssembly
اصلی ترین مورد استفاده برای WebAssembly به عنوان هدفی برای نوشتن نرم افزار در مرورگر است. اجزایی که در WebAssembly کامپایل می شوند را می توان به هر یک از تعدادی از زبان ها نوشت. سپس بار نهایی WebAssembly از طریق جاوا اسکریپت به مشتری تحویل داده می شود.
WebAssembly با تعدادی مورد استفاده مبتنی بر مرورگر با عملکرد فشرده طراحی شده است. در ذهن: بازیها، پخش موسیقی، ویرایش ویدیو، CAD، رمزگذاری، و تشخیص تصویر، فقط چند مورد را نام میبریم.
به طور کلی تر، آموزنده است که هنگام تعیین مورد استفاده خاص WebAssembly خود بر روی این سه زمینه تمرکز کنید:
- کد با کارایی بالا که از قبل در یک زبان قابل هدف وجود دارد. به عنوان مثال، اگر یک تابع ریاضی با سرعت بالا قبلاً در C نوشته شده است و میخواهید آن را در یک برنامه وب قرار دهید، می توانید آن را به عنوان یک ماژول WebAssembly مستقر کنید. بخشهایی که عملکرد کمتری دارند و رو به روی کاربر است، میتوانند در جاوا اسکریپت باقی بمانند.
- کدهای با کارایی بالا که باید از ابتدا نوشته شود، جایی که جاوا اسکریپت ایدهآل نیست. قبلاً ممکن بود از asm.js. هنوز هم می توانید این کار را انجام دهید، اما WebAssembly به عنوان راه حل بلندمدت بهتری در نظر گرفته شده است.
- انتقال یک برنامه دسکتاپ به یک محیط وب. بسیاری از دموهای فناوری برای asm.js و WebAssembly در این دسته قرار می گیرند. WebAssembly می تواند بستری برای برنامه هایی فراهم کند که جاه طلبانه تر از GUI ارائه شده از طریق HTML هستند. دموهای WebDSP و Windows 2000 در مرورگر، برای دو مثال.
اگر یک برنامه جاوا اسکریپت موجود دارید که هیچ پاکت عملکردی را تحت فشار قرار نمی دهد، بهتر است در این مرحله از توسعه WebAssembly تنها بگذارید. اما اگر به آن برنامه نیاز دارید که سریعتر کار کند، WebAssembly ممکن است کمک کند.
پشتیبانی از زبان WebAssembly
WebAssembly قرار نیست مستقیماً نوشته شود. همانطور که از نام آن پیداست، بیشتر شبیه یک زبان اسمبلی است، چیزی که ماشین باید مصرف کند تا یک زبان برنامه نویسی سطح بالا و انسان پسند. WebAssembly به بازنمایی میانی (IR) تولید شده توسط زیرساخت کامپایلر زبان LLVM نزدیک تر است تا مانند C یا جاوا.
بنابراین اکثر سناریوها برای کار با WebAssembly شامل نوشتن کد به زبان سطح بالا و تبدیل آن است. به WebAssembly. این را می توان به هر یک از سه روش اصلی انجام داد:
- تلفیقی مستقیم. منبع از طریق زنجیره ابزار کامپایلر خود زبان به WebAssembly ترجمه شده است. Rust، C/C++، Kotlin/Native، و D اکنون همه راههایی برای انتشار Wasm از کامپایلرهایی دارند که از آن زبانها پشتیبانی میکنند.
- ابزارهای شخص ثالث. این زبان در زنجیره ابزار خود از Wasm بومی پشتیبانی نمیکند، اما میتوان از ابزار بخش سوم برای تبدیل به Wasm استفاده کرد. جاوا، لوا، و خانواده زبان .Net همگی دارای پشتیبانی هایی مانند این هستند.
- مترجم مبتنی بر WebAssembly. در اینجا، خود زبان به WebAssembly ترجمه نمیشود. در عوض، یک مترجم برای زبان، که در WebAssembly نوشته شده است، کدهای نوشته شده در زبان را اجرا می کند. این دست و پا گیرترین رویکرد است، زیرا مفسر ممکن است چندین مگابایت کد باشد، اما به کدهای موجود که در زبان نوشته شده است اجازه می دهد همه به جز بدون تغییر اجرا شوند. Python (برای مثال از طریق PyScript) و Ruby هر دو دارای مفسرهایی هستند که به Wasm ترجمه شدهاند.
ویژگی های WebAssembly
WebAssembly هنوز در مراحل اولیه است. زنجیره ابزار WebAssembly و پیاده سازی آن به اثبات مفهوم نزدیک تر از فناوری تولید است. با این اوصاف، متولیان WebAssembly به دنبال مفیدتر کردن WebAssembly از طریق یک سری اقدامات هستند:
مجموعه اولیه زباله
WebAssembly مستقیماً از زبانهایی که از مدلهای حافظه جمعآوریشده استفاده میکنند پشتیبانی نمیکند. زبان هایی مانند Lua یا Python را می توان تنها با محدود کردن مجموعه ویژگی ها یا با جاسازی کل زمان اجرا به عنوان یک فایل اجرایی WebAssembly پشتیبانی کرد. اما کار برای پشتیبانی از مدلهای حافظه جمعآوریشده بدون توجه به زبان یا اجرا در دست انجام است. .
نخ زدن
پشتیبانی بومی برای threading در زبان هایی مانند Rust و C++ رایج است. عدم پشتیبانی از رشته در WebAssembly به این معنی است که کل کلاس های نرم افزار هدفمند WebAssembly را نمی توان به آن زبان ها نوشت. پیشنهاد اضافه کردن رشته به WebAssembly از مدل رشتهبندی C++ به عنوان یکی از الهامهای خود استفاده میکند.< /p>
عملیات حافظه انبوه و SIMD
عملیات حافظه انبوه و SIMD (دستورالعمل منفرد، داده های متعدد) موازی سازی برای برنامه هایی ضروری است که در میان انبوهی از داده ها خرد می شوند و برای جلوگیری از خفگی به شتاب اصلی CPU نیاز دارند. مانند یادگیری ماشینی یا برنامه های علمی. پیشنهادهایی برای افزودن این قابلیت ها به WebAssembly از طریق اپراتورهای جدید روی میز است.
ساختارهای زبان سطح بالا
بسیاری از ویژگیهای دیگر در نظر گرفته شده برای WebAssembly به طور مستقیم به ساختارهای سطح بالا در زبانهای دیگر نگاشت میشوند.
- استثناها را می توان در WebAssembly تقلید کرد، اما نمی توان به صورت بومی از طریق مجموعه دستورالعمل WebAssembly پیاده سازی شود. طرح پیشنهادی برای استثناها شامل موارد اولیه استثنایی سازگار با مدل استثنای C++ است که به نوبه خود میتواند توسط زبانهای دیگر کامپایلشده در WebAssembly استفاده شود.
- انواع مرجع عبور دادن اشیایی که به عنوان ارجاع به محیط میزبان استفاده می شوند را آسان تر کنید. این امر جمع آوری زباله و تعدادی از عملکردهای سطح بالا دیگر را برای پیاده سازی در WebAssembly آسان تر می کند.
- Tail calls، یک الگوی طراحی که در بسیاری از موارد استفاده می شود زبان ها.
- توابعی که چندین مقدار را برمی گرداند، به عنوان مثال، از طریق تاپل ها در پایتون یا سی شارپ.
- اپراتورهای پسوند علامت، یک ابزار مفید کم عملیات ریاضی سطح (LLVM از این موارد نیز پشتیبانی می کند.)
ابزارهای اشکال زدایی و پروفایل
یکی از بزرگترین مشکلات جاوا اسکریپت ترجمهشده، مشکل اشکالزدایی و نمایهسازی بود، به دلیل ناتوانی در ارتباط بین کد ترجمه شده و منبع. با WebAssembly، ما مشکل مشابهی داریم، و به روشی مشابه (پشتیبانی از نقشه منبع) رسیدگی می شود. به یادداشت پروژه در مورد پشتیبانی ابزار برنامه ریزی شده مراجعه کنید.
پست های مرتبط
WebAssembly چیست؟ پلتفرم وب نسل بعدی توضیح داد
WebAssembly چیست؟ پلتفرم وب نسل بعدی توضیح داد
WebAssembly چیست؟ پلتفرم وب نسل بعدی توضیح داد