EN
→ بازگشت به خبرخوان
شمارهٔ ۰۲۷۱Rust۳ دقیقه۳ منبع

حل‌کنندهٔ جدید تریت در Rust وارد Nightly شد؛ بزرگ‌ترین آزمون سیستم نوع کامپایلر

Rust حل‌کنندهٔ نسل بعدی تریت را به‌صورت پیش‌فرض در کانال nightly فعال کرده است؛ گامی برای آزمون سازگاری گسترده پیش از پایدارسازی. این تغییر شیوهٔ اثبات قیود تریت و نرمال‌سازی نوع‌های وابسته در rustc را بازطراحی می‌کند و برای کتابخانه‌هایی با جنریک‌های پیشرفته مهم است.

اشتراک‌گذاری
راست (Rust)
حل‌کنندهٔ جدید تریت در Rust وارد Nightly شد؛ بزرگ‌ترین آزمون سیستم نوع کامپایلر
تصویر: تولید هوش مصنوعی

بزرگ‌ترین آزمایش کامپایلر Rust در سال‌های اخیر اکنون در اختیار کاربران nightly قرار گرفته است. از ۲۲ اوت ۲۰۲۶، حل‌کنندهٔ نسل بعدی تریت پس از نزدیک به چهار سال توسعه، به‌صورت پیش‌فرض در Rust nightly فعال شده است. تیم Rust می‌گوید این سامانه جایگزین بخش‌هایی از کامپایلر می‌شود که قیود where را اثبات می‌کنند، نوع‌های وابسته را نرمال‌سازی می‌کنند و وظایف مرتبط با سیستم نوع را انجام می‌دهند.

این تغییر یک قابلیت جدید سطح زبان نیست که توسعه‌دهندگان بتوانند آن را در stable فعال کنند. حل‌کنندهٔ جدید یک بازنویسی داخلی در rustc است و هدف فوری آن جمع‌آوری بازخورد واقعی از پروژه‌هاست: باگ‌های باقی‌مانده، تفاوت‌های استنتاج نوع، پیام‌های خطای ضعیف و مشکلات کارایی باید پیش از پایدارسازی آشکار شوند. هدف ۲۰۲۶ پروژه، پایدارسازی حل‌کنندهٔ سراسری و جایگزینی کامل پیاده‌سازی فعلی است.

چرا اهمیت دارد؟

حل تریت در زیربنای برنامه‌نویسی جنریک قرار دارد. کامپایلر با کمک آن تشخیص می‌دهد آیا یک نوع تریت مشخصی را پیاده‌سازی می‌کند، آیا یک نوع وابسته قابل نرمال‌سازی است و آیا مجموعه‌ای از قیود کافی است یا نه. راهنمای توسعهٔ کامپایلر Rust این عملیات را به‌صورت هدف‌های منطقی مانند Implemented، Normalize، WellFormed و رابطه‌های طول‌عمر Outlives توضیح می‌دهد. بنابراین بازنویسی این موتور اثبات می‌تواند رفتار کدی را تغییر دهد که ظاهراً ارتباطی با جزئیات داخلی کامپایلر ندارد.

نخستین دستاورد قابل مشاهده، مدیریت بهتر رابطه‌های دشوار نوعی است. اعلامیهٔ Rust به تغییرات مربوط به impl Trait در جایگاه بازگشت، قابلیت‌های آیندهٔ Type Alias impl Trait و Return Type Notation و نیز نوع‌های وابسته با رتبهٔ بالاتر اشاره می‌کند. تیم همچنین از بیش از ۲۰۰ مسئلهٔ شناخته‌شده می‌گوید که پیاده‌سازی جدید آن‌ها را برطرف کرده است. در نقشهٔ راه بلندمدت، قابلیت‌هایی قرار دارند که پایدارسازی آن‌ها با حل‌کنندهٔ قدیمی دشوار است؛ از جمله قیدهای پیش‌فرض ضمنی جدید.

