Sorry, no posts matched your criteria.

این سایت در ستاد ساماندهی ثبت شده و تابع قوانین جمهوری اسلامی میباشد

چگونه با WebAssembly اپلیکیشن‎های باینری با عملکرد بالا را به مرورگر وارد کنیم

۲۰ خرداد ۱۳۹۷
بدون نظر

 WebAssembly یک فرمت باینری کوچک و سریع است که طراحی شده تا یک مفسر هدف برای سایر زبان‎ها باشد که جاوا اسکریپت تنها یکی از آن‌ها است. با پشتیبانی تمام مرورگرهای مطرح از WebAssembly حالا زمان آن رسیده تا به صورت جدی‎تری در مورد نوشتن اپلیکیشن‎های سمت کلاینت برای وب که می‎توانند از طریق WebAssembly کامپایل شوند، فکر کنید.
اما چطور این کار را انجام دهیم؟ WebAssembly برای مدتی طولانی از نزدیک با Emscripten گره خورده بود. کامپایلری که کدهای ++C/C را به زیر مجموعه جاوا اسکریپت asm.js تفسیر می‎کرد. اما بعدها نوشتن کد به زبان مورد نظر شما توسط کامپایل مستقیم به WebAssembly به مراتب ساده شد.
ذکر این نکته ضروری است که (حداقل تاکنون) اپلیکیشن‎های WebAssembly برای جایگزین شدن با اپلیکیشن‎های جاوا اسکریپت در نظر گرفته نشده‎اند. در عوض شما باید به WebAssembly به عنوان یک همراه جاوا اسکریپت نگاه کنید. در حالی که جاوا اسکریپت انعطاف‌پذیر، با انواع نوع داده پویا و به صورت کدهای منبع باز قابل فهم توسط انسان منتشر می‎شود، WebAssembly پرسرعت، با انواع نوع داده صریح و از طریق یک فرمت باینری مختصر و مفید ارائه می‎شود. WebAssembly در موارد استفاده نیازمند به عملکرد سریع مثل بازی، استریم موزیک، ویرایش ویدیو و اپلیکیشن‎های CAD کاربرد دارد.
در ادامه ما مراحلی را که شما برای به کارگیری اجزای WebAssembly در یک اپلیکیشن وب به آن نیاز دارید، بررسی خواهیم کرد. از آنجا که WebAssembly یک پروژه ناتمام است که هنوز به توسعه و تکمیل نیاز دارد، این مراحل کاملا به زبانی که شما استفاده می‎کنید وابسته است. اما در حال حاضر، این امکان وجود دارد که اپلیکیشن‎های وب اسمبلی را در اندازه کوچک نوشته و گسترش داد.

مطلب پیشنهادی

مهراب اکران

10 زبانی که برنامه‌نویسان علاقه دارند و 15 زبانی که بیزارند

تقابل علاقه و اجبار: بر اساس یافته‌های سایت استک‌اورفلو

موارد کاربرد 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 نیز ما با چالش مشابه‎ای روبرو هستیم. با استفاده از روش به کار گرفته شده در مورد جاوا اسکریپت (پشتیبانی نقشه منبع) می‎توان راهکاری برای آن پيدا کرد.


منبع : شبکه



مهراب