پروپوزال Structs جاوااسکریپت رو همین الان امتحان کن
خلاصهٔ کاملتر
پروژهی @arv/structs یه پیادهسازی از پروپوزال structs در TC39 (کمیتهای که استاندارد جاوااسکریپت رو تعیین میکنه) هست. این پروپوزال الان توی Stage 2 قرار داره و این پروژه بر اساس پیشنویس دسامبر ۲۰۲۴ ساخته شده. چیزهایی که اضافه میکنه: struct، shared struct، SharedArray، Atomics.Mutex و Atomics.Condition.
ایدهی اصلی shared structه، یعنی شیءای که وقتی با postMessage به یه Worker میفرستیش، کپی نمیشه و هر دو طرف دقیقاً همون شیء رو میبینن. برای اینکه دو thread همزمان یه فیلد رو خراب نکنن، یه قفل (mutex) هم کنارش میذاری. این نمونه از خود مقالهست:
shared struct Counter {
count = 0;
lock = new Atomics.Mutex();
}
const counter = new Counter();
worker.postMessage(counter); // the same object in the worker, not a copyبعد از این، هر agent میتونه با using _ = Atomics.Mutex.lock قفل رو بگیره و count رو زیاد کنه. قفل با تموم شدن بلاک خودش آزاد میشه، یعنی دیگه لازم نیست دستی unlock کنی.
پروژه دو بخش داره: یه runtime که الگوریتمهای spec رو دنبال میکنه و یه کامپایلر برای سینتکس جدید. کامپایلر structهای معمولی رو به کلاس تبدیل میکنه و shared structها رو به Proxyهایی روی یه SharedArrayBuffer واحد که نقش heap رو داره. قفلها به سبک futex (یعنی انتظار مستقیم روی یه خونهی حافظه) روی کلمههای همین heap ساخته شدن. توی TypeScript، کامپایلر از تایپها کمک میگیره تا دسترسی به فیلدهای shared struct مستقیم بشه.
Atomics.Condition متدهای wait، waitFor (با timeout و شرط) و notify داره، load و store و compareExchange روی فیلدهای struct کار میکنن و Reflect.canBeShared هم اضافه شده. با import کردن @arv/structs همهی اینها به صورت global نصب میشن. پروژه هنوز تجربیه، از دل پروژهی بزرگتر arv/threads در اومده و قصدش اینه که تا جایی که جاوااسکریپت اجازه میده به spec نزدیک بمونه. یه playground هم داره که کد کامپایلشده رو کنار کد اصلی نشون میده.
نکات کلیدی:
- بر اساس پروپوزال structs در Stage 2، پیشنویس دسامبر ۲۰۲۴
- shared struct بین Workerها کپی نمیشه و همون شیء به اشتراک گذاشته میشه
- shared structها روی یه SharedArrayBuffer واحد با Proxy پیاده شدن
- Atomics.Mutex با using کار میکنه و قفل خودکار آزاد میشه
- وضعیت پروژه تجربیه و یه playground آنلاین داره




