ICP·Devآی‌سی‌پی‌·دِو
بازگشت به مقالات
راست۲ تیر ۱۴۰۵3 دقیقه مطالعه

طراحی مجدد Range بالاخره از راه رسید: نگاهی به آینده قابل کپی در Rust 1.96.0

نسخه 1.96.0 زبان راست رسماً منتشر شد و راهکاری انقلابی برای یکی از قدیمی‌ترین چالش‌های ارگونومیک این زبان، یعنی محدوده‌های غیرقابل کپی، ارائه کرد. در این مطلب بررسی می‌کنیم که چگونه پیاده‌سازی RFC 3550 در کنار ماکروهای تست جدید و لینک‌سازی سخت‌گیرانه WebAssembly، تجربه توسعه‌دهندگان راست را بهبود می‌بخشد.

نکات کلیدی

  • نسخه 1.96.0 زبان راست رسماً منتشر شد و راهکاری انقلابی برای یکی از قدیمی‌ترین چالش‌های ارگونومیک این زبان، یعنی محدوده‌های غیرقابل کپی، ارائه کرد
  • در این مطلب بررسی می‌کنیم که چگونه پیاده‌سازی RFC 3550 در کنار ماکروهای تست جدید و لینک‌سازی سخت‌گیرانه WebAssembly، تجربه توسعه‌دهندگان راست را بهبود می‌بخشد
اشتراک‌گذاری
طراحی مجدد Range بالاخره از راه رسید: نگاهی به آینده قابل کپی در Rust 1.96.0

طراحی مجدد Range بالاخره از راه رسید: نگاهی به آینده قابل کپی در Rust 1.96.0

تیم انتشار زبان راست (Rust) رسماً Rust 1.96.0 را منتشر کرده است که راهکاری بسیار منتظر برای یکی از قدیمی‌ترین تداخل‌های طراحی این زبان ارائه می‌دهد: انواع محدوده (range) غیرقابل کپی. در کنار این ارتقای ارگونومیک برجسته، نسخه جدید ویژگی‌های قدرتمندی همچون اعتبارسنجی‌های تستی (test assertions) کارآمدتر، امنیت حیاتی در لینک‌سازی WebAssembly و وصله‌های امنیتی را معرفی می‌کند.

بیایید نگاهی بیندازیم به آنچه این نسخه را به یک نقطه عطف بزرگ برای توسعه‌دهندگان راست (Rustaceans) تبدیل می‌کند.


چرا محدوده‌های قدیمی نمی‌توانستند Copy باشند؟

از دوران پیش از نسخه ۱.۰ راست، سینتکس محدوده‌ها مانند 0..10 انواعی (مانند std::ops::Range) را تولید می‌کرد که تریت Iterator را مستقیماً پیاده‌سازی می‌کردند. در برنامه‌نویسی سیستم، پیاده‌سازی هم‌زمان Iterator و Copy روی یک تایپ منفرد، یک ریسک بزرگ محسوب می‌شود؛ چرا که کپی کردن یک محدوده باعث تکثیر وضعیت پیمایش (iteration state) داخلی آن شده و منجر به باگ‌های زمان اجرای پنهان و گیج‌کننده می‌گردد.

در نتیجه، محدوده‌های راست هرگز Copy نبودند. توسعه‌دهندگانی که سعی داشتند محدوده‌ها را در ساختارهای سبک و قابل کپی ذخیره کنند، مجبور بودند آن‌ها را به متغیرهای شروع و پایان مجزا تقسیم کنند یا به صورت دستی شبیه‌سازی (clone) کنند؛ موضوعی که همواره باعث زحمت و اصطکاک در کدنویسی می‌شد.


ورود RFC 3550: جداسازی داده‌ها از پیمایش

نسخه 1.96.0 راست این مشکل را با پایدارسازی بخش کتابخانه‌ای RFC 3550 حل کرده و سه نوع جدید را در فضای نام core::range معرفی می‌کند:

  • core::range::Range
  • core::range::RangeFrom
  • core::range::RangeInclusive

برخلاف پیشینیان خود، این انواع جدید Iterator را مستقیماً پیاده‌سازی نمی‌کنند؛ بلکه در عوض IntoIterator را پیاده‌سازی می‌نمایند. با جداسازی داده‌های ایستا (static range data) از وضعیت پیمایش فعال، این انواع جدید می‌توانند با خیال راحت ویژگی Copy را پیاده‌سازی کنند.

نمودار مفهومی پیشرفته در مقایسه...

اگرچه سینتکس محدوده مانند 0..1 برای حفظ سازگاری عقب‌رو (backward compatibility) همچنان انواع قدیمی std::ops را تولید خواهد کرد، اما این زبان قرار است در نسخه ۲۰۲۷ راست (Rust 2027 Edition) سینتکس خود را به انواع جدید core::range انتقال دهد.


سایر به‌روزرسانی‌های برجسته در Rust 1.96.0

در حالی که محدوده‌های قابل کپی تمام توجهات را به خود جلب کرده‌اند، این نسخه شامل چندین بهبود دیگر در تجربه توسعه‌دهندگان است:

۱. تست‌های تمیزتر با assert_matches!

نوشتن تست‌های واحد (unit tests) برای اعتبارسنجی انطباق الگو (pattern matching) پیش از این نیازمند استفاده از سینتکس نامناسب assert!(matches!(value, Pattern)) بود. هنگامی که این ارزیابی‌ها با خطا مواجه می‌شدند، خطاهای panic غیرمفیدی صادر می‌کردند بدون اینکه مقدار واقعی را نمایش دهند.

ماکروهای جدیداً پایدارشده assert_matches! و debug_assert_matches! به‌طور خودکار فرمت مقدار ناموفق را پردازش کرده و یک نمایش Debug از آن را چاپ می‌کنند، که این امر چرخه بازخورد دیباگ را به شدت کوتاه‌تر می‌کند.

۲. لینک‌سازی ایمن‌تر WebAssembly

پیش از این، نمادهای تعریف‌نشده WebAssembly (Wasm) به‌طور بی‌صدا به عنوان ایمپورت‌هایی از ماژول پشتیبان "env" کامپایل می‌شدند. این امر اغلب پیکربندی‌های نادرست و حیاتی را تا زمان اجرا پنهان می‌کرد. نسخه 1.96.0 راست این رفتار پیش‌فرض را غیرفعال کرده است؛ اکنون نمادهای تعریف‌نشده باعث ایجاد یک خطای سخت در زمان لینک‌سازی (hard linker error) می‌شوند تا باگ‌های مربوط به سازگاری پلتفرم در زمان کامپایل شناسایی شوند.


ارتقا به Rust 1.96.0

برای دریافت آخرین بهبودهای کامپایلر، زنجیره ابزار محلی خود را با استفاده از rustup به‌روزرسانی کنید:

bash
rustup update stable

با فراهم شدن کارهای زیربنایی برای نسخه ۲۰۲۷، زبان راست همچنان ثابت می‌کند که حتی نقص‌های معماری ده ساله نیز می‌توانند به زیبایی حل شوند، بدون اینکه به تعهد پایداری زبان آسیبی وارد شود.

برچسب‌ها

#راست 1.96#زبان Rust#برنامه‌نویسی سیستم#توسعه نرم‌افزار

منابع و ارجاعات مستند

پیشنهاد مطالعه بعدی

خوشتان آمد؟ مقاله بعدی را بگیرید

در خبرنامه عضو شوید تا راهنمای بعدی در ایمیلتان باشد — بدون مزاحمت، لغو عضویت در هر زمان.