نمای کلی و اهمیت معماری
انتشار Prisma v8.0.0-rc.17 یک نقطه عطف اساسی در چرخه حیات موتور تجزیهکننده زبان طرحواره پریزما (PSL) است که به عنوان اولین گام اجرایی برای پروژه مورد انتظار «ترکیبکنندههای PSL» عمل میکند. با افزایش پیمانهای شدن طرحوارههای پایگاه داده، فایلهای طرحواره یکپارچه به یک مدل نویسندگی منعطفتر و قابلترکیب نیاز دارند. این نسخه اساساً نحوه مصرف اعضای اعلان—مانند ورودیهای بلوک و ویژگیها—در سراسر خط لوله کامپایل و ابزارهای زبانی را تغییر میدهد. پریزما با جداسازی مصرفکنندگان از پیمایش مستقیم گرههای نحوی (syntax-node)، زیرساخت معماری لازم برای تزریق، ادغام و ارزیابی ترکیبکنندهها را به صورت یکپارچه و بدون شکستن مفسرهای پاییندستی فراهم میکند.
در قلب این اصلاح معماری، جداسازی دقیق حوزههای وظایف در جدول نمادها قرار دارد. پیش از نسخه v8.0.0-rc.17، نمادهای بلوک عمومی—شامل enumها، بلوکهای انتخاب سیاست و بلوکهای توسعه سفارشی—تنها فرادادههای ساختاری مانند نامها، کلمات کلیدی و گرههای نحوی خام را حمل میکردند. در نتیجه، هر مصرفکنندهای در ادامه مسیر، از مفسرهای SQL مخصوص پایگاه داده گرفته تا ارائهدهنده تغییر نام (rename provider) سرور زبان، مجبور بود مستقیماً ورودیها و ویژگیها را از درخت نحو زیرین استخراج کند. این نسخه حل اعضا را در داخل buildSymbolTable متمرکز میکند و آن را به تنها منبع معتبر برای ساختارهای بلوکی تبدیل مینماید. پریزما با مجبور کردن مصرفکنندگان به خواندن اعضای اعلان صرفاً از طریق نماد حلشده (به جای گره نحوی)، تضمین میکند که هرگونه تزریق ترکیبکننده در آینده، به طور یکنواخت در تمام مراحل کامپایل منتشر شود بدون اینکه نیاز به بازنویسی موضعی باشد.
بهبودهای هسته و ارگونومی توسعهدهنده
دستاورد مهندسی اصلی در v8.0.0-rc.17، تقویت رابط BlockSymbol است که اکنون به صورت بومی آرایههای entries و attributes را که دقیقاً به ترتیب منبع در طول مرحله ساخت اولیه نماد پر شدهاند، در معرض دید قرار میدهد. نکته حیاتی این است که entries به عنوان یک لیست مرتب و نه یک رکورد کلید-مقدار یکتا پیادهسازی شده است. این تصمیم ساختاری، بلوکهای پیشرفته با حالت نگاشت (map-mode) را که صراحتاً اجازه تکرار کلیدها را میدهند، پوشش داده و قصد توسعهدهنده و ترتیب معنایی را برای تمام مفسرهای AST پاییندستی حفظ میکند. علاوه بر این، تمام ۲۳ بخش تولیدی شامل بایندرها، مفسرهای مشخصات بلوک، بررسیکنندههای enum و قابلیتهای سرور زبان برای استفاده از این رکوردهای نماد مرکزی بازنویسی شدهاند.
از منظر ارگونومی توسعهدهنده و تمیزی کد، این نسخه جفتشدگیهای پنهان را حذف کرده و منطق شکننده تطبیق ایندکس را از بین میبرد. در نسخههای قبلی، روالهای پیچیدهای مانند bindAttributes و حلقههای ویژگی مدل در بسته قرارداد SQL مجبور بودند متدهای گره نحوی و لیستهای ویژگیهای حلشده را به صورت دستی و ایندکس به ایندکس بررسی کنند. Prisma v8.0.0-rc.17 این الگو را با مرتبط کردن مستقیم گرههای نحوی با ساختارهای ویژگی حلشده مربوطه ساده میکند. این تغییر، کدهای محافظتی زائد را حذف کرده و همترازی ساختاری را تضمین میکند. علاوه بر این، عملیات پیمایش AST که مستقل از تولید نماد هستند—مانند برجستهسازی نحو، تکمیل خودکار و قالببندی کد—دستنخورده باقی میمانند تا حداکثر کارایی در مسیرهای بحرانی که سربار حل نماد غیرضروری است، حفظ شود.
ماتریس مقایسه معماری
| بعد معماری | مبنای قبلی (قبل از v8.0.0-rc.17) | نسخه Prisma v8.0.0-rc.17 | تأثیر معماری |
|---|---|---|---|
| حل اعضا | غیرمتمرکز (مصرفکنندگان node.entries() را تجزیه میکنند) |
متمرکز (buildSymbolTable یک بار محاسبه میکند) |
تنها منبع حقیقت؛ جلوگیری از واگرایی تجزیه در سرویسها. |
| APIهای جدول نماد | BlockSymbol فقط نام، کلمه کلیدی و گره را نمایش میدهد |
BlockSymbol ورودیها و ویژگیهای مرتبشده را نمایش میدهد |
امکان نقاط اتصال تمیز و مقیاسپذیر برای ترکیبکنندههای PSL آینده. |
| حافظه و تأخیر | پیمایشهای تکراری درخت و جفتسازی ایندکس زائد | جستجوی O(1) نماد با آرایههای پیشمحاسبهشده | کاهش سربار تخصیص حافظه در مراحل کامپایل افزایشی. |
| پشتیبانی حالت نگاشت | تجزیه کلید تکهتکه در مفسرهای مختلف | نمایش لیست استاندارد شده با حفظ کلیدهای تکراری | تضمین حفظ دقیق ترتیب منبع و نمایش صحیح طرحواره. |
تغییرات مخرب و نکات مهاجرت
نسخه Prisma v8.0.0-rc.17 مرزهای دقیق API داخلی را در مورد نحوه تعامل تجزیهکنندههای سفارشی PSL و افزونههای سرور زبان با اعلانهای بلوک معرفی میکند. در حالی که نحو طرحواره پریزما و خروجیهای تولید کلاینت کاملاً با نسخههای قبلی سازگار باقی میمانند، مصرفکنندگان داخلی و نویسندگان پلاگین که مستقیماً با بستههای داخلی psl-parser تعامل دارند، باید پیادهسازیهای خود را بهروزرسانی کنند. بهطور خاص، دسترسی به ویژگیهای اعضا و ورودیهای بلوک از طریق symbol.node.entries() یا symbol.node.attributes() منسوخ شده و از ارزیابیهای AST داخلی جدا شده است.
توسعهدهندگانی که ابزارهای سفارشی یا افزونههایی را نگهداری میکنند که بسته AST پریزما را پیمایش میکنند، باید کدهای خود را بازبینی کنند تا مطمئن شوند که مستقیماً BlockSymbol.entries و BlockSymbol.attributes را پرسوجو میکنند. عدم انطباق منطق پیمایش داخلی با پارادایم جدیدِ «نماد-محور»، باعث میشود پس از فعال شدن ترکیبکنندهها توسط کامپایلر، اعضای ساختاری گم شوند. علاوه بر این، مجموعههای تست داخلی که از سازندگان نماد ساختگی (mock) سفارشی استفاده میکنند، باید اطمینان حاصل کنند که تعاریف BlockSymbol لیستهای ورودی و ویژگی پرشده را به ترتیب منبع به درستی ارائه میدهند.
راهنمای گامبهگام ارتقاء
ارتقاء به Prisma v8.0.0-rc.17 برای توسعهدهندگان استاندارد برنامه ساده است و نیازی به بازنویسی دستی طرحواره ندارد. با این حال، نویسندگان کتابخانه و مشارکتکنندگان داخلی که روی افزونههای سفارشی PSL کار میکنند، باید مراحل مهاجرت زیر را انجام دهند:
- بازبینی پیمایشهای AST: در کدهای خود به دنبال فراخوانیهای مستقیم استخراجکنندههای عضو گره نحوی بگردید:
// الگوی منسوخ for (const entry of block.node.entries()) { ... } - مهاجرت به دسترسی نماد-محور: منطق پیمایش خود را برای خواندن مستقیم اعضا از ساختار نماد معتبر بازنویسی کنید:
// الگوی پیشنهادی (v8.0.0-rc.17 به بعد) for (const entry of block.entries) { ... } - تأیید انطباق نوع و اجرای مجموعههای تست: اعتبارسنجیهای محلی بسته و مجموعههای تست خود را برای تأیید سلامت جدول نمادها اجرا کنید:
pnpm install pnpm --filter @internal/psl-parser test pnpm typecheck