هزینهٔ سازگاری واقعی است. مسئلهٔ رهگیری Rust تغییرات مورد انتظار در نوع‌های وابسته با رتبهٔ بالاتر، محاسبهٔ عمق بازگشت، چرخه‌های حل تریت، impl Trait در جایگاه بازگشت و عبارت‌های ثابت جنریک را فهرست می‌کند. بعضی crateها ممکن است اکنون کامپایل نشوند، زیرا حل‌کنندهٔ قدیمی به‌دلیل استنتاج نادرست یا ردیابی ناقص عمق، کدهایی را می‌پذیرفت. هشدار خود پروژه مهم است: کاربران nightly ممکن است ناخواسته به رفتاری وابسته شوند که با Rust stable یکسان نیست.

کارایی نیز بخشی از این آزمون است. تیم Rust می‌گوید حل‌کنندهٔ جدید در گذشته در برخی موارد کندی‌های درجه‌دو یا حتی نمایی داشته، هرچند کارهای اخیر بخش بزرگی از نقاط بحرانی را کاهش داده‌اند. در آزمایش روی ۲۰ هزار crateٔ برتر، کارایی تقریباً بیشتر crateها مشابه بوده است؛ در عین حال بعضی workloadهای سنگین از نظر تریت بهبود چشمگیری داشته‌اند. تیم در یک مقایسه می‌گوید DataFusion بیش از هشت برابر سریع‌تر کامپایل شده است. این‌ها اندازه‌گیری‌های پروژه هستند، نه تضمین یکسان برای همه؛ بنابراین نگه‌دارندگان باید گراف وابستگی خود را جداگانه بسنجند.

توسعه‌دهندگان Rust چه کنند؟

nightly را در یک مسیر جداگانهٔ CI آزمایش کنید و toolchain پایدار را جایگزین نکنید:

rustup update nightly

workspaceهای واقعی، به‌ویژه پروژه‌هایی با قیود پیچیدهٔ تریت، طول‌عمرهای رتبه‌بالا، نوع‌های وابسته، impl Trait یا ثابت‌های جنریک را کامپایل کنید. پیام‌های خطا و زمان ساخت را با stable مقایسه کنید و خطاهای تازه را در مسئلهٔ رهگیری پروژهٔ Rust گزارش دهید. تیم Rust مشخصاً درخواست گزارش خرابی، افت کارایی و پیام‌های خطای نامناسب کرده است.

این قابلیت فعلاً فقط برای nightly است و یک انتشار stable محسوب نمی‌شود. تیم همچنین هشدار می‌دهد که در زمان ارزیابی rollout، خرابی‌های عمدی، افت زمان کامپایل و مشکلات پیام‌های خطا همچنان ممکن است دیده شوند. اگر یک build از nightly مانع کار شد، راه فرار اعلام‌شده -Znext-solver=coherence است که می‌توان آن را از طریق RUSTFLAGS یا تنظیمات Cargo اعمال کرد.

نتیجهٔ عملی این نیست که «Rust یک‌شبه جنریک‌ها را تغییر داده است». داستان اصلی این است که عمیق‌ترین بازنویسی سیستم نوع کامپایلر برای آزمون اکوسیستم باز شده است. برای نویسندگان کتابخانه، افزودن nightly به CI اکنون راهی است برای یافتن مشکلات سازگاری پیش از پایدارسازی و اثرگذاری بر شکل حل‌کنندهٔ تریت در نسخهٔ stable آینده.

برچسب‌هاRustrustcحل‌کنندهٔ تریتکامپایلر
منابع مستند۳ مرجع
  1. [۰۱]Enabling the next-generation trait solver on nightlyblog.rust-lang.org
  2. [۰۲]Next-generation trait solver enabled on nightly · rust-lang/rust issue #160895github.com
  3. [۰۳]Goals and clauses · Rust Compiler Development Guiderustc-dev-guide.rust-lang.org
خواندنی بعدی

خبرخوان را در ایمیل بگیرید

هر سیگنال تازه، مستقیم از خط تولید. بدون مزاحمت، لغو عضویت در هر زمان.

خوراک RSS در دسترس · بدون هرزنامه