WebAssembly یک فرمت باینری کوچک و سریع است که طراحی شده تا یک مفسر هدف برای سایر زبانها باشد که جاوا اسکریپت تنها یکی از آنها است. با پشتیبانی تمام مرورگرهای مطرح از WebAssembly حالا زمان آن رسیده تا به صورت جدیتری در مورد نوشتن اپلیکیشنهای سمت کلاینت برای وب که میتوانند از طریق WebAssembly کامپایل شوند، فکر کنید.
اما چطور این کار را انجام دهیم؟ WebAssembly برای مدتی طولانی از نزدیک با Emscripten گره خورده بود. کامپایلری که کدهای ++C/C را به زیر مجموعه جاوا اسکریپت asm.js تفسیر میکرد. اما بعدها نوشتن کد به زبان مورد نظر شما توسط کامپایل مستقیم به WebAssembly به مراتب ساده شد.
ذکر این نکته ضروری است که (حداقل تاکنون) اپلیکیشنهای WebAssembly برای جایگزین شدن با اپلیکیشنهای جاوا اسکریپت در نظر گرفته نشدهاند. در عوض شما باید به WebAssembly به عنوان یک همراه جاوا اسکریپت نگاه کنید. در حالی که جاوا اسکریپت انعطافپذیر، با انواع نوع داده پویا و به صورت کدهای منبع باز قابل فهم توسط انسان منتشر میشود، WebAssembly پرسرعت، با انواع نوع داده صریح و از طریق یک فرمت باینری مختصر و مفید ارائه میشود. WebAssembly در موارد استفاده نیازمند به عملکرد سریع مثل بازی، استریم موزیک، ویرایش ویدیو و اپلیکیشنهای CAD کاربرد دارد.
در ادامه ما مراحلی را که شما برای به کارگیری اجزای WebAssembly در یک اپلیکیشن وب به آن نیاز دارید، بررسی خواهیم کرد. از آنجا که WebAssembly یک پروژه ناتمام است که هنوز به توسعه و تکمیل نیاز دارد، این مراحل کاملا به زبانی که شما استفاده میکنید وابسته است. اما در حال حاضر، این امکان وجود دارد که اپلیکیشنهای وب اسمبلی را در اندازه کوچک نوشته و گسترش داد.
موارد کاربرد WebAssembly
اصلیترین مورد استفاده از وب اسمبلی به عنوان یک هدف برای نوشتن نرمافزارهای درون مرورگر است که از زبانی غیر از جاوااسکریپت استفاده میکند. WebAssembly برای موارد استفاده مبتنی بر مرورگر که عملکرد بالایی نیاز دارد طراحی شده است. کاربردهایی مثل بازی، استریم موسیقی، تدوین ویدیو، CAD، کدگذاری، تشخیص تصویر و مواردی شبیه به این.
به طور کلی، هنگام تعیین مورد خاص استفاده تمرکز روی این سه حوزه کمککننده است:
• کدهایی با عملکرد بالا که از قبل در یک زبان هدف موجود بوده است. برای نمونه، اگر شما یک تابع ریاضی پر سرعت را در اختیار دارید که قبلا به زبان C نوشته شده و میخواهید آن را در یک اپلیکیشن وب به کار بگیرید، میتوانید آن را به عنوان یک ماژول WebAssembly اجرا شده از طریق جاوا اسکریپت به کار بگیرید. سایر بخشهای این اپلیکیشن را که به توان عملیاتی بالایی نیاز ندارد میتوان به صورت جاوا اسکریپت باقی نگه داشت.
• کدهایی با عملکرد بالا که از ابتدا به نوشتن نیاز دارند و جاوا اسکریپت برای این منظور ایدهال نیست. قبلا ممکن بود از asm.js برای نوشتن چنین کدهایی استفاده شود. شما هنوز هم میتوانید چنین کاری انجام دهید اما WebAssembly به عنوان یک راهکار بلند مدت بهتر عمل میکند.
• انتقال اپلیکیشنهای دسکتاپ به محیط وب. بخش عمدهای از موارد استفاده از این فناوری برای asm.js و WebAssembly در همین رابطه است. وب اسمبلی میتواند زیرساختی برای اپلیکیشنهایی فراهم کند که بلندپروازانهتر از صرفا یک رابط گرافیکی HTML هستند.
اگر یک اپلیکیشن جاوا اسکریپت آماده دارید که مشكل عمدهای برای اجرا و وضعیت عملکرد ندارد، در این شرایط نیازی به توسعه WebAssembly نخواهید داشت. اما اگر میخواهید این اپلیکیشن سریعتر اجرا شود، WebAssembly میتواند کمککننده باشد.
زبانهای پشتیبانی شده توسط WebAssembly
گام بعدی برای اجرای یک اپلیکیشن WebAssembly انتخاب زبانی است که در نهایت میتواند به WebAssembly کامپایل شود. به احتمال زیاد حداقل یکی از زبانهای اصلی که شما در تولیدات نرمافزاری خود از آنها استفاده میکنید یک کامپایلر را که میتواند به WebAssembly تبدیل شود، خواهد داشت. در ادامه با اصلیترین آنها آشنا خواهید شد:
• C: بدون تردید متداولترین روش انجام آن از طریق Emscripten است، زیرا C به Emscripten – به – WebAssembly اولین زنجيره ابزار WebAssembly بود که معرفی شد. بعد از آن ابزارهای دیگری نیز ارائه شد. یک کامپایلر کامل به نام Cheerp به طور خاص برای تولید اپلیکیشنهای WebAssembly از کدهای C/C++ تدارک دیده شده است. این کامپایلر را میتوان برای جاوا اسکریپت، asm.js یا ترکیبی از همه آنها نیز به کار برد.
• Rust: زبان برنامهنویسی سیستم موزيلا به گونهای طراحی شده تا سریع و امن باشد. این زبان یکی از کاندیداهای اصلی برای پشتیبانی WebAssembly است. افزونههای زنجيره ابزار Rust این امکان را در اختیار شما قرار میدهد تا مستقیما کدهای Rust را به WebAssembly کامپایل کنید. شما برای انجام این کار باید از زنجيره ابزار nightly استفاده کنید.
• TypeScript: به طور پیش فرض تایپ اسکریپت به جاوااسکریپت کامپایل میشود، این به این معنا است که میتوان آن را به WebAssembly نیز کامپایل کرد. پروژه AssemblyScript مراحل انجام این کار را کوتاهتر کرده و اجازه میدهد تایپ اسکریپت را مستقیما به WebAssembly کامپایل کنید.
چند زبان اصلی دیگر نیز هستند که در حال آمادهسازی برای پشتیبانی از WebAssembly هستند، اما هنوز مراحل ابتدایی آن را سپری میکنند. از این زبانها نیز میتوان استفاده کرد اما نسبت به C, Rust و TypeScript با محدودیتهای بیشتری مواجه هستند.
• Java: جاوا بایتکد را از طریق پروژه TeaVM میتوان برای کامپایل به WebAssembly استفاده کرد. به این معنا که هر زبانی را که با جاوابایتکد سازگار است میتوان به WebAssembly کامپایل کرد. اما خیلی از APIهای جاوا که نمیتوانند به طور موثری در WebAssembly اجرا شوند، منع شدهاند. بنابراین TeaVM (و به طبع آن WebAssembly) تنها برای زیرمجموعه اپلیکیشنهای مبتنی بر JVM قابل استفاده هستند.
• Lua: زبان اسکریپتنویسی لوا نیز مثل جاوا اسکریپت در موارد استفاده به عنوان یک زبان الحاقی سابقه طولانی دارد. اما تنها پروژهای که میتواند به عنوان یک افزونه داخل مرورگر لوا را به WebAssembly تبدیل کند wasm_lua است که یک نسخه از لوا را به مرورگر اضافه میکند. Luwa JIT نیز لوا را به WebAssembly کامپایل میکند.
• Kotlin/Native: علاقمندان به زبان Kotlin مشتاقانه منتظر یک نسخه کامل از Kotlin/Native بودهاند که یک LLVM سمت سرور برای کامپایلر Kotlin است و میتواند فایلهای باینری تولید کند. نسخه Kotlin/Native 0.4 از WebAssembly به عنوان یک مفسر هدف پشتیبانی میکند.
• Net: زبانی است که هنوز نمیتواند به طور موثر از WebAssembly پشتیبانی کند، اما قدمهایی در این زمینه برداشته شده است. به عنوان نمونه از Blazor میتوان برای ساخت اپلیکیشنهای وب تکصفحه در .Net از طریق C# و فرامین Razor مایکروسافت استفاده کرد.
• سایر زبانهای قدرت گرفته از.LLVM : از لحاظ نظری هر زبانی که از چهارچوب کامپایلر LLVM نیرو میگیرد میتواند به WebAssembly کامپایل شود، زیرا LLVM از WebAssembly به عنوان یکی از چندین هدف خود پشتیبانی میکند. اما لزوما این به معنای آن نیست که هر زبان کامپایل شده LLVM به عنوان WebAssembly نیز اجرا خواهد شد. LLVM تنها میتواند راه رسیدن به WebAssembly را هموارتر کند.
مثالهای WebAssembly
مرحله بعدی کار نوشتن کد با زبان انتخابی شما است، با در نظر گرفتن این شرایط که این کد چگونه قرار است با محیط WebAssembly ارتباط برقرار کرده و سپس با یک اپلیکیشن جاوا اسکریپت ادغام شود.
این ادغام با استفاده از آبجکت WebAssembly در جاوا اسکریپت برای برقراری یک راه ارتباطی به کد WebAssembly شما انجام میشود. در سایت Mozilla راهنمای انجام این کار آورده شده است.
اگر میخواهید از WebAssembly به طور مستقیم در سمت مرورگر استفاده کنید باید از یک زبان به همراه یک زنجيره ابزار که از این قابلیت پشتیبانی میکند، استفاده کنید. برای نمونه، Cheerp به برنامه نویسان ++C امکان میدهد تا از طریق یک فضای نام اختصاصی با APIهای مرورگر ارتباط برقرار کند.
ویژگیهای WebAssembly
WebAssembly هنوز مراحل اولیه توسعه خود را سپری میکند، بنابراین زنجيره ابزار و اجرای آن هنوز به امکان سنجی و تایید وابسته است. این به این معنا است که متولیان WebAssembly قصد دارند با یک سری از ابتکارات مزایای WebAssembly را افزایش دهند:
بازیافت حافظه
WebAssembly مستقیما از زبانهایی که از مدلهای بازیافت حافظه یا زباله روبی استفاده میکنند، پشتیبانی نمیکند. از زبانهایی مثل لوا و پایتون تنها با مجموعه ویژگیهای محدود یا با الحاق کل چرخه اجرا به عنوان فایل اجرایی WebAssembly پشتیبانی میشود. پشتیبانی از مدلهای بازیافت حافظه صرف نظر از زبان قابلیتی است که هنوز مراحل ابتدایی خود را پشت سر میگذارد.
Threading
پشتیبانی ذاتی از Threading در زبانهایی مثل Rust یا C/C++ رایج است. فقدان پشتیبانی از Threading در WebAssembly به این معنا است که در چنین زبانهایی نمیتوان از تمام کلاسهای نرمافزار استفاده کرد. روش پیشنهادی برای اضافه کردن Threading به WebAssembly استفاده از مدل Threading زبان C++ است.
عملیات حافظه انبوه و SIMD
همسانی عملیات حافظه انبوه و SIMD (یک دستورالعمل، چندین داده) از ضروریات هر اپلیکیشنی (مثل یادگیری ماشین یا اپلیکیشنهای علمی) است که از طریق جریان داده و شتاب پردازنده مرکزی از کمبود منابع جلوگیری میکند. پیشنهاداتی برای اضافه کردن این نوع از قابلیتها به WebAssembly از طریق عملگرهای جدید ارائه شده است.
ابزار دیباگ کردن و نمایه سازی
به دلیل ناتوانی در ارتباط بین کد ترجمه شده و منبع، یکی از بزرگترین چالشها با جاوا اسکریپت انتقال داده شده سخت شدن دیباگ و نمایه سازی است. با WebAssembly نیز ما با چالش مشابهای روبرو هستیم. با استفاده از روش به کار گرفته شده در مورد جاوا اسکریپت (پشتیبانی نقشه منبع) میتوان راهکاری برای آن پيدا کرد.
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