Wasmi 2.0 منتشر شد؛ ۲.۲ برابر سریعتر
خلاصهٔ کاملتر
Wasmi یه مفسر WebAssembly با Rust هست که تو دستگاههای IoT، سیستمهای پلاگین مثل Typst و Zellij، هاستهای ابری و قراردادهای هوشمند مثل Soroban استفاده میشه. نویسنده میگه بعد از هشت ماه کار، نسخهٔ 2.0 آمادهست و تمرکزش کامل روی سرعت اجرا بوده: حدود ۲.۲ برابر سریعتر از ۱.۰ تو میانگین هندسی مجموعهٔ wasmi-benchmarks روی Apple M2 Pro. کنارش فیچر validate اضافه شده که حجم باینری رو حسابی کم میکنه، بهعلاوهٔ fuel metering پایدار و پشتیبانی از پروفایل قطعی WebAssembly.
اولین تغییر بزرگ، حالتهای dispatch دستوره (یعنی روشی که مفسر از هندلر یه دستور میپره سراغ دستور بعدی). نسخهٔ ۲.۰ چهار حالت داره: direct-threaded که سریعترینه و اشارهگر تابع رو مستقیم تو IR جا میده، indirect-threaded که حدود ۱۰ تا ۱۵ درصد کندتره ولی حافظهٔ خیلی کمتری میخواد، switch-loop که همون روش قدیمی ۱.۰ بوده و برای پلتفرمهای بدون tail call میمونه، و call-loop که نویسنده اصلاً پیشنهادش نمیکنه. فیچر auto-dispatch هم خودش بهترین گزینهٔ ممکن رو برمیداره.
تغییر دوم، سه رجیستر انباره به اسم ireg، freg32 و freg64 هستن. تو ۱.۰ هر دستور باید عملوندهاش رو از اسلاتهای پشته decode و load میکرد و نتیجه رو برمیگردوند اونجا؛ حالا نتیجه مستقیم تو رجیستر سختافزاری میمونه و اون رفتوبرگشت حذف میشه:
fn i64_add(ip: Ip, sp: Sp, ireg: i64, ..) -> Done {
let rhs: i64 = decode_i64(ip);
ireg = ireg + rhs;
ip.offset(encode_size::<i64_add>);
next!(ip, ireg, ..)
}این طراحی یه هزینه هم داره: حالا دستور کپی لازمه تا مقدار رجیستر قبل از بازنویسی حفظ بشه، برای همین Wasmi 2.0 کپیهای بهینه برای ده لوکال اول و نسخههای ادغامشدهٔ add و load با local.set اضافه کرده. سومین تغییر هم دسترسی به آبجکتهای instance بوده: همهٔ handleها رفتن تو یه بلاک پیوستهٔ حافظه با ترتیب memories، globals، tables، funcs، elems و datas، پس هر دسترسی فقط یه offset ساده از اشارهگر instance فاصله داره.
نویسنده میگه با این تغییرها Wasmi 2.0 بدون اینکه بایتکدش رو به هر instance گره بزنه، به سطح کارایی Wasm3 و Stitch رسیده و همچنان بایتکد مشترک بین instanceهای یه ماژول باعث صرفهجویی جدی تو حافظه میشه. کش ویژهٔ (global 0) که تو ۱.۰ لازم بود هم دیگه معنی نداره. زمان startup هم با وجود تمرکز روی اجرا، تقریباً همسطح نسخهٔ قبل مونده.
نکات کلیدی:
- حدود ۲.۲ برابر سرعت بیشتر نسبت به Wasmi 1.0 روی Apple M2 Pro
- چهار حالت dispatch؛ indirect-threaded حدود ۱۰ تا ۱۵ درصد کندتر از direct-threaded ولی کمحافظهتر
- سه رجیستر انباره: ireg، freg32 و freg64
- ترتیب ثابت handleها: memories، globals، tables، funcs، elems، datas
- فیچر validate برای کم کردن حجم باینری و auto-dispatch برای انتخاب خودکار حالت
- راهنمای مهاجرت ۱.۰ به ۲.۰ کنار انتشار منتشر شده




