در دنیای WebAssembly (Wasm)، خبری بزرگ رخ داده است: گروههای استانداردسازی W3C و Wasm سخت تلاش کردهاند و نسخه بعدی این استاندارد آماده انتشار است – خوش آمدید به Wasm 3.0. این نسخه به عنوان استاندارد زنده طراحی شده و در مرورگرهای اصلی پشتیبانی میشود. این تغییرات عواقب عمیقی برای پلتفرمهای توسعه برنامهها دارد. بسیاری از مزایای Wasm 3.0 هنوز فرضی هستند و به پذیرش و بهرهبرداری .NET از این ویژگیها بستگی دارند، اما بیایید برخی از برجستهترین آنها را بررسی کنیم.
.NET مدرن قدرتمند، منبعباز، کراسپلتفرم و پذیرای همه است، با ابزارهای بالغ و اکوسیستم غنی. اگرچه .NET دامنه گستردهای از پلتفرمها را پوشش میدهد، اما مرورگرهای وب همیشه چالشبرانگیز بودهاند. برنامههای وب مدرن شایسته اجرای کاملاً مستقل و سمتکلاینت با تجربیات کاربری غنی هستند. بهترین راهحل WebAssembly است – استانداردی باز که اجرای کد با عملکرد نزدیک به نیتیو را در مرورگرهای مدرن امکانپذیر میکند.
WebAssembly (Wasm) زبانی سطح پایین شبیه به اسمبلی است با فرمت باینری فشرده که با عملکرد نزدیک به نیتیو در مرورگرهای مدرن اجرا میشود. Wasm راهی برای کامپایل زبانهای سطح بالاتر به باینریهایی است که روی وب اجرا شوند. همچنین، Wasm برای کار در کنار جاوااسکریپت طراحی شده و اجازه میدهد هر دو در مرورگرهای امروزی با هم کار کنند.
حافظه 64-بیتی
تخصیص حافظه برای برنامههای Wasm از 32-بیتی به اختیاری 64-بیتی افزایش یافته است. این تغییر فضای آدرسدهی موجود برای Wasm را از 4 گیگابایت به حدی که سختافزار فیزیکی اجازه میدهد، افزایش میدهد. اگرچه مرورگرهای وب ممکن است هنوز محدودیتهایی داشته باشند، اما افزایش footprint حافظه برای برنامههای Wasm امکانات زیادی را باز میکند.
مزایا:
- UI و UX غنیتر برای برنامههای Wasm داخل یا خارج مرورگرها
- دسترسی برنامهها به footprint حافظه در-memory بزرگتر
- امکان میزبانی برنامههای سازمانی بزرگتر کاملاً در مرورگر
- بارگذاری سریعتر برنامه و عملکرد بهبودیافته با پردازش حافظه سریعتر
علاوه بر این (برای غنیسازی بحث)، Wasm 3.0 از چندین حافظه (multiple memories) پشتیبانی میکند، که اجازه میدهد ماژولهای Wasm چندین بلوک حافظه مستقل داشته باشند. این ویژگی برای برنامههای پیچیده .NET مفید است، زیرا مدیریت حافظه را انعطافپذیرتر میکند و میتواند عملکرد را در سناریوهای چندرشتهای بهبود بخشد.
Built-inهای رشته جاوااسکریپت
رانتایمهای جاوااسکریپت مجموعه غنی از اشیاء و پرمیتهای built-in دارند. زبانهایی که WebAssembly را هدف قرار میدهند، ممکن است پرمیتهای سازگار داشته باشند و از استفاده از معادلهای جاوااسکریپتی برای پیادهسازی خود سود ببرند. مورد استفاده فوری برای زبانهایی مانند C# جلوگیری از کپی بایت بیش از حد از رشتههای JS به رشتههای .NET است – Wasm 3.0 اکنون این را امکانپذیر میکند.
مزایا:
- اینتراپ آسان رشتههای JS با رشتههای .NET
- اینتراپ سریعتر بدون کپی رشتههای زیاد
- اجتناب از واردات مکانیسم “glue” برای پرمیتهای بزرگ مانند String
جمعآوری زباله (Garbage Collection)
Wasm 3.0 مدیریت حافظه پیشرفتهتری میآورد – اکنون پشتیبانی از فرم جدیدی از ذخیرهسازی وجود دارد که به طور خودکار توسط رانتایم Wasm از طریق Garbage Collector (GC) مدیریت میشود. زبانهای برنامهنویسی سطح بالاتر میتوانند layout حافظه مورد نیاز برای ساختارهای داده رانتایم را اعلام کنند، که تخصیص و طول عمر آنها سپس توسط Wasm مدیریت میشود. توسط طراحی، هیچ سیستم اشیاء built-in یا سازههای سطح بالاتر وجود ندارد؛ در عوض، رانتایم Wasm فقط بلوکهای پایه برای نمایندگی حافظه و پاکسازی بعدی فراهم میکند. باید توجه داشت که پشتیبانی WasmGC در .NET بعید است به زودی اتفاق بیفتد – برخی قطعات کلیدی که semantics .NET نیاز دارد، هنوز پیادهسازی نشدهاند و کار ادامه دارد.
مزایا:
- هیدراته/دیهیدراته آسانتر سازههای حافظه استفادهشده در برنامههای Wasm
- بدون نشت حافظه با GC built-in
- تخصیص/بازپسگیری مدیریتشده سازههای حافظه رانتایم
برای غنیسازی، تیم .NET در سال 2023 اعلام کرد که استفاده از پیشنهاد GC WebAssembly برای .NET در آن زمان ممکن نیست، اما علاقهمند به مشارکت در برنامههای پس از MVP هستند. با استانداردسازی MVP، کار آینده ممکن است .NET را قادر به استفاده از garbage collector مرورگر کند.
ارجاعهای نوعی (Typed References)
سیستم نوع Wasm اکنون فرمهای غنیتری از ارجاعها را پشتیبانی میکند – انواع ارجاع اکنون میتوانند شکل دقیق مقدار heap ارجاعشده را توصیف کنند، و از چکهای رانتایم اضافی برای اطمینان از ایمنی اجتناب کنند. این مکانیسم تایپینگ expressiveتر برای زبانهای برنامهنویسی سطح بالاتر برای ارجاعهای تابع امن در دسترس خواهد بود، بنابراین چکهای نوع یا مرز رانتایم را کاهش میدهد. با .NET که قبلاً از ارجاعهای تایپشده در Wasm استفاده میکند، این عمدتاً اینتراپ آسانتر با زبانهای دیگر را امکانپذیر میکند.
مزایا:
- C# میتواند mapping غنیتری به ارجاعهای تایپشده Wasm داشته باشد و اینتراپ بهتری با زبانهای دیگر
- برنامههای Wasm میتوانند حالت را بهتر با مدیریت شیء type-safe مدیریت کنند
- اجرای سریعتر کد Wasm توسط مرورگرها
مدیریت استثناء (Exception Handling)
دیباگینگ برنامههای Wasm با Wasm 3.0 بهتر میشود، زیرا پشتیبانی از مدیریت استثناء native را میآورد – Wasm اکنون میتواند استثناها را به طور robust در زنجیره bubble کند، و راه را برای دیباگینگ روانتر هموار میکند. با .NET که از مدیریت استثناء Wasm از .NET 8 استفاده میکند، توسعهدهندگان میتوانند انتظار عملکرد streamlinedتر و تجربیات دیباگینگ ادامهدار داشته باشند.
مزایا:
- دیباگینگ آسانتر کد C# هنگام اجرا در Wasm
- عملکرد رانتایم بهتر و مدیریت مدیریت استثناء در مرزها
- نقاط پرش و بازیابی واضحتر هنگام رخ دادن استثناها
ویژگیهای اضافی Wasm 3.0 برای توسعهدهندگان .NET
- Tail Calls: Wasm 3.0 از tail calls پشتیبانی میکند، که بهینهسازی فراخوانیهای تابع را اجازه میدهد بدون افزایش stack. این برای زبانهایی مانند C# که از recursion یا الگوهای تابعی استفاده میکنند، مفید است و میتواند عملکرد را در برنامههای پیچیده بهبود بخشد.
- پشتیبانی از SIMD: استاندارد Wasm 3.0 پیشرفتهایی در SIMD (Single Instruction, Multiple Data) دارد که عملیات vectorized را سریعتر میکند. برای برنامههای .NET که پردازش دادههای سنگین مانند تصویر یا محاسبات علمی دارند، این میتواند عملکرد را 5-20 برابر افزایش دهد.
- پیشرفتهای .NET 10 برای WebAssembly: در .NET 10 (که در سال 2025 منتشر شد)، بهبودهای عملکردی برای WebAssembly وجود دارد، از جمله بهینهسازی تحویل assets، پیشبارگذاری منابع و bootstrap رانتایم. این تغییرات اندازه فایلها را کاهش داده و زمان بارگذاری را سریعتر میکند، که برای برنامههای Blazor WebAssembly مفید است.
- Blazor به عنوان جایگزین: علاوه بر Uno، Blazor (فریمورک وب .NET مایکروسافت) از WebAssembly برای اجرای کد C# در مرورگر استفاده میکند. با Wasm 3.0، Blazor میتواند از ویژگیهایی مانند WasmGC، SIMD و threads (هرچند threads در .NET 10 بعید است) برای بستن شکاف عملکرد با جاوااسکریپت استفاده کند. Blazor اکوسیستم کامل .NET را حفظ میکند و برای توسعهدهندگان .NET آشنا است.
- پشتیبانی آزمایشی WASI در .NET: .NET پشتیبانی آزمایشی از WebAssembly System Interface (WASI) دارد. بسته NuGet ‘componentize-dotnet’ اجازه میدهد توسعهدهندگان C# کامپوننتهای WASI از کد خود تولید کنند، که راهی جایگزین برای کار با WASI خارج از مرورگر فراهم میکند.
نتیجهگیری
Wasm 3.0 دریچهای جدید به روی توسعهدهندگان .NET باز میکند و امکان ساخت برنامههای وب قدرتمند، کارآمد و کراسپلتفرم را فراهم میکند. با ویژگیهایی مانند حافظه 64-بیتی، GC، و مدیریت استثناء، همراه با ابزارهایی مانند Uno Platform و Blazor، آینده روشن است. با این حال، برخی ویژگیها مانند GC کامل در .NET هنوز در حال توسعه هستند.