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

فراتر از افزایش بی‌رویه کریت‌ها: چگونه ماکروی جدید `cfg_select!` در راست ۱.۹۵ علیه تورم وابستگی‌ها اعلام جنگ می‌کند

انتشار راست ۱.۹۵.۰ با معرفی ماکروی داخلی `cfg_select!`، نیاز به کریت محبوب `cfg-if` را از بین برده و با افزایش بی‌رویه وابستگی‌ها مبارزه می‌کند. علاوه بر گارد تطبیق `if let` و به‌روزرسانی مرزهای تارگت، راست در حال برطرف کردن چالش‌های رایج مهندسی مستقیماً در هسته پایدار خود است.

نکات کلیدی

  • انتشار راست ۱.۹۵.۰ با معرفی ماکروی داخلی `cfg_select!`، نیاز به کریت محبوب `cfg-if` را از بین برده و با افزایش بی‌رویه وابستگی‌ها مبارزه می‌کند
  • علاوه بر گارد تطبیق `if let` و به‌روزرسانی مرزهای تارگت، راست در حال برطرف کردن چالش‌های رایج مهندسی مستقیماً در هسته پایدار خود است
اشتراک‌گذاری
فراتر از افزایش بی‌رویه کریت‌ها: چگونه ماکروی جدید `cfg_select!` در راست ۱.۹۵ علیه تورم وابستگی‌ها اعلام جنگ می‌کند

فراتر از افزایش بی‌رویه کریت‌ها: چگونه ماکروی جدید cfg_select! در راست ۱.۹۵ علیه تورم وابستگی‌ها اعلام جنگ می‌کند

در یک اکوسیستم برنامه‌نویسی بالغ، پیشرفت فقط به معنای افزودن ویژگی‌های جدید و براق نیست؛ بلکه به معنای کاهش دغدغه‌ها و مشکلات توسعه‌دهندگان است. با انتشار راست ۱.۹۵.۰، تیم راست ضربه‌ای مستقیم و عمل‌گرایانه به یکی از مداوم‌ترین مشکلات جامعه کاربری وارد کرده است: پراکندگی و افزایش بی‌رویه وابستگی‌ها.

در گذشته، برنامه‌نویسان راست (Rustaceans) که قصد داشتند نرم‌افزارهای چندسکویی بنویسند، مجبور بودند بین برج آشفته‌ای از ویژگی‌های متوالی #[cfg(...)] یا استفاده از کریت شخص ثالث cfg-if برای خوانا نگه‌داشتن کد، یکی را انتخاب کنند. شروع به کار ماکروی داخلی cfg_select! این معادله را به طور اساسی تغییر می‌دهد و نشان‌دهنده یک تغییر مسیر آرام از عادتِ «پناه بردن به کریت‌های خارجی» به سمت یک کتابخانه استاندارد مستقل‌تر و پایدارتر است.

مشکل: دیواری از ویژگی‌های تکه‌تکه‌شده #[cfg]

هنگام کامپایل کد برای چندین پلتفرم هدف (مانند لینوکس، ویندوز یا وب‌اسمبلی)، نوشتن مسیرهای پلتفرم ناسازگار با یکدیگر به شدت دشوار و زمخت است. قرار دادن چندین بلوک #[cfg] روی هم، کد را پراکنده کرده و هدف توسعه‌دهنده را تکه‌تکه‌ می‌کند:

rust
#[cfg(unix)]
fn get_shell() -> &'static str { "/bin/sh" }

#[cfg(windows)]
fn get_shell() -> &'static str { "cmd.exe" }

اگر فراموش کنید که یک حالت جایگزین (fallback) برای وب‌اسمبلی تعریف کنید، کامپایلر تا زمانی که کسی تلاش نکند پروژه را روی آن پلتفرم پشتیبانی‌نشده بیلد کند، به شما هشدار نخواهد داد. اگرچه کریت خارجی cfg-if این مشکل را به زیبایی حل کرد، اما اتکا به میکروکریت‌ها ریسک زنجیره تأمین را به همراه دارد و هزینه بررسی و ممیزی کد را افزایش می‌دهد.

ورود cfg_select!: تطبیق بومی در زمان کامپایل

با راست ۱.۹۵، کتابخانه استاندارد این قابلیت را درون خود ادغام کرده است. ماکروی جدید cfg_select! مانند یک بلوک match در زمان کامپایل روی گزاره‌های پیکربندی عمل می‌کند؛ آن‌ها را از بالا به پایین ارزیابی کرده و تنها اولین شاخه‌ای را که درست (true) ارزیابی شود، خروجی می‌دهد.

rust
let is_windows_str = cfg_select! {
    windows => "windows",
    _ => "not windows",
};

از آنجا که شاخه‌ها به صورت ساختاری به یکدیگر متصل هستند، پلتفرم‌های فراموش‌شده یا باگ‌های منطقی فوراً شناسایی می‌شوند. از همه بهتر، این ماکرو به تمیزی در جایگاه عبارت (expression) کار می‌کند و به شما اجازه می‌دهد متغیرهای خاص هر پلتفرم را به صورت پویا مقید کنید، بدون اینکه نیاز باشد کل تعاریف متغیرها را در بلوک‌های ویژگی جداگانه بپیچید.

یک اینفوگرافیک سه‌بعدی، مدرن و حرفه‌ای برای توضیح cfg_select

ساده‌سازی و هم‌سطح‌سازی کد با گاردهای تطبیق if let

راست ۱.۹۵ همچنین گاردهای if let را درون عبارات match معرفی می‌کند. با تکیه بر زنجیره‌های let که در راست ۱.۸۸ پایدار شدند، این ویژگی منطق تطبیق تو در تو و عمیق را به شدت ساده و هم‌سطح می‌کند.

به جای نوشتن دستورات تو در توی match برای تأیید یک نتیجه محاسباتی روی یک متغیر فعال، توسعه‌دهندگان اکنون می‌توانند بررسی‌های مبتنی بر الگو را در یک خط ترکیب کنند:

rust
match value {
    Some(x) if let Ok(y) = compute(x) => {
        // در اینجا هم `x` و هم `y` در محدوده دسترسی هستند!
        println!("Value: {}, Computation: {}", x, y);
    }
    _ => {}
}

محدودسازی سفارشی‌سازی‌های سطح پایین

برای امنیت بیشتر اکوسیستم، راست ۱.۹۵ همچنین پشتیبانی پایدار از مشخصات سفارشی JSON تارگت در rustc را حذف کرده است. با قرار دادن این قابلیت توسعه‌پذیری سطح پایین در پشت فلگ -Z unstable-options (که نیازمند ویژگی‌های نسخه nightly است)، تیم کامپایلر مرز مشخصی را پیرامون آنچه که راست کاملاً پایدار را تشکیل می‌دهد، ترسیم می‌کند.

با حذف افزایش بی‌رویه وابستگی‌ها در سطح کامپایلر و اعمال مرزهای سخت‌گیرانه برای پلتفرم‌ها، راست ۱.۹۵ تضمین می‌کند که نوشتن، بازبینی و اعتماد به نرم‌افزارهای ایمن و چندسکویی همچنان آسان باقی بماند.

برچسب‌ها

#راست ۱.۹۵#کامپایلر#برنامه‌نویسی#متن باز#توسعه نرم‌افزار

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

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

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

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