آرگومانهای ثابت جنریک در Rust مرز میان نوع و مقدار را بازتر میکنند
طراحی جدید Rust چند قابلیت آزمایشی را برای استفاده از پارامترهای جنریک در آرگومانهای ثابت گرد هم میآورد. نتیجه، امکان ساخت آرایهها و دادههای نوعمحورِ بیانگرتر است؛ اما نحو، قواعد برابری و وضعیت کامپایلر هنوز در حال تغییرند.

جنریکهای ثابت Rust وارد یک طراحی آزمایشی گستردهتر میشوند. گروه پروژهٔ Const Generics در مطلبی که ۲ اکتبر منتشر شد، Generic Const Arguments یا GCA را توضیح داد؛ خانوادهای از قابلیتها که قرار است جای آزمایش قدیمی و طولانیمدت generic_const_exprs را بگیرد.
مسئلهٔ عملی آشناست: Rust پایدار میتواند از پارامتری مانند N یا یک عبارت کاملاً مشخص استفاده کند، اما بهطور کلی نمیتواند مقادیری مانند [u8; N + 1] یا [u8; T::NUM_BYTES] را در سطح نوع بیان کند. این محدودیت دامنهٔ انتزاعهای با اندازهٔ ثابت را کم کرده و برخی کتابخانهها را به سمت crateهای اعدادِ نوعمحور سوق داده است.
GCA با صریحکردن دستهٔ عبارتهای مجاز به این مسئله نزدیک میشود. قابلیت آزمایشی gca_adts اجازه میدهد آرایهها، tupleها، structها و مقدارهای enum که پارامتر جنریک دارند، از مسیر gca!(...) بهعنوان آرگومان ثابت عبور کنند. نمونهٔ ساده، آرگومان ثابتی مانند gca!([N, 12]) است که در آن N خودش جنریک است. این طراحی برای حالتهای غیرمستقیمتر، از جمله ثابتهای وابسته و ثابتهای جنریک، مسیرهای مربوط به آیتمهای ثابت را نیز معرفی میکند.
این صریحبودن فقط ترجیح نحوی نیست؛ تصمیمی دربارهٔ ایمنی و سازگاری است. گروه پروژه میگوید آرگومانهای gca!(...) قواعدی متفاوت از آرگومانهای ثابت معمولی دارند: میتوانند به پارامترهای جنریک ارجاع دهند، اما فعلاً شکلهای کمتری از عبارتها را میپذیرند. برای نمونه، عملگرهای حسابی و فراخوانی تابع مستقیماً داخل این macro پذیرفته نمیشوند. قابلیتهای آزمایشی دیگر میتوانند چنین عبارتهایی را از طریق آیتمهای ثابت وارد کنند.
سختترین مسئله، برابری است. وقتی یک مقدار وارد یک نوع میشود، کامپایلر باید تشخیص دهد چه زمانی دو عبارت ثابت یک نوع یکسان را توصیف میکنند. issue پیگیری فعلی توضیح میدهد که GCA، مگر آنکه ارزیابی ثابت نتیجه را مشخص کند، به برابری تعریفی تکیه دارد. همین issue پرسشهای حلنشدهای را دربارهٔ مرز میان برابری شفاف و استدلال غنیتر آینده، مانند تشخیص همارزیهای ریاضی، فهرست میکند.
این موضوع برای کدنویسی سیستمی مهم است. کتابخانهای که عرض بستهها، چیدمان پروتکل یا نمایش سریالشده را در نوعها کدگذاری میکند، در آینده شاید بتواند بخش بیشتری از ناورداییها را بدون تکرار محاسبات در کد زمان اجرا بیان کند. اما APIهای عمومی به بازبینی دقیق نیاز دارند: تغییر شفاف یا مبهمبودن یک آیتم ثابت میتواند بر توانایی کامپایلر برای اثبات برابری نوعها اثر بگذارد.
پیام کوتاهمدت برای توسعهدهندگان Rust این است: آزمایش کنید، اما به آن وابسته نشوید. GCA همچنان قابلیت آزمایشی nightly است و قابلیت stable Rust محسوب نمیشود؛ issue پیگیری نیز هنوز باز است و کارهای پیادهسازی، مستندسازی، قالببندی و تثبیت را در ادامهٔ مسیر قرار داده است. گروه پروژه همچنین پذیرفته که نحو آشکار gca!(...) از نظر تجربهٔ کاربری مشکلساز است و فعلاً استفاده از گزینههای بدون macro را توصیه نمیکند.
برای نگهدارندگان APIهای جنریک با اندازهٔ ثابت، آزمون مناسب کوچک است: feature gateهای nightly را در یک شاخهٔ جدا امتحان کنید، خطاهای برابری نوع را بررسی کنید و یک مسیر سازگار با stable نگه دارید. GCA شاید به پایهای تمیزتر برای انتزاعهای متکی بر const تبدیل شود، اما مهمترین دستاورد امروز آن روشنترکردن مرزی است که تعیین میکند سیستم نوع Rust کدام مقدارهای زمان کامپایل را مجاز است درک کند.
خبرخوان را در ایمیل بگیرید
هر سیگنال تازه، مستقیم از خط تولید. بدون مزاحمت، لغو عضویت در هر زمان.


