پروپوزال Structs: آبجکتهای با شکل ثابت و حافظهٔ مشترک در جاوااسکریپت
خلاصهٔ کاملتر
پروپوزال JavaScript Structs که Shu-yu Guo نوشته و الان تو Stage 2 کمیتهٔ TC39 هست، چهار تا قابلیت به زبون اضافه میکنه: struct معمولی، shared struct، و دو تا ابزار همگامسازی به اسم Atomics.Mutex و Atomics.Condition. به گفتهٔ نویسنده هدف دوتاست: باز کردن راه چندنخی با حافظهٔ مشترک (shared memory multithreading، یعنی چند ترد همزمان روی یه دادهٔ واحد کار کنن) تو جاوااسکریپت، و دادن یه جایگزین برای class که سرعت و قابلتحلیل بودن رو به انعطاف ترجیح میده.
struct معمولی شبیه class تعریف میشه ولی layoutش ثابته. یعنی نمونههاش sealed هستن، نمیشه بهشون پراپرتی جدید اضافه کرد و prototypeشون هم عوض نمیشه. همهٔ فیلدها از اول با undefined مقدار میگیرن، پس this تو constructor از همون خط اول قابل استفادهست. struct فقط میتونه از struct دیگه ارث ببره و متدهاش generic نیستن، یعنی اگه this یه نمونهٔ واقعی از همون struct نباشه خطا میده.
struct Box {
constructor(x) { this.x = x; }
x;
}
let box = new Box(0);
box.x = 42; // x is declared
assertThrows(() => { box.y = 8.8; }); // structs are sealedshared struct محدودیتهای بیشتری داره تا بشه بین agentها (مثلاً main thread و یه Worker) به اشتراک گذاشتش. prototypeش null هست، متد نمیتونه داشته باشه و فیلدهاش فقط میتونن مقدار primitive یا یه shared struct دیگه رو نگه دارن. این نمونهها با postMessage بدون کپی فرستاده میشن و هر دو طرف روی همون داده کار میکنن. با Reflect.canBeShared هم میشه چک کرد یه مقدار قابل اشتراک هست یا نه. یه SharedArray با طول ثابت هم هست که در واقع حالت خاصی از shared struct حساب میشه.
دسترسی به فیلدهای shared struct بهصورت پیشفرض unordered هست، یعنی ترتیب دیدن تغییرها بین تردها تضمین نمیشه. ولی هیچوقت tear نمیشه، یعنی یه خوندن همیشه دقیقاً یه نوشتن رو میبینه نه ترکیبی از چندتا. برای دسترسی با ترتیب کامل (sequentially consistent)، متدهای Atomics.load، store، exchange و compareExchange حالا struct و اسم فیلد رو هم قبول میکنن.
Atomics.Mutex یه قفل غیربازگشتی هست که خودش یه shared struct بدون فیلده. قفل فقط با یه UnlockToken باز میشه. این ایده از Rust اومده و جلوی اشتباههایی مثل دوبار باز کردن قفل رو میگیره. چون توکن Symbol.dispose داره، میشه با using نوشتش تا آخر بلاک خودکار آزاد بشه. نویسنده تأکید میکنه که این قابلیتها قدرتمند ولی سختاستفادهن و قرار نیست جای ابزارهای سطح بالاتر و امنتر رو بگیرن، بلکه یه قدم اول و یه راه فرار برای برنامهنویسهای حرفهای هستن.
نکات کلیدی:
- پروپوزال Structs الان تو Stage 2 کمیتهٔ TC39 هست.
- struct نمونههای sealed میسازه و فقط از struct دیگه ارث میبره.
- shared struct متد نداره، prototypeش null هست و فقط primitive یا shared struct نگه میداره.
- shared structها بدون کپی بین Workerها جابهجا میشن و فیلدهاشون هیچوقت tear نمیشن.
- Atomics.Mutex فقط با UnlockToken باز میشه و با using خودکار آزاد میشه.




