نمای کلی اجرایی و اهمیت معماری
نسخه ۱.۹۹.۰ زبان Rust یک نقطه عطف مهم در تکامل مداوم این زبان است و شکاف میان برنامهنویسی سیستمهای سطح پایین و قابلیت همکاری یکپارچه با اکوسیستمهای مبتنی بر C را پر میکند. از آنجا که معماری نرمافزارهای مدرن روزبهروز بیشتر نیازمند انتزاعات با هزینه صفر به همراه تضمینهای دقیق ایمنی حافظه است، تیم هسته Rust همچنان به بهبود قابلیتهایی ادامه میدهد که ادغام ایمن سیستمها را تسهیل میکنند. این نسخه قابلیتهای قدرتمند جدیدی را معرفی میکند که به توسعهدهندگان اجازه میدهد توابع متغیرة C-ABI را مستقیماً در Rust بنویسند؛ قابلیتی که پیشتر به فرایندهای خارجی مانند libc::printf محدود بود. با آوردن این قابلیت به پایگاههای کد بومی Rust، این زبان اصطکاک سنتی مرتبط با تعاریف توابع میانزبان و سازگاری ABI در سطح کامپایلر را کاهش میدهد.
فراتر از بهبودهای FFI، نسخه ۱.۹۹.۰ به شدت بر دروننگری طرحبندی حافظه سطح پایین و ایمنی بهینهسازی تمرکز دارد. پایدارسازی توابع طرحبندی اشارهگر خام — یعنی Layout::for_value_raw، mem::size_of_val_raw و mem::align_of_val_raw — کنترل و دید دقیق و کاملی نسبت به انواع با اندازه پویا (DST) و بخشهای حافظه خام را در اختیار توسعهدهندگان قرار میدهد. این موارد با بهروزرسانیهای حیاتی مستندات درباره Box::leak همراه شدهاند تا بهطور فعال توسعهدهندگان را از الگوهای ضدکاربردی (anti-pattern) که با پایدارسازیهای آتی تخصیصدهندههای سفارشی تداخل دارند، دور کنند. در مجموع، این بهبودها جایگاه معماری Rust را به عنوان یک زبان قابل پیشبینی و با عملکرد بالا تحکیم میکنند که قادر به مدیریت محدودیتهای پیچیده مدیریت حافظه بدون قربانی کردن ایمنی است.
بهبودهای اصلی و ارگونومی توسعهدهنده
ویژگی برجسته نسخه ۱.۹۹.۰ پایدارسازی تعریف توابع متغیرة C-ABI با استفاده از هر دو ABI نوع «C» و «C-unwind» است. توسعهدهندگان اکنون میتوانند توابعی را که لیست آرگومان متغیر (...) میپذیرند مستقیماً در Rust پیادهسازی کنند و از نوع VaList بهره ببرند که در تمامی هدفهای پشتیبانیشده کاملاً با va_list در زبان C سازگار است. استخراج آرگومانها به شدت توسط ویژگی (trait) تازهپایدارشده VaArgSafe محافظت میشود و تضمین میکند که فقط انواعی که الزامات ایمنی را برآورده میکنند میتوانند از لیست متغیر خوانده شوند. این امر پیادهسازی پوششها (wrappers)، افزونهها و زمانهای اجرای تعبیهشدهای را که به شدت با کتابخانههای قدیمی C ارتباط دارند، به طور چشمگیری ساده میکند.
علاوه بر توابع متغیر، نسخه ۱.۹۹.۰ ارگونومی را در مجموعههای استاندارد و دستکاریهای بردار (vector) بهبود میبخشد. پایدارسازی Vec::into_parts و Vec::from_parts کنترل سطح پایینی بر روی بافرهای برداری، ظرفیتهای اشارهگر و طولها فراهم میکند که بازتابدهنده پرایمتیوهای مشابه موجود در مدیریت اشارهگر خام است. علاوه بر این، گنجاندن VecDeque::retain_back عملیات فیلتر کردن بکاند را برای صفهای دوطرفه بهینهسازی میکند. اضافات کتابخانه استاندارد همچنین پیادهسازیهای IntoIterator را برای آرایههای باکسشده (Box<[T; N]>)، از جمله ارجاعها و ارجاعهای قابل تغییر، به همراه دارد و الگوهای تکرار رایج روی تخصیصهای پشته با اندازه ثابت را هموار میسازد.
ماتریس مقایسه معماری
| ویژگی / معیار | مبنای پایدار قبلی | نسخه ۱.۹۹.۰ Rust | تأثیر معماری |
|---|---|---|---|
| تعریف متغیرة C-ABI | فقط فراخوانی خارجی (extern "C") |
پشتیبانی از تعریف بومی از طریق ... |
امکان نوشتن بومی کنترلکنندههای متغیر و پوششهای سازگار با C. |
| تحلیل طرحبندی اشارهگر خام | محدود به انواع Sized / پشتیبانی جزئی از DST |
پایدارسازی کامل از طریق size_of_val_raw، align_of_val_raw، Layout::for_value_raw |
دروننگری ایمن انواع پویا و طرحبندیهای حافظه با اندازه نامشخص. |
| راهنمای نشت حافظه | الگوهای استاندارد Box::leak |
منسوخ شدن الگوهای رفتوبرگشتی لغو نشت (unleaking) | از تداخلهای بهینهسازی با تخصیصدهندگان سفارشی آینده جلوگیری میکند. |
| دستکاری حافظه برداری | انتزاعات ناایمن سفارشی دستی | توابع پایدارشده Vec::into_parts و Vec::from_parts |
استانداردسازی عبور از مرز ناایمن به ایمن برای بردارهای پشته. |
تغییرات ساختارشکن و هشدارهای مهاجرت
نسخه ۱.۹۹.۰ در سطح سینتکس زبان کاملاً با نسخههای پایدار قبلی سازگار است؛ پایگاههای کد موجود بدون تغییر در سینتکس کامپایل خواهند شد. با این حال، این نسخه تغییرات معنایی و مستنداتی حیاتی را معرفی میکند، بهویژه در پیرامون آزادسازی حافظه پس از نشت. پایگاههای کدی که پیشتر عملیات رفتوبرگشتی «لغو نشت» (تخصیص مجدد یا آزادسازی حافظهای که قبلاً از طریق Box::leak نشت پیدا کرده بود) را انجام میدادند، اکنون بهشدت از انجام این کار منع میشوند. تیم هسته مستندات خود را بهروزرسانی کرده است تا برای سناریوهایی که نیاز به بازسازی دستی اشارهگر دارند، استفاده از Box::into_raw یا Box::into_non_null به همراه Box::from_raw یا Box::from_non_null را توصیه کند.
عدم تنظیم این الگوها میتواند هنگام کامپایل کردن با تکرارهای آینده کامپایلر و پایدارسازیهای آتی تخصیصدهنده سفارشی، منجر به رفتار تعریفنشده (undefined behavior) یا پسرفتهای بهینهسازی شود. توسعهدهندگان باید پایگاههای کدی را که از Box::leak یا توابع نشت کتابخانه استاندارد مرتبط استفاده میکنند، ممیزی نمایند تا از تطابق صحیح با توصیفات بهروزرسانیشده مدیریت چرخه عمر اطمینان حاصل کنند.
راهنمای گامبهگام ارتقا
گام ۱: بهروزرسانی زنجیره ابزار از طریق Rustup
برای ارتقای محیط توسعه خود به نسخه ۱.۹۹.۰ زبان Rust، دستور زیر را در ترمینال خود اجرا کنید:
$ rustup update stable
گام ۲: بررسی پیکربندی پروژه
مطمئن شوید که فایل Cargo.toml شما کانال انتشار پایدار را هدف قرار داده یا حداقل نسخه مورد نیاز را مشخص میکند:
[package]
name = "my_project"
version = "0.1.0"
edition = "2021"
گام ۳: بازسازی الگوهای ضد نشت
موارد استفاده از Box::leak را در پایگاه کد خود مرور کنید. اگر معماری شما نیازمند تبدیل یک باکس به یک اشارهگر خام و سپس بازگرداندن آن به یک ساختار مالک است، از الگوی leak فاصله بگیرید و به سمت مدیریت صریح اشارهگر خام حرکت کنید:
// الگوی توصیهشده با استفاده از اشارهگرهای خام به جای الگوهای رفتوبرگشتی leak/unleak
let boxed = Box::new(42);
let raw_ptr: *mut
